2011-12-13 144 views
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 

我不知道如何处理这些问题,我似乎无法绕过我的头概念。有人可以用简单的术语把它分解给我吗?

回答

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对于sbb (r/e)ax, imm将是1。

现在,如果使用第一种编码,您将得到一个3字节的指令。 w具有相同的含义。 s区分其立即数是(d)字面大小与直接字节大小的指令(如果仔细观察指令说明,您会发现两种形式仅在直接操作数大小上有所不同)。这里s = 0,因为立即数是字节大小的。 reg是注册表索引。对于al(和(r/e)ax)它是0.随着你到达:80h, 0D8h, 0Ah

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

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

如果您想验证您对指令编码的理解,请使用诸如汇编器,反汇编器和调试器等工具。例如,您可以在代码中编写db 80h, 0D8h, 0Ahdb 1Ch, 0Ah而不是sbb al, 10,编译它,然后查看它的反汇编以确定它的确是sbb al, 10。您可以随意更改各种位,并查看它们在反汇编中所带来的变化。