我很担心将十六进制机器指令转换为符号操作码。我在本节中有一些评论问题:
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
我不知道如何处理这些问题,我似乎无法理解这些概念。有人可以用简单的方式将它分解给我吗?
答案 0 :(得分:4)
请参阅x86和x86 instruction listings
上的维基百科页面另请参阅Intel's manual on x86 instruction set以及其他许多网站,例如x86asm,this 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, 0Ah
。 w
区分使用字节大小的操作数操作的指令和(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, 10
或db 80h, 0D8h, 0Ah
而不是db 1Ch, 0Ah
,编译它,然后查看其反汇编以确定它确实是sbb al, 10
。您可以在这里和那里改变各种位,看看它们在反汇编中带来了什么变化。