编码 ADC EAX、ECX - 2 种不同的编码方式?(拱门 x86)

Encoding ADC EAX, ECX - 2 different ways to encode? (arch x86)

提问人:Svarog 提问时间:3/6/2014 最后编辑:nrzSvarog 更新时间:5/28/2017 访问量:732

问:

我正在查看英特尔指令集手册,看起来有 2 种不同的形式可以匹配/编码,如下所示:ADCADC EAX, ECX

ADC r/m32, r32  (11 /r , which encodes to 11C8)

ADC r32, r/m32  (13 /r, which encodes to 13C1)

我的问题是(假设我正确地进行了数学计算),是等价的?汇编程序在选择一种编码而不是另一种编码时会考虑哪些因素?这个问题是从实现汇编程序的角度来看的,所以这个问题一般是关于这个特定的假设指令。11C813C1

如果这是一个冗长的答案,请为我指出一个正确的方向,因为我在谷歌上搜索它的尝试失败了。

组件 x86

评论

2赞 Egor Skriptunoff 3/6/2014
是的,它们是等价的。

答:

11赞 phuclv 3/6/2014 #1

这是指令编码的冗余。任何在指令中使用多个参数的体系结构都具有此功能。

想想一个 RISC 架构,它将 ry 和 rz 的总和分配给 rx,然后你可以编码,或者,它们都是等价的。add rx, ry, rzadd rx, ry, rzadd rx, rz, ry

在 x86 中,我们(通常)每条指令只有 2 个参数,但您可以选择它们之间的方向,因为您可以存储到内存或从内存中读取。如果您不使用内存,则可以在 2 个寄存器之间选择方向,因此有 2 种编码方式

您可以使用它来识别某些编译器/汇编器。对于某些汇编程序,您可以选择要使用的编码。在 GAS 中,您可以使用 .s 后缀强制它发出备用编码

10 de   adcb   %bl,%dh
12 f3   adcb.s %bl,%dh

评论

0赞 user2485710 3/6/2014
一些表格参考 pdos.csail.mit.edu/6.828/2005/readings/i386/ADC.htm,有时您必须在使用 Google google.com/#q=allintext:+adc+eax+r32 时使用一些小技巧
1赞 Peter Cordes 3/10/2018
GAS 具有用于编码覆盖的新语法,例如使用 r/m 源进行编码的前缀。sourceware.org/binutils/docs/as/i386_002dMnemonics.html。或用于强制使用更长寻址模式的前缀。{load}{disp32}
2赞 Ensamblauricio 3/7/2014 #2

ADC的二进制编码为(假设reg-reg操作):

000100dw  Mod Reg Ind 
d= destination, 1 if Reg is the destination register, 0 if not
w= word operation, =0 if byte operation, =1 32 bit operation
Reg= is the register to use as a destination Register
Mod / Ind fields are used to specify the other Register involved, Mod=11, Ind= the other register

当指令与两个寄存器(如 ADC EAX、ECX)一起使用时,有两种可能的编码:

a) EAX= EAX + ECX, COP= 13h, the "normal" case
00010011 11|000|001 where d=1 meaning 000 (EAX) is the destination register and 001 (ECX) is the other register.

b) EAX= ECX + EAX, COP= 11h, 
00010001 11|001|000 d=0 meaning 001 (ECX) is not the destination register so 000(EAX) must be the destination register.

D 位涉及几乎两个涉及 reg-reg 或 reg-mem 操作数的操作数指令。