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. VTK修炼之道20:图像基本操作_图像类型转换
  2. python爬大学生就业信息报告_Python程序员招聘市场简要报告
  3. 中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)
  4. basic和python_PythonBasic
  5. 解题报告 Diamonds
  6. php ztree异步加载数据格式,zTree异步加载简单demo
  7. 前后端怎么连接_如何搭建前后端分离的测试平台
  8. 仿照小米官网项目具体操作与细节
  9. 2012.4.19总结(一)
  10. 几款实用Chrome插件
  11. Python 集和篇
  12. 美团点评 2019校园招聘 后台开发方向
  13. 微信H5 用户调整微信字体 导致使用rem的页面错乱
  14. 安卓获取及监听手机网络状态
  15. android安全风险分析,Android安全检测报告,等保测评过不了,提示风险
  16. uniapp 安卓 跳转到系统浏览器_Android 实现浏览器跳转APP应用,网页也可以跳转APP...
  17. 【Python爬虫案例学习21】爬取某站上海租房图片
  18. 如何使用两台主机实现三个网段之间互通且三个网段均可联网
  19. linux有哪些高级语言编译器,程序语言,操作系统,编译器三者之间有何关系?...
  20. 文本表示(Text Representation)之词集模型(SOW)词袋模型(BOW)TF-IDF模型

热门文章

  1. 计算机一级考试模拟题
  2. MEGA训练自己的数据集-docker
  3. 2022好玩的便签推荐 2022好玩的便签APP下载
  4. 玩转基因组浏览器之展示RNA二级结构
  5. 换行与回车----\n与\enter的区别
  6. x-pack破解及安装
  7. 【RedisUtils工具类专题】Jackson2JsonRedisSerializer和GenericFastJsonRedisSerializer的对比分析
  8. python——字典生成工具
  9. wepy 小程序 echarts 搭配使用
  10. 在java给别人邮箱发邮件