我不是学生,但我正在使用一本名为“计算机系统,程序员视角”的教科书来了解处理器架构和装配。我刚刚进入关于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。就像我说的那样,我不需要知道答案,因为答案密钥中提供了答案,但原因不在答案密钥中。
感谢您的时间!
答案 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
后缀。
push $0xFF
通常是一个坏主意,因为堆栈未对齐。我之前曾经因为类似的东西搜索了一个bug,Windows总是在CreateFile
函数上给我一些奇怪的错误消息(权限被拒绝),因为文件名不对齐而且很难发现。 :)其他操作系统可能有类似的限制。