vstart用法
如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段amov ax,1的偏移量

section amov ax,1mov ax,2a_label:mov ax,3
section bmov ax,4mov ax,5b_label:mov ax,6
dw  b_label         ;此时该位置的值是0x12,说明距离段a的距离是18个字节

然而很多时候为了需要,我需要获取b_label距离当前段起始位置(段b中mov ax,4)的偏移量,这个时候就需要加vstart=0,代码如下

section amov ax,1mov ax,2a_label:mov ax,3
section b vstart=0mov ax,4mov ax,5b_label:mov ax,6
dw  b_label         ;此时该位置的值是0x06,说明距离段b的距离是6个字节

上述代码是vstart=0,不过常用的也就是vstart=0,那如果是vstart=N呢?N表示顺着当前代码段向前推N个字节,然后从那个字节开始计算,比如vstart=0的时候,b_label=6,那么vstart=10,则b_label=16(十进制)

section.段名称.start
上文说如果一个段中出现了vstart,则该段内的标号都是相对于当前段的汇编地址,而不是相对于程序起始出的汇编地址,但是如何获得当前段的起始地址相对于程序起始处的汇编地址呢?使用nasm汇编语言的section.段名称.start写法即可,例如下面的代码,在程序起始的前4个字节存放的内容是程序起始位置到段ccc的长度(以字节为单位)

section header vstart=0main_segment   dd section.ccc.start
section aaa vstart=0mov ax,1mov ax,1mov ax,1mov ax,1
section bbb vstart=0times 10 dd 0xcccccccc
section ccc vstart=0mov ax,1mov ax,1

align用法

下面的代码,段b的代码是紧挨着段a的,因为```mov ax,1``占4个字节,所以段b从第5个字节开始

section amov ax,1    ;使用16进制查看器会发现占用位置0-3,前四个字节
section bmov ax,2   ;使用16进制查看器会发现B8 02 00从字节04开始(实际第5个)

上述的代码会出现问题,因为段b是从汇编地址0x0004开始的,所以该段中所有的内容,如果基于当前段为段地址,那么必定出错,因为要转换成逻辑地址,需要将该地址右移4位,这样就会把0x0004中的4给挪没了,这也正是段地址必须要16字节对齐的原因,所以为了让段b16字节对齐(低4bit都是0),所以有了align关键字,这是NASM编译器自带的

section amov ax,1    ;使用16进制查看器会发现占用位置0-3,前四个字节,与上述例子相同
section b align=16mov ax,2 ;使用16进制查看器会发现B8 02 00从字节10开始(实际第16个)

这样转换逻辑地址的时候,因为最右侧4bit是0,所以右移4位不会出问题

NASM汇编语言与计算机系统13-段的定义/vstart和align语法相关推荐

  1. NASM汇编语言与计算机系统13-段的定义vstart和align语法

    vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section amov ax,1mov ax,2a_l ...

  2. NASM汇编语言与计算机系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)

    本文涉及到的汇编指令mov,jmp,times(独有),dd(独有),dw (独有),$,$$ dd/dw times 10 dd 0 ;dd表示一个双字,在8086下占用4个字节 times 10 ...

  3. NASM汇编语言与计算机系统02-实模式-显存原理

    显卡以高频的刷新速度一直不停的扫描显存中的数据,将显存中的数据显示到屏幕上 显卡有两种模式 1.文本模式:为了方便叙述,本文的代码示例采用文本模式 2.图形模式 对于CPU来说,显存也是内存,显存的地 ...

  4. NASM汇编语言与计算机系统01-环境搭建

    使用的程序有4个,分别是 1.Nasm汇编编译器 2.Sublime文本工具(一会需要安装NASM插件) 3.VirtualBox虚拟机 4.Bochs虚拟机调试器(一个带有调试功能的虚拟机) 1.安 ...

  5. Intel8086处理器使用NASM汇编语言实现操作系统15-段的定义section/vstart和align语法

    vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section a ;NASM汇编中使用section关 ...

  6. NASM汇编语言与计算机系统04-实模式-屏幕显示不定长度的字符串(cmp/je)

    本示例遇到的新汇编指令cmp,je cmp正确写法 cmp eax,666 cmp eax,ebx cmp byte [123], 123 cmp错误写法 cmp 123,123 ;操作数不可以都是立 ...

  7. NASM汇编语言与计算机系统16-保护模式-全局描述符表GDT

    全局描述符表Global Descriptor Table 表中每个元素8个字节,每个元素表示一个段(代码段,数据段,栈段)的信息,且GDT在进入保护模式之前必须存在,所以它必须位于1MB以下(实模式 ...

  8. NASM汇编语言与计算机系统11-9号与0X16号中断显示键盘输入(int)

    本文的示例将显示从键盘上输入一个按键,屏幕上显示该按键的内容 0x09号中断:当从键盘上敲一个按键,会将按键的内容放到0x60端口,然后执行9号中断例程,由于9号中断例程已经被bios写好了,所以会直 ...

  9. NASM汇编语言与计算机系统09-8086实模式的内存分配图

    鉴于我打算写的内容是一个循序渐进的笔记,所以作为后续文章的铺垫,了解本文图中的内存分配是很重要的,虽然不需要背下来,但是也至少能说得出个大概 下一篇:0号中断(除法错误中断) 8086实模式下的内存分 ...

最新文章

  1. object.create()
  2. vue打包后axios返回html,vue项目封装axios并访问接口
  3. JS问题Uncaught ReferenceError:XXXX is not defined
  4. 怎样为ubuntu eclipse 添加 GBK字符集
  5. 深入掌握JMS(七):DeliveryMode例子
  6. 【Strurts框架】第一节Action-通配符
  7. 图解think php,图解ThinkPHP5框架(三):配置类Config.php源码解读
  8. 流媒体RTMP协议解析
  9. 苹果计算机单位换算,单位转换器 - 单位换算
  10. pgsql timestamp without time zone > character varying解决方案
  11. Unity的lookRotation和lookAt的区别理解,是什么意思。
  12. Linux学习笔记——1、Basic knowledge
  13. java界面添加mid音乐,使用jfugue来演奏mid音乐
  14. android手机 无电池开机,手机无法开机的6种解决方法
  15. spss基础-5.10
  16. [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现
  17. (三)Horizon 队列管理工具
  18. java算法:递归算法
  19. arm 处理器的堆栈操作
  20. Windows Server 2016 文件操作系统 跨区卷 镜像卷 RAID5卷 ISCSI设置

热门文章

  1. 全排列函数(next_permutation)
  2. 服务器返回的数据把标签转义为其它字符
  3. 学习笔记之sed用法
  4. yum用法及程序编译安装
  5. 计算机描绘的基因结构图,利用IBS软件画基因mRNA的结构图
  6. wordpress如何配置两个header。php_WordPress入门|WordPress建站详细流程
  7. linux脚本 let,通过shell 脚本查看服务器的时时流量
  8. java logfaction_Java8 下 重构log
  9. centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
  10. Jeecg-Boot 1.1 发布,基于 SpringBoot+Ant Design 的快速开发平台