汇编语言中MOV和OFFSET指令的两个问题?请高手指教小弟
发布网友
发布时间:2022-04-25 22:56
我来回答
共3个回答
热心网友
时间:2022-05-03 03:01
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后面只能是标号或变量名。
热心网友
时间:2022-05-03 04:19
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
热心网友
时间:2022-05-03 05:54
offset汇编伪指令
mov
寄存器,offset
变量名
把变量名的地址传输到寄存器中去,在编译的时候完成