0

我对将十六进制机器指令转换为符号操作码感到很困惑。我在本节中有一些复习问题:

What machine code is generated for the instruction: sbb al, 10
sbb reg/mem from reg/mem    0001 10dw | mod reg r/m | disp-lo | disp-hi
sbb immed from reg/mem      1000 00dw | mod 101 r/m | disp-lo | disp-hi | disp-lo | disp-hi
sbb immed from accumulator  0001 110w | data-lo | data-hi
Answer: 01C0A

What is the symbolic opcode for this hex machine instruction: F7 26 10 00
I converted F7 to 1111 0111 and this matches up with these instructions
mul    1111 011w | mod 100 r/m | disp-lo | disp-hi
imul   1111 011w | mod 101 r/m | disp-lo | disp-hi
div    1111 011w | mod 110 r/m | disp-lo | disp-hi
idiv   1111 011w | mod 111 r/m | disp-lo | disp-hi
Answer: mul

我不知道如何处理这些问题,而且我似乎无法理解这些概念。有人可以用更简单的方式向我解释吗?

4

2 回答 2

4

请参阅有关x86x86 指令列表的维基百科页面

另请参阅英特尔关于 x86 指令集的手册和许多其他网站,如x86asm本页

在网络上搜索提供了许多参考。

你可以使用调试器gdb来帮助你。

于 2011-12-13T11:12:30.893 回答
2

正确地指出,有多种可能性sbb al, 10,但要么您的资源错误,要么您从中选择了错误的数据。这是来自英特尔的手册:

SBB – Integer Subtraction with Borrow

immediate to register        1000 00sw : 11 011 reg : immediate data
immediate to AL, AX, or EAX  0001 110w : immediate data

如果你使用第二种编码,你会得到一个 2 字节的指令:1Ch, 0Ah. w将使用字节大小的操作数与 (d/q) 字大小的操作数进行操作的指令区分开来。这里w=0 因为操作数是字节。w将是 1 sbb (r/e)ax, imm

现在,如果您使用第一个编码,您将得到一个 3 字节的指令。w具有相同的含义。s将立即数为 (d) 字大小的指令与立即数为字节大小的指令区分开来(如果仔细查看指令描述,您会发现仅在立即数操作数大小上有所不同的两种形式)。这里s=0 因为立即数是字节大小的。reg是寄存器索引。对于al(and (r/e)ax) 它是 0。这样你就到达了:80h, 0D8h, 0Ah

两种编码都是 的有效编码sbb al, 10,但通常首选较短的编码。

您绝对必须阅读英特尔和/或 AMD CPU 手册,其中涵盖了指令集和指令编码,可能需要多次阅读并阅读英特尔和 AMD。你需要的所有信息都在那里,只是它有很多,而且不是最适合学习的形式。

如果您想验证您对指令编码的理解,请使用以下工具:汇编器、反汇编器和调试器。例如,您可以在代码中编写db 80h, 0D8h, 0Ahdb 1Ch, 0Ah代替sbb al, 10,编译它,然后查看它的反汇编,看看它确实是sbb al, 10. 您可以在这里和那里更改各种位,并查看它们在反汇编中带来了哪些变化。

于 2011-12-13T11:55:55.203 回答