指令中的点“·”是需要的。这类伪指令一般放在代码段中的第一条指令前即可。如不给出,则汇编程序认为其默认选择的是8086指令系统。
一、段定义伪指令
1、段定义伪指令
(1)断定义伪指令格式:
segment_name SEGMENT
...
segment_name ENDS
段地址一旦说明,该段内的指令、标号和变量都属于这个段。
(2)ASSUME伪指令格式:{目的:确定用户定义的段和哪个段寄存器相关联}
ASSUME register_name:segment_name…, register_name:segment_name
其中register_name为段寄存器名,必须是CS,DS,ES和SS。
segment_name必须是由段定义伪指令定义的段中的段名。
ASSUME伪指令只是把某个段分配给哪一个段寄存器,他并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。所以需要两条MOV指令完成这一操作。
二、程序开始和结束伪指令
表示源程序结束的伪操作的格式为:END [label]
其中标号label指示程序开始执行的起始地址。
如果是多个程序模块相连接,则只有主程序需要使用标号,其他子程序模块则只用END而不能指定标号。
三、数据定义与存储器单元分配伪指令
格式:[变量] 操作码 N个操作数 [;注释]
1、操作码字段
说明所用伪操作的助记符,说明所定义的数据类型
DB:定义字节,其后的每一个操作数都占一个字节(8位)[正放—一位]
DW:定义字,其后的每一个操作数都占一个字(16位,数据低位在低地址,数据高位在高地址)[反放—两位]
DD:定义双字,其后的每一个操作数都占2个字(32位)[反放—四位]
DF:定义6个字节的字,其后的每一个操作数都占48位
DQ:定义4个字,其后的每一个操作数都占4个字节(64位),可以来存放双精度浮点数
DT:定义10个字节,其后的每一个操作数都占10个字节,为压缩的BCD码
以上伪操作可以把其后跟着的数据存入指定的存储单元,形成初始化数据;或者只分配存储空间而不确定数值。
四、类型属性操作符
WORD PTR ;字类型
BYTE PTR ;字节类型
如果指令中不可避免地出现两个类型(长度)不匹配的操作数时,可以在指令中对该内存变量使用类型属性操作符指定访问类型。
访问类型的作用只是增加了一种访问方式。
五、THIS操作符和LABEL伪操作
可以使一个变量定义成不同的访问类型
1、THIS操作符:
格式:THIS type
2、LABEL伪操作符:
格式:name LABEL type
只是指定一个类型为type的操作数,使该操作数的地址与下一个存储单元地址相同。
type在这里是BYTE或WORD。
六、表达式赋值伪指令“EQU”和“=”
给表达式赋予一个常量或名字
格式:
Expression_name EQU Expression
Expression_name =Expression
必须是有效的操作数格式或有效的指令助记符。
如果有变量或标号等其他符号出现在表达式中,必须先定义这些符号才能引用。
EQU伪操作中的表达式名是不允许重复定义的。
七、汇编地址计数器$与定位伪指令
1、地址计数器$
目的:设置当前正在汇编的指令的偏移地址(为了按序存放程序中的数据变量和指令)
不是硬件构成,其实就是一个16位的变量。
表示的是地址计数器当前值。
如在指令中引用$,JMP $+8的转向地址是本条指令的首地址加上8。显然$+8必须是另一条指令的首地址,否则汇编程序将指示出错。
2、ORG伪操作
作用:设置当前地址计数器$的值
格式:ORG constant expression
如果常数表达式的值为n,则该操作指示下一个字节的存放地址为n。
3、EVEN伪操作
作用:使下一个变量或指令开始于偶数地址
对于16位的变量来说,其地址为偶数时,机器内部只用一次读写操作,如果地址为奇数时要二次读写操作。
4、ALIGN伪操作
作用:使下一个变量的地址从4的倍数开始,可以用来保证双字数组边界从4的倍数开始。
格式:ALIGN boundary(boundary必须是2的倍数)
八、基数控制伪指令
RADIX伪操作可以把默认的基数改变为2~16范围内的任何基数。
其格式为:.RADIX expression[表达式用来表示基数值(用十进制数表示)]
九、过程定义伪指令
格式:
procedure_name PROC Attribute
…
procedure_name ENDP
过程名(procedure_name)为标识符,起到标号作用,是子程序入口的符号地址。
属性(Attribute)是指类型属性,可以是NEAR或FAR。