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

Confused about pointers and values in Assembly

我正在使用 MASM 汇编程序。 让我们看看这个简短的代码(来自我一直在读的一本书):

    .data
var1 BYTE 10h

.code
main proc
    mov esi,OFFSET byteVal
    mov al,[esi] ; AL = 10h

我不完全理解 byteVal 是如何翻译成机器码的——我知道它是一个标识符,一个符号名称。据我了解,在运行时byteVal是值10h的内存address,对吧? 但是书上说这两条指令是一样的:

mov al var1
mov al,[var1]

我不明白为什么他们也这样做。


var1 = 10h的地址

[var1] = 10h


这不是真的吗? 书上说方括号"dereference"是变量,居然说这两个是一样的

如果 var1 是内存中的位置,那么它与使用 OFFSET var1 有什么区别? 我的意思是,偏移量是内存中的位置,不是吗? 并且书上说:“OFFSET 运算符 returns 变量从其封闭开始的距离 部分。” 为什么第一个变量的偏移量不为零,因为它是段中的第一个变量?我就是想不通。也许我应该换本书...

在 MASM 中(并且仅在其中!)mov al, var1var1内容 一起工作。使用标签的名字"naked"被称为"Direct Memory Operand"。参见 MS MASM 6.0 Programmer’s Guide (Scroll to section 3.2.3, "Direct Memory Operands"). If you need the address of that label you have to use the OFFSET-Operator

The operator []有特殊的含义。我把括号中的表达式加到括号前的表达式中。

mov al, [var1]

相当于

mov al, 0[var1]

相当于

mov al, 0 + var1

相当于

mov al, var1 + 0

相当于

mov al, var1

你不应该在 MASM 中使用 []-operator,如果你真的不需要它,因为它有一些副作用。