您好我有以下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 b8
和89
是mov-instructions。
但我不理解89 d8
d8
的第二部分是什么?
是d8
eax和ebx吗?那么d是eax而8是ebx?
但为什么排在第一个eax和eax == c0
?
b8 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
那是正确的。我此刻有点困惑。
我希望你能帮助我:)。
答案 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位,此处000
为eax
。在手册中,该类型的编码在操作码之后写为+号,如B8+rd id
中所示。
当然,这在手册中都有解释。