汇编语言符号操作码

时间:2011-12-13 11:04:11

标签: assembly hex opcode machine-instruction

我很担心将十六进制机器指令转换为符号操作码。我在本节中有一些评论问题:

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

我不知道如何处理这些问题,我似乎无法理解这些概念。有人可以用简单的方式将它分解给我吗?

2 个答案:

答案 0 :(得分:4)

请参阅x86x86 instruction listings

上的维基百科页面

另请参阅Intel's manual on x86 instruction set以及其他许多网站,例如x86asmthis page

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

您可以使用gdb之类的调试器来帮助您。

答案 1 :(得分: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, 0Ahw区分使用字节大小的操作数操作的指令和(d / q)字大小的操作数。这里w = 0,因为操作数是字节。 w的{​​{1}}为1。

现在,如果您使用第一个编码,则会得到一个3字节的指令。 sbb (r/e)ax, imm具有相同的含义。 w区分其立即(d)字大小的指令与其立即数字大小的指令(如果仔细查看指令描述,则会发现两种形式仅在立即操作数大小上有所不同)。这里s = 0,因为立即数是字节大小的。 s是注册索引。对于reg(以及al),它为0.然后您到达:(r/e)ax

这两种编码都是80h, 0D8h, 0Ah的有效编码,但通常会选择较短的编码。

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

如果要验证对指令编码的理解,请使用以下工具:汇编程序,反汇编程序和调试程序。例如,您可以在代码中编写sbb al, 10db 80h, 0D8h, 0Ah而不是db 1Ch, 0Ah,编译它,然后查看其反汇编以确定它确实是sbb al, 10。您可以在这里和那里改变各种位,看看它们在反汇编中带来了什么变化。