我是汇编的新手。我正在阅读计算机系统程序员的观点。我不明白我如何为mov
指令选择后缀。我知道每个寄存器和位数。
后缀使用由位计数确定(32位l
,16位w
,8位b
)。很少有例子对前一句无效。例如,%esp
是32位寄存器,但是对于4.步骤后缀b
而不是l
。请说明使用后缀。
问题:
回答:l-w-b-b-l-w-l
资料来源:计算机系统:程序员的观点(CSAPP),布莱恩特,奥哈拉伦
答案 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+3
或b
或w
来消除含义的歧义,因为l
和$-17
都不是固定的-size实体。如果您尝试(%esp)
,汇编程序会抱怨。
更新:我刚刚注意到问题#5,mov $-17,(%esp)
似乎也可能含糊不清(push $0xFF
和pushl $0xFF
都是合法的),但是pushw $0xFF
有一条特殊规则,只要存在歧义,就会假定push
。 16位推送是非常罕见的(sysv ABI使堆栈中的所有内容保持4个字节的倍数,因此您总是将32位用于函数参数,即使它是l
或short
)< / p>
答案 1 :(得分:1)
在步骤4中,目标不是esp
寄存器,而是指向的内存。因此b
有效且意味着move the byte with the value -17h to the location where esp points currently to
。