汇编语言中MOV和OFFSET指令的两个问题?请高手指教小弟

2024-11-29 02:21:48
推荐回答(3个)
回答1:

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后面只能是标号或变量名。

回答2:

1、立即数不能直接传递给段寄存器,例:
xxx
dw
2010
....
mov
ds,xxx
;允许(xxx是变量)
....
mov
ds,2010
;不允许(2010是立即数)
;===============
2、LEA是计算机指令,在代码执行期它具有计算能力。而OFFSET是伪操作,它只在编译时简单地获取一个变量的地址,在代码执行期它没有计算能力。
例:
MOV
BX,OFFSET
str
;源代码
如果str的地址是2010,则编译后该行变为:
MOV
BX,2010
;执行代码
下面是允许的:
MOV
SI,OFFSET
STR
MOV
AX,[SI+2]
类似下面是不允许的(这就是“括号里的那段话的意思”):
MOV
SI,OFFSET
STR
+
DX

回答3:

offset汇编伪指令  
mov
寄存器,offset
变量名
把变量名的地址传输到寄存器中去,在编译的时候完成