1.地址计数器$
汇编语言允许用户直接用$来引用地址计数器的值,例如指令:
JMP $+ 6
它的转向地址是JMP指令的首地址加上6。当$用在指令中时,它表示本条指令的第一个字节的地址。在这里,$+ 6必须是另一条指令的首地址。否则,汇编程序将指示出错信息。
当$用在伪指令的参数字段时,则和它用在指令中的情况不同,它所表示的是地址计数器的当前值。例如指令:
ARRAY DW 1, 2, $+ 4, 3, 4, $+ 4
假设汇编时ARRAY 分配的偏移地址为0074H,则汇编后,$+ 4所在的两个字单元:
(ARRAY+4)=0078+4=007CH
(ARRAY+0A)=007E+4=0082H
应当注意,ARRAY数组中的两个$+ 4得到的结果是不同的,这是由于$的值是在不断变化的缘故。当在指令中用到$时,它只代表该指令的首地址,而与$本身所在的字节无关。
2.EVEN伪指令
例如:
DATA_SEG SEGMENT
BYTE_DAT DB ?
EVEN
WORD_DAT DW 100 DUP (?)
DATA_SEG ENDS
一个字的地址最好从偶地址开始,所以对于字数组为了保证它从偶地址开始,可以在DW定义之前用EVEN伪指令来达到这一目的。
3. ALIGN伪指令
例如:
.
ALIGN 4
ARRAY DD 100 DUP (?)
ALIGN伪指令保证了双字数组ARRAY地址边界从4的倍数开始。
ALIGN伪指令是将当前偏移地址指针指向2的乘方的整数倍的地址,如果源地址指针以指向2的乘方的整数倍的地址,则不作调整;否则将指针加以一个数,使地址指针指向下一个2的乘方的整数倍的地址。
当然,ALIGN 2和EVEN是等价的。