装配,操作后缀不要点击给我

时间:2015-11-10 07:05:53

标签: assembly x86

我不是学生,但我正在使用一本名为“计算机系统,程序员视角”的教科书来了解处理器架构和装配。我刚刚进入关于IA32组装的部分,它问这个问题:

对于以下每个汇编语言行,根据操作数确定适当的指令后缀。 (例如,mov可以重写为movb,movw或movl。)

mov %eax, (%esp)
mov (%eax), %dx
mov $0xFF, %bl
mov (%esp,%edx,4), %dh
push $0xFF
mov %dx, (%eax)
pop %edi

我查看了答案密钥,其中一些有意义,如push $0xFF,因为这是一个字节大小的const。就像我说的那样,我不需要知道答案,因为答案密钥中提供了答案,但原因不在答案密钥中。

感谢您的时间!

2 个答案:

答案 0 :(得分:2)

mov %eax, (%esp)

双字导致整个寄存器%eax的32位值正在移动。

mov (%eax), %dx

Word导致16位值进入%edx寄存器的一半。

mov $0xFF, %bl

字节。明显。

mov (%esp,%edx,4), %dh

字节。在左侧我们有一个地址,但在右侧我们有%edx寄存器的8位四分之一。

push $0xFF

这取决于。 80386具有将8位常数推入堆栈的指令6A。但Michael Petch在评论中如何表示,这取决于堆栈地址大小。

mov %dx, (%eax)

字。 16位%dx正在进入某个地方。

pop %edi

双字。 32位寄存器%edi

现在,8位值与后缀 b (字节)匹配,16位值与后缀 w (字)匹配,以及32位值匹配后缀 l (double或 long 字)。

<强>更新

4个寄存器(A,B,C和D)有部分可用。 整个32位寄存器是E A X,E B X,依此类推。 低16位的寄存器是 A X, B X,依此类推。 高8位低16位四分之一是 A H, B H(其中H表示)。 低8位低16位四分之一 A L, B L(其中L表示)。

答案 1 :(得分:0)

指令后缀可能受操作数类型的影响。

例如,在第一行中,一个操作数是EAX,它立即显示它需要l指令。 Conversly mov (%esp,%edx,4), %dh的操作数大小为字节,因此需要b后缀。

BTW:带有字节操作数的push $0xFF通常是一个坏主意,因为堆栈未对齐。我之前曾经因为类似的东西搜索了一个bug,Windows总是在CreateFile函数上给我一些奇怪的错误消息(权限被拒绝),因为文件名不对齐而且很难发现。 :)其他操作系统可能有类似的限制。