这是汇编程序错误吗?绑定指令

Posted

技术标签:

【中文标题】这是汇编程序错误吗?绑定指令【英文标题】:Is this assembler bug? bound instruction 【发布时间】:2018-09-04 04:51:45 【问题描述】:

关于字节模式622c24,有2种情况。 第一种情况:objdump - as 对。

    objdump622c24 反汇编为:bound %ebp,(%esp) linux as 组装bound %ebp,(%esp) 到:622c24

第二种情况:库Capstone-keystone 对。

    Capstone622c24 反汇编为:bound (%esp), %ebp

    Keystonebound (%esp), %ebp 组装成:622c24

正如您在上面看到的,源和目标的位置是相反的。

objdump : bound %ebp,(%esp) 顶峰:bound (%esp), %ebp

根据 AT&T 语法,BOUND r32, m32 是正确的。 因此,这意味着 Capstone-keystone pare 是正确的。

问。那么objdump-as在反汇编bound指令时有问题?是binutils的bug吗?

【问题讨论】:

【参考方案1】:

是的,这可能是 AT&T 语法中的设计错误。它们通常遵循从 Intel 语法反转操作数的模式,并重命名符号/零扩展助记符 (cdq => cltq, movsx eax, byte[mem] => movsbl)。与此的偏差可被视为设计错误。

除非旧版本不同,否则不会出现实现错误。当 AT&T 随心所欲地为不同的指令制定自己的规则时,这是有效的(但令人不快)。这可能是与原始 Unixware 汇编器兼容的另一种情况。 (见下文)。


The bound instruction 不写入任何一个输入操作数,因此两者都不是真正的目的地。与cmp 不同,操作数顺序没有任何意义。它只是根据上限/下限检查寄存器,如果超出范围则引发#BR 异常。

它只有一个操作码,它需要寄存器 + 内存操作数(在 ModR/M rr/m 字段中。


objdump -d 在 AT&T 和 Intel 语法中首先列出寄存器操作数。

我用 NASM 组装了db 0x62, 0x2c, 0x24 并将它与ld -melf_i386 链接到一个 32 位 ELF 可执行文件中(因为我有一个包装脚本,它使得组装+链接+反汇编比 只是 组装)。

   objdump -drwC -Mintel
8048060:       62 2c 24                bound  ebp,QWORD PTR [esp]

   objdump -drwC -Matt
8048060:       62 2c 24                bound  %ebp,(%esp)

这似乎是在 binutils 中实现的 AT&T 语法的一个怪癖 (as / objdump / gdb) bound 需要注册 arg 以首先列出。

bound  %eax, (%edx)  # assembles fine
bound (%edx), %eax   # foo.s:2: Error: operand size mismatch for `bound'

我认为在 Intel 语法模式下它要求寄存器 arg 是第一个是相同的。这里的意思没有歧义,只是一个奇怪的设计选择,不反转操作数与 Intel 语法。


相关:AT&T syntax also has "bugs" according to the GAS manual:

9.15.16 AT&T 语法错误

UnixWare 汇编器,可能还有其他 AT&T 派生的 ix86 Unix 汇编器,在某些情况下生成具有反向源和目标寄存器的浮点指令。不幸的是,gcc 和可能的许多其他程序都使用这种相反的语法,所以我们坚持使用它。

例如

   fsub %st,%st(3)

导致%st(3) 更新为%st - %st(3),而不是预期的%st(3) - %st。这发生在所有具有两个寄存器操作数的非交换算术浮点运算中,其中源寄存器为%st,目标寄存器为%st(i)

因此,AT&T 语法存在实际错误,其中两个命令都有效并且意味着 不同 事物。我认为我们可以将这个操作数“反转”归为一组。


ndisasm -b32 将其反汇编为622C24 bound ebp,[esp],与 Intel 手册的操作数顺序匹配。

【讨论】:

如果翻出原版的 iapx186/188 手册 Intel 指定寄存器为目的操作数,两个边界所在的内存地址为源。该手册还显示了编码示例。在我看来,任何与这些处理器的原始手册不同的东西都可能是一个错误。只是我的意见。 @MichaelPetch: 和felixcloutier.com/x86/BOUND.html有很大不同吗?当前的手册明确将其列为BOUND r32, m32&32(或 16),但没有将任何操作数称为源或目标,并且 OPERATION 部分不写入内存或寄存器。无论如何,AT&T 的语法可以随意编造。他们越少坚持“intel-with-reversed-operands”,它的用处/易于学习就越少,但英特尔的手册对 AT&T 语法设计没有最终决定权。但是,是的,我可以称它为 AT&T 语法错误。 @MichaelPetch:更新了一个新部分,表示我们可以认为这是一个语法设计错误。

以上是关于这是汇编程序错误吗?绑定指令的主要内容,如果未能解决你的问题,请参考以下文章

由于用于构建 GCC 的 CPU 的体系结构,这是 g++ 的“非法指令错误”吗?

可以禁用“应用程序错误”对话框吗?

com.admob.android.ads.AdView未绑定前缀?

更新 tableview 绑定到数组错误

错误1找不到类型或命名空间名称“Controller”(您是否缺少using指令或程序集引用?)

程序有并发错误?NO WAY!