对 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, var1
与 var1
的 内容 一起工作。使用标签的名字"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,如果你真的不需要它,因为它有一些副作用。
我正在使用 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, var1
与 var1
的 内容 一起工作。使用标签的名字"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,如果你真的不需要它,因为它有一些副作用。