汇编学习笔记——伪指令

本文详细介绍了汇编语言中的伪指令,包括段定义、结束标记、段关联标记、数据定义、标号等概念,并提供了丰富的示例,帮助读者理解如何在汇编程序中使用这些伪指令进行代码组织和数据管理。伪指令在编译过程中起到关键作用,例如段定义用于创建代码和数据段,结束标记指示程序结束,段关联标记用于关联段寄存器和段,数据定义允许预定义常量,标号则用于代码跳转等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

伪指令

段定义

结束标记

段关联标记

数据定义

标号

offset指令

seg指令

地址标号

数据标号

代码分段

程序标识

多文件系统

字符输入

重复定义

注释

重复汇编伪指令

伪指令汇总


 

伪指令

定义:没有对应机器码的指令,最终不被CPU所执行,而是由编译器执行的指令。编译器根据伪指令来进行相关的编译工作。

示例1:一段汇编程序中的伪指令示例

PS1:伪指令在debug中直接执行汇编代码是不可用的,但若要将汇编程序交由编译器执行,则是必要的。

PS2:其中结尾处的mov ax,4c00h与int 21h对任何汇编程序都是必要的,作用是在程序结束之后,将CPU的控制权交还给使它得以运行的程序(常为DOS系统)。类似C语言编程结尾时的return 0;(详见汇编学习笔记——汇编指令的int与iret指令部分以及汇编学习笔记——设计与执行的中断部分与BIOS与DOS系统部分)

 

段定义

定义:一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。格式为:段名 segment 表示段的开始;段名 ends 表示段的结束。

示例:完整的汇编程序

PS1:一个有意义的汇编程序中至少要有一个段,这个段用来存放代码,如上图中的code segment 至 code ends 便是程序中的代码段

 

结束标记

定义:汇编程序的结束标记,用于在编译器编译程序时告知其汇编程序在哪结束。标记记为:end (注意和段定义中的ends区分)

示例:完整的汇编程序

PS:一个可被编译器解读的汇编程序中必须包含end,如上图中的程序结尾处的end便是整个程序的结束标记。

 

段关联标记

定义:将CPU中的段寄存器与汇编程序中某一个用segment...ends定义的段进行关联的标记,格式:assume 段寄存器名:段名,段寄存器名:段名,...,段寄存器名:段名

示例:完整的汇编程序

PS:如上图中assume cs:code代表将名为code的程序段与代码段寄存器关联;ds:data代表将名为data的程序段与数据段寄存器关联;ss:stack代表将名为stack的程序段与栈段寄存器关联

 

数据定义

定义:可将程序中需要使用的常量提前定义于程序中,使用时通过代码段寄存器的段前缀(段前缀相关见汇编学习笔记——寻址与存储)直接调用。格式:dw idata,idata,...,idata 定义字型数据(define word);db idata,idata,...,idata 定义字节型数据(define byte);dd idata,idata,...,idata 定义双字型数据(define double-word)

示例1:编程计算0123H,0456H,0789H这三个数据的和,并将结果存入ax寄存器

PS1:如上图,用dw定义的三个字型数据将被存入cs:[0],cs:[2],cs:[4]指向的三块字单元中,可如第七行所示调用

PS2:如上图第八行,因每个字单元占用两个字节的的内存空间,因此偏移地址每次都必须+2

PS3:用以上方式定义数据时,会导致cs:[0]地址中的内容不再是代码而是数据,因此需要使用程序起始标号来指定代码区域的起始位置,避免系统错误的将数据解析为代码执行

示例2:通过定义空数据获取额外空间

PS:如上图所示,通过dw 0,0,....,0定义了一个32字节的数据空间,并将之作为临时的栈使用

 

标号

定义:写在某一代码段的,用于代表该段处的偏移地址的自定义字符串。常同各类跳转指令(如jmp/jcxz/loop)结合使用。

具体用法见以下offset指令、起始标号及汇编学习笔记——汇编指令的loop、jmp等部分

 

offset指令

定义:用于取得某标号的偏移地址的指令。格式:offset A 若A标号所在的偏移地址为000a,则offset A等价于立即数000a

示例1:使用offset获取代码段的偏移地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值