例3.17
假设某数据段定义如下:
0000 DATA SEGMENT
0000 0040 TABLE DW 0040H
0002 3000 DW 3000H
0004 DATA ENDS
请指出下列指令的执行结果,并说明它们之间的区别。
① MOV BX, TABLE
② LEA BX, TABLE
③ MOV BX, OFFSET TABLE
答:第①条指令执行后,(BX)=0040H,
第②条指令执行后,(BX)=0000,
第③条指令执行后,(BX)=0000。
比较①②两条指令,第①条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。
比较②③两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。既然功能相同,它们之间还有什么区别呢?
首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。
其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX,
OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。
例3.18
对例3.17的数据定义,下列两条指令的执行结果是什么?
① LDS BX, TABLE
② LES BX, TABLE
答:LDS指令执行后,(BX)=0040H, (DS)=3000H
LES指令执行后,(BX)=0040H, (ES)=3000H