【问题标题】:Assembly correct usage of word/byte/word ptr组装正确使用字/字节/字 ptr
【发布时间】:2016-07-09 11:53:43
【问题描述】:

我正在编写一个用于汇编的小型机器代码生成器。我有一个关于立即记忆指令的问题:

让我们来看看这 3 个场景:

add [ebx+04], 0x1
add [ebx+04], 0x4040
add [ebx+04], 0x401000

我所做的是通过立即常数,我检查它可以容纳的最小字节数然后我假设它的字节 ptr、字 ptr、dword ptr

第一个可以容纳 1 个字节,所以我假设它是:

add byte ptr [ebx+04], 0x1

Second 可以容纳 2 个字节,所以我假设它是:

add word ptr [ebx+04], 0x4040

第三个适合 4 个字节,所以我假设它是:

add dword ptr [ebx+04], 0x401000

这对吗?

【问题讨论】:

  • 没有。您希望如何生成 1 的 32 位加法? PTR 注释的存在是有原因的。
  • 字节 ptr、字 ptr 等命名是有原因的。因为用户需要能够选择哪个指令/操作数。如果你自己编,你可以用 addb, addw, addd 代替 x ptr。
  • 如果 add [ebx+04], 0x00000001 产生一个 dword ptr,那么如果用户理解你的汇编语言规则,也许你可以侥幸逃脱。
  • 声明很明显:给内存中的一个字节加 1 的效果与给内存中的一个双字加 1 的效果是不同的。在后一种情况下,进位(如果有)最多超过 4 个字节。

标签: assembly compiler-construction x86


【解决方案1】:

您绝对需要接受此类说明中的尺码标签。

但我不会忽略代码以查看适合的数字,因为您需要一种方法来决定是否可以使用基于符号扩展字节的较小编码:

add dword ptr [ebx+4], 1

这可以使用 4 字节立即数进行编码,但更有趣的是使用 1 字节立即数。

【讨论】:

  • 我还有一个问题,我知道您可以使用该位将 8 位值扩展为 32 位。 16bit转32bit也适用吗?
  • x86 体系结构定义,当操作数大小为 16 位时,此 s-bit 符号将一个字节扩展为一个字,当操作数大小为 16 位时,它将一个字节扩展为一个双字。操作数大小为 32 位。这显然排除了从 16 位到 32 位的符号扩展。
【解决方案2】:

如果您还实现了一种明确指定操作数大小的方法,并且由于它是您的汇编程序,那么最终是否允许这种“智能”推导是您的要求。

我强烈反对它,程序员不要根据立即数选择操作数大小,而是根据操作数大小选择立即数。
简单地说,我们认为add DWORD [ebx+04h], 1add WORD [ebx+04h], 1 是两个完全独立的指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多