了解十六进制操作码

时间:2014-04-12 15:33:13

标签: assembly intel

您好我有以下x86-Assembly:

 8048062:   31 c0                   xor    eax,eax
 8048064:   89 d8                   mov    eax,ebx
 8048066:   b8 01 00 00 00          mov    eax,0x1
 804806B:   cd 80                   int    0x80

我想了解hex-opcodes。 我读here b889是mov-instructions。 但我不理解89 d8 d8的第二部分是什么? 是d8 eax和ebx吗?那么d是eax而8是ebx? 但为什么排在第一个eax和eax == c0b8 01 00 00 00寄存器中的第三行在哪里?

为什么以下行正确?

8048066:    b8 01 00 00 00          mov    eax,0x1

为什么不:

b8 00 00 00 01 ?

eax分为:

eax 32bit
ax 16 bit
ah 8bit
al 4bit

那么为什么b8 01 00 00 00正确而不是b8 00 00 00 01?小端的原因"?

当我使用"mov al, 0x1"时,十六进制操作码只是:b8 01 那是正确的。我此刻有点困惑。

我希望你能帮助我:)。

1 个答案:

答案 0 :(得分:4)

  

是d8 eax还是ebx?

  

所以d是eax而8是ebx?

没有。它更复杂,正如您在sandpile.org/x86/opc_rm

上看到的那样
d8 = 11 011 000
     11         = both operands are registers
        011     = the 'r' operand is ebx
            000 = the 'rm' operand is eax

mov r32, imm32的工作方式不同,目标寄存器是操作码的低3位,此处000eax。在手册中,该类型的编码在操作码之后写为+号,如B8+rd id中所示。

当然,这在手册中都有解释。