NASM汇编语言与计算机系统13-段的定义/vstart和align语法
vstart用法
如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov 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语法相关推荐
- NASM汇编语言与计算机系统13-段的定义vstart和align语法
vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section amov ax,1mov ax,2a_l ...
- NASM汇编语言与计算机系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)
本文涉及到的汇编指令mov,jmp,times(独有),dd(独有),dw (独有),$,$$ dd/dw times 10 dd 0 ;dd表示一个双字,在8086下占用4个字节 times 10 ...
- NASM汇编语言与计算机系统02-实模式-显存原理
显卡以高频的刷新速度一直不停的扫描显存中的数据,将显存中的数据显示到屏幕上 显卡有两种模式 1.文本模式:为了方便叙述,本文的代码示例采用文本模式 2.图形模式 对于CPU来说,显存也是内存,显存的地 ...
- NASM汇编语言与计算机系统01-环境搭建
使用的程序有4个,分别是 1.Nasm汇编编译器 2.Sublime文本工具(一会需要安装NASM插件) 3.VirtualBox虚拟机 4.Bochs虚拟机调试器(一个带有调试功能的虚拟机) 1.安 ...
- Intel8086处理器使用NASM汇编语言实现操作系统15-段的定义section/vstart和align语法
vstart用法 如果一个程序有a,b两个段,那么如下的程序,最后2个字节存放的是b_label距离程序起始位置段a中mov ax,1的偏移量 section a ;NASM汇编中使用section关 ...
- NASM汇编语言与计算机系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
本示例遇到的新汇编指令cmp,je cmp正确写法 cmp eax,666 cmp eax,ebx cmp byte [123], 123 cmp错误写法 cmp 123,123 ;操作数不可以都是立 ...
- NASM汇编语言与计算机系统16-保护模式-全局描述符表GDT
全局描述符表Global Descriptor Table 表中每个元素8个字节,每个元素表示一个段(代码段,数据段,栈段)的信息,且GDT在进入保护模式之前必须存在,所以它必须位于1MB以下(实模式 ...
- NASM汇编语言与计算机系统11-9号与0X16号中断显示键盘输入(int)
本文的示例将显示从键盘上输入一个按键,屏幕上显示该按键的内容 0x09号中断:当从键盘上敲一个按键,会将按键的内容放到0x60端口,然后执行9号中断例程,由于9号中断例程已经被bios写好了,所以会直 ...
- NASM汇编语言与计算机系统09-8086实模式的内存分配图
鉴于我打算写的内容是一个循序渐进的笔记,所以作为后续文章的铺垫,了解本文图中的内存分配是很重要的,虽然不需要背下来,但是也至少能说得出个大概 下一篇:0号中断(除法错误中断) 8086实模式下的内存分 ...
最新文章
- object.create()
- vue打包后axios返回html,vue项目封装axios并访问接口
- JS问题Uncaught ReferenceError:XXXX is not defined
- 怎样为ubuntu eclipse 添加 GBK字符集
- 深入掌握JMS(七):DeliveryMode例子
- 【Strurts框架】第一节Action-通配符
- 图解think php,图解ThinkPHP5框架(三):配置类Config.php源码解读
- 流媒体RTMP协议解析
- 苹果计算机单位换算,单位转换器 - 单位换算
- pgsql timestamp without time zone > character varying解决方案
- Unity的lookRotation和lookAt的区别理解,是什么意思。
- Linux学习笔记——1、Basic knowledge
- java界面添加mid音乐,使用jfugue来演奏mid音乐
- android手机 无电池开机,手机无法开机的6种解决方法
- spss基础-5.10
- [转]最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现
- (三)Horizon 队列管理工具
- java算法:递归算法
- arm 处理器的堆栈操作
- Windows Server 2016 文件操作系统 跨区卷 镜像卷 RAID5卷 ISCSI设置
热门文章
- 全排列函数(next_permutation)
- 服务器返回的数据把标签转义为其它字符
- 学习笔记之sed用法
- yum用法及程序编译安装
- 计算机描绘的基因结构图,利用IBS软件画基因mRNA的结构图
- wordpress如何配置两个header。php_WordPress入门|WordPress建站详细流程
- linux脚本 let,通过shell 脚本查看服务器的时时流量
- java logfaction_Java8 下 重构log
- centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
- Jeecg-Boot 1.1 发布,基于 SpringBoot+Ant Design 的快速开发平台