这是汇编程序错误吗?绑定指令
Posted
技术标签:
【中文标题】这是汇编程序错误吗?绑定指令【英文标题】:Is this assembler bug? bound instruction 【发布时间】:2018-09-04 04:51:45 【问题描述】:关于字节模式622c24
,有2种情况。
第一种情况:objdump
- as
对。
objdump
将 622c24
反汇编为:bound %ebp,(%esp)
linux as
组装bound %ebp,(%esp)
到:622c24
第二种情况:库Capstone
-keystone
对。
Capstone
将622c24
反汇编为:bound (%esp), %ebp
Keystone
将bound (%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 r
和 r/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未绑定前缀?