我正在使用MASM汇编程序。 让我们来看看这个简短的代码(来自我正在阅读的一本书):
.data
var1 BYTE 10h
.code
main proc
mov esi,OFFSET byteVal
mov al,[esi] ; AL = 10h
我并不完全理解byteVal如何转换为机器代码 - 我知道它是一个标识符,一个符号名称。据我了解,在运行时byteVal是值10h的内存地址,对吧? 但书中说这些说明都是一样的:
mov al var1
mov al,[var1]
我无法理解他们为什么这样做。我绝望了。
var1 =地址10h
[var1] = 10h
这不是真的吗? 这本书说方括号" dereference"变量,但它说这两个是相同的。
如果var1是内存中的位置,它与使用OFFSET var1之间的区别是什么? 我的意思是,偏移量是记忆中的位置,不是吗? 并且书中说:" OFFSET运算符返回变量从其封闭开始的距离 。段#&34; 那么为什么第一个变量的偏移量不为零,因为它是段中的第一个变量?我只是想弄清楚。可能我应该换书......
Thakns:)
答案 0 :(得分:2)
在MASM中(仅在那里!)mov al, var1
适用于var1
的内容。使用标签的名称"裸体"被称为"直接记忆操作数"。看看here(在页面中间)。如果您需要该标签的地址,则必须使用OFFSET
-Operator。
The operator []
具有特殊含义。我将括号中的表达式添加到括号前的表达式中。
mov al, [var1]
相当于
mov al, 0[var1]
相当于
mov al, 0 + var1
相当于
mov al, var1 + 0
相当于
mov al, var1
你不应该使用MASM中的[] - 操作员,如果你真的不需要它,因为它有一些副作用。