选择mov指令的后缀(l-b-w)

时间:2013-11-27 16:32:35

标签: assembly x86 att

我是汇编的新手。我正在阅读计算机系统程序员的观点。我不明白我如何为mov指令选择后缀。我知道每个寄存器和位数。 后缀使用由位计数确定(32位l,16位w,8位b)。很少有例子对前一句无效。例如,%esp是32位寄存器,但是对于4.步骤后缀b而不是l。请说明使用后缀。

enter image description here

问题:

enter image description here

回答:l-w-b-b-l-w-l

资料来源:计算机系统:程序员的观点(CSAPP),布莱恩特,奥哈拉伦

2 个答案:

答案 0 :(得分:5)

movb $-17,(%esp)中,目的地不是寄存器%esp,而是地址位于%esp的内存位置。由于b中的movb,单个字节将存储在该内存位置。存储在那里的值将是-17(相当于无符号字节0xef)。

movw $-17,(%esp)movl $-17,(%esp)也是合法的指示,他们会做不同的事情,将2或4字节值0xffef或0xffffffef存储在内存位置%esp到{{1} }或%esp+1

与其他示例不同,此说明需要%esp+3bw来消除含义的歧义,因为l$-17都不是固定的-size实体。如果您尝试(%esp),汇编程序会抱怨。

更新:我刚刚注意到问题#5,mov $-17,(%esp)似乎也可能含糊不清(push $0xFFpushl $0xFF都是合法的),但是pushw $0xFF有一条特殊规则,只要存在歧义,就会假定push。 16位推送是非常罕见的(sysv ABI使堆栈中的所有内容保持4个字节的倍数,因此您总是将32位用于函数参数,即使它是lshort)< / p>

答案 1 :(得分:1)

在步骤4中,目标不是esp寄存器,而是指向的内存。因此b有效且意味着move the byte with the value -17h to the location where esp points currently to