理解十六进制操作码

Shi*_*umi 1 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
Run Code Online (Sandbox Code Playgroud)

我想了解十六进制操作码。我在这里读到,b8并且89是 mov-instructions。但我不明白第二部分是89 d8什么d8?是d8eax 和ebx 吗?所以 d 是 eax 而 8 是 ebx?但为什么在第一行 eax 和eax == c0b8 01 00 00 00寄存器的第三行在哪里?

为什么以下行是正确的?

8048066:    b8 01 00 00 00          mov    eax,0x1
Run Code Online (Sandbox Code Playgroud)

为什么不:

b8 00 00 00 01 ?
Run Code Online (Sandbox Code Playgroud)

eax 分为:

eax 32bit
ax 16 bit
ah 8bit
al 4bit
Run Code Online (Sandbox Code Playgroud)

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

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

我希望你可以帮助我 :)

har*_*old 5

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
Run Code Online (Sandbox Code Playgroud)

mov r32, imm32工作方式不同,目标寄存器是操作码的低 3 位,这里000eax. 在手册中,这种类型的编码在操作码后写为 + 号,如B8+rd id.

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