我正在使用 MASM 汇编器。
让我们看一下这段简短的代码(来自我读过的一本书):
.data
var1 BYTE 10h
.code
main proc
mov esi,OFFSET byteVal
mov al,[esi] ; AL = 10h
我不太明白 byteVal 是如何翻译成机器代码的 - 我知道它是一个标识符,一个符号名称。据我了解,在运行时 byteVal 是内存address值 10h,对吗?
但书上说这两个指令是相同的:
mov al var1
mov al,[var1]
我不明白他们为什么这样做。
var1 = 10h 的地址
[var1] = 10 小时
这不是真的吗?
书上说方括号“取消引用”变量,但它说这两个是相同的。
如果 var1 是内存中的位置,那么它和使用 OFFSET var1 有什么区别?
我的意思是,offset 是内存中的位置,不是吗?
书上说:“OFFSET 运算符返回变量与其封闭变量开头的距离
部分。”
为什么第一个变量的偏移量不为零,因为它是段中的第一个变量?我就是想不出来。或许我该换本书了……
在 MASM 中(而且只有那里!)mov al, var1
与content of var1
。使用“裸”标签的名称称为“直接内存操作数”。看MS MASM 6.0 程序员指南(滚动到第 3.2.3 节“直接内存操作数”) https://www.pcjs.org/pubs/pc/reference/microsoft/mspl13/masm/mpguide/。如果您需要该标签的地址,则必须使用OFFSET-操作员 https://msdn.microsoft.com/library/009k3eeh.aspx.
运营商[] https://msdn.microsoft.com/de-de/library/7kxw03s9.aspx有特殊的意义。我将括号之间的表达式添加到括号之前的表达式中。
mov al, [var1]
相当于
mov al, 0[var1]
相当于
mov al, 0 + var1
相当于
mov al, var1 + 0
相当于
mov al, var1
如果您确实不需要它,则不应在 MASM 中使用 [] 运算符,因为它有一些副作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)