【问题标题】:Is ptr keyword necessary in Intel assembly syntax?英特尔汇编语法中是否需要 ptr 关键字?
【发布时间】:2016-01-12 04:15:49
【问题描述】:

方括号和PTR 都表示后面的值(内存地址或寄存器值)被取消引用,从语言设计的角度来看,真的有必要让它们同时出现吗?

【问题讨论】:

  • 您应该使用您所询问的 CPU 架构和汇编程序来标记您的问题(我假设 x86 和 MASM/TASM)。这似乎很相关:stackoverflow.com/questions/13790146/…
  • MASM 不区分 mov eax,labelmov eax,[label]。但是,括号仍然适用于mov eax,[ebx]mov eax,[EQU_CONSTANT] 等情况。
  • nasm 例如根本不使用ptr。另请注意,没有单一的“英特尔语法”。
  • PTR 实际上是一个强制转换运算符。只需要更改操作数的类型(基本上就是它的大小),要么因为它没有,要么因为它的类型错误。

标签: assembly x86 masm


【解决方案1】:

从语言设计的角度来看,真的有必要让它们同时出现吗?

通常不会。虽然您必须明确指出您想要符号的值(而不是地址),但既不需要也禁止使用两者。

使用括号只是许多人用来表示他们使用的是值而不是地址或指针的约定。有时你会听到它被称为“内容”。


如果您想查看两者都需要的示例,请参阅Addressing variables (or, what is ML64 generating?)。但这不是语言要求本身。相反,两者都是必需的,因为 MASM/ML 和 MASM64/ML64 使用相同的源。

在 MASM64/ML64 下,汇编器似乎无法正确处理符号定义和快速调用,因此由于<symbolic name> EQU <register>,两者都需要。或者,也许代码是这样编写的,因此汇编器无法处理它...

如果仔细观察,您会发现 MASM 使用基本相对寻址(所有内容都通过 EBP 访问),而 MASM64 由于fastacll 有一些直接要求,其中前两个参数可通过寄存器获得(ECXEDX)。


括号和PTR都暗示后面的值(内存地址或寄存器值)

您可能已经知道这一点,但万一其他人发现它有用......

在 C 中,你总是处理值并且必须做一些特殊的事情来获取地址:

int value = 1;

在您的 C 代码中,除非您获取变量的地址,否则您将始终使用 1

在 ASM 中,情况正好相反。当你声明一个变量并象征性地引用它时:

LOCAL value:QWORD

除非您采取特殊步骤来处理该值,否则您始终使用该地址。要获取该值,您可以使用QWORD PTR value[value]。或者你可以同时使用QWORD PTR [value],这是无害的。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2021-02-06
    • 2015-09-29
    • 1970-01-01
    • 2010-11-01
    • 2017-02-23
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多