目录
伪指令
定义:没有对应机器码的指令,最终不被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获取代码段的偏移地址