我是新来assembly.I正在读计算机系统程序员的角度来看。我不明白,我怎么选择mov
指令后缀。我知道,每个寄存器和位计数。后缀的使用被位计数(32位l
,16比特w
,8位b
)确定。几个示例不适用于前句。例如%esp
是32位寄存器但是对于4.步骤后缀b
代替l
。请给使用后缀解释。
问题:
答案:l-w-b-b-l-w-l
来源:计算机系统:程序员的角度(CSAPP)科比,O'Hallaron
在movb $-17,(%esp)
的目的地不是寄存器%esp
但其地址在%esp
的存储位置。因为在b
的movb
的,单一字节数据被存储在该存储器位置中。存储在那里的值将是-17(其等同于无符号字节0xef)。
movw $-17,(%esp)
和movl $-17,(%esp)
也将是合法的指令,他们会做不同的事情,存储2点或4个字节的值在存储器位置0xffef或0xffffffef通过%esp
或%esp+1
%esp+3
。
该指令需要b
或w
或l
消除歧义的意义,不同于你的其他的例子,因为无论$-17
也不(%esp)
是一个固定大小的实体。如果您尝试mov $-17,(%esp)
汇编会抱怨。
更新:我刚刚发现的问题#5,push $0xFF
这也似乎是它可以是不明确的(pushl $0xFF
和pushw $0xFF
都是合法的),但对于push
,它假定l
每当有歧义一个特殊的规则。 16位的推动是非常罕见的(SysV的ABI使一切在4个字节的倍数堆栈上对齐,所以你总是推32位的函数参数,即使它是一个short
或char
)
步骤4中的目标不是esp
register,但内存它指向。因此,b
是有效的并且是指move the byte with the value -17h to the location where esp points currently to
。