对Assembly中的指针和值感到困惑

时间:2015-01-21 17:20:22

标签: assembly masm

我正在使用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:)

1 个答案:

答案 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中的[] - 操作员,如果你真的不需要它,因为它有一些副作用。

相关问题