在组装中,“ PTR”代表什么?

Кон*_*Ван 5 x86 assembly

and     dword ptr [ebp-4], 0
Run Code Online (Sandbox Code Playgroud)

在上述汇编代码中,该术语 PTR代表什么?我知道它们的用法-大小指令;但是这个词 PTR是从哪里来?它代表PoinTeR吗?

我读了:

z0r*_*g's 6

该提示的目的是告诉操作数的大小。

您正在写入内存中的某个点。因为您只给出0,所以它不知道是否应该写入字节,字或双字。的dword ptr意思是“写一个双字”。是的,它代表指针,因为您将内存地址作为目标。

  • 为什么需要 PTR?为什么 DWORD 不足以推断操作数的大小?这只是语法上的怪癖吗? (3认同)
  • @jonny 是的,这几乎是一个语法上的怪癖。大多数现代(与 Intel 兼容)汇编器将接受 `and [ebp-4], 0`、`and dword [ebp-4], 0` 和 `and dword ptr [ebp-4], 0`。 (3认同)
  • @Toothbrush:好的汇编程序会拒绝`and [ebp-4], 0`作为不明确的操作数大小:您想要将字节,字,双字还是qword归零。[确定 NASM 何时可以推断 mov 操作的大小](/sf/ask/2167148651/)。不太好的汇编程序有一个默认值,通常是双字(例如用于非 mov insns 的 GAS);对于像 emu8086 这样非常糟糕的汇编器,大小取决于数字常量!另外,据我所知,没有任何汇编器可以同时接受“dword”和“dword ptr”。MASM 会将 `dword` 汇编为常量 4,因此 `4[ebp-4]` = `[ebp - 4 + 4]` = `[ebp]`。 (2认同)
  • @Toothbrush:NASM 和 GNU .intel_syntax 是不同的。NASM 在“dword ptr”上阻塞,GAS / LLVM 在“dword”上阻塞。使用 NASM 2.15.05 组装 MASM/GNU 语法:`警告:'ptr'不是 NASM 关键字 [-w+ptr]`/`错误:符号'ptr'未定义`。对于 clang/LLVM 组装 NASM 语法,我们得到“错误:预期‘PTR’或‘ptr’标记!”。使用实际的 GAS,我们从“add dword [ebp - 4], 0”得到“错误:‘add’的操作数大小不明确”,但使用“add dword [ebp-4], eax”,反汇编为“add dword ptr” [ebp+0],eax`。 (2认同)