【问题标题】:Confused about pointers and values in Assembly对汇编中的指针和值感到困惑
【发布时间】:2015-01-21 17:20:21
【问题描述】:

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


这不是真的吗? 这本书说方括号“取消引用”变量,但它说这两个是相同的。

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

【问题讨论】:

  • 我很惊讶mov al, var1 真的被 MASM 接受了。按照惯例,mov esi, OFFSET var 用于加载偏移量(地址),或者mov al, [var1] 用于加载地址的内容。
  • @500-InternalServerError 感谢您的回答:) 我现在再次检查并使用 [] 而不是使用它们会获得相同的结果。我不明白为什么会这样,因为数据标签是数据本身的 address 。 =[还有一个问题:如果变量的名称是它的地址,为什么要使用OFFSET。我的意思是,变量是地址,所以OFFSET指令没用,不是吗?
  • 传统,可能。在 32 位平面模式下,偏移量和地址是可互换的,但在分段模式(例如 16 位 DOS)中则不能。
  • @500-InternalServerError 我仍然不明白为什么这两个移动指令会做同样的事情。正如我所看到的,第一条 mov 指令甚至不应该编译,因为地址是 32 位,而 al 只有 8 位……我还读到全局变量地址是在汇编期间分配的。怎么可能,因为每台计算机都有不同的可用内存位置和其他正在使用的内存位置?
  • “我还是不明白为什么这两个移动指令会做同样的事情”。因为 MASM 和 TASM 以相同的方式解释 mov reg,[label]mov reg,label(就好像您在两种情况下都使用了括号一样) - 就是这样。 NASM 不这样做。在 NASM 语法中,mov reg,label 将使用label 的地址加载reg(就像在 MASM/TASM 语法中的 mov reg,offset label)。

标签: assembly masm


【解决方案1】:

在 MASM 中(而且只有那里!)mov al, var1var1content 一起使用。使用“naked”标签的名称称为“Direct Memory Operand”。见MS MASM 6.0 Programmer’s Guide (Scroll to section 3.2.3, "Direct Memory Operands")。如果您需要该标签的地址,您必须使用OFFSET-Operator

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

mov al, [var1]

等价于

mov al, 0[var1]

等价于

mov al, 0 + var1

等价于

mov al, var1 + 0

等价于

mov al, var1

如果您真的不需要它,则不应在 MASM 中使用 [] 运算符,因为它有一些副作用。

【讨论】:

  • 感谢您的回答。对于间接操作数,我知道我应该使用括号,对吧?
  • @NoamSolovechick:是的,如果指令会在不带括号的情况下改变其含义(例如寄存器)。
  • 你能举例说明使用[var1] 的缺点吗?有些人建议 总是 使用 [] 作为内存操作数,即使在不需要它们的 MASM 语法中也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2014-10-04
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多