汇编语言中MOV和OFFSET指令的两个问题?

(1)往段寄存器送段地址时要写成
MOV AX,DATA
MOV DS,AX
不能写成
MOV DS,DATA
这是为什么?有人说由于段寄存只能进行16位的读写,因此需要用ax来倒一下,还有人说是因为段寄存器不能用于立即数寻址,究竟哪个对呢?如果第二个对,那么段名DATA是立即数吗?还是因为别的原因?
(2)书上有道例题是
MOV BX,OFFSET STR ;STR是已经定义的变量
LEA SI,VAR ;VAR是已经定义的变量
MOV AH,[BX]
MOV AX,[SI+2]
后面有段解释说前两个指令功能相同,( 但OFFSET只能与简单的符号地址相连,而不能和诸如[SI+X]等复杂的地址表达式相连 ),因此,LEA指令在取得变量的偏移地址后以相对寻址方式访问其他存储单元方面是很有用的。
请问括号里的那段话是什么意思?
难道意思是 MOV SI,OFFSET STR
MOV AX,[SI+2]

是不对的吗?为什么?

解答:

1、从intel的指令代码集我们可以看到与段寄存器有关的有:
MOV mem,segreg
MOV segreg,mem
MOV serreg,reg
很显然,不能把立即数赋值给段寄存器。
DATA SEGMENT作为伪指令,在编译连接过程会被赋一个立即数的值。
2、
MOV SI,OFFSET STR
MOV AX,[SI+2]
这个是没错的。
LEA SI,STR与MOV SI,OFFSET STR最大区别在于OFFSET STR是一条伪指令,与SEG DATA之类相似,它在编译和连接过程被赋给一个值,你可以把它看成一个立即数,LEA SI,STR是把STR的内存指针赋给SI,你可以把它看成内存变量。另外,MOV SI,OFFSET STR是一条2字节立即寻址指令,LEA SI,STR是一条3字节内存寻址指令,后者虽然有比较灵活的寻址方式,但前者具有更小的容量和更快的执行速度,推荐尽可能使用MOV SI,OFFSET STR。当然,OFFSET后面只能是标号或变量名。


猜你喜欢

转载自blog.csdn.net/u011555996/article/details/80271500