为 mov 指令选择后缀 (l-b-w)
Posted
技术标签:
【中文标题】为 mov 指令选择后缀 (l-b-w)【英文标题】:Chosing suffix (l-b-w) for mov instruction 【发布时间】:2013-11-27 16:32:34 【问题描述】:我是汇编新手。我正在阅读计算机系统程序员的观点。我不明白我如何为mov
指令选择后缀。我知道每个寄存器和位数。
后缀使用由位数决定(32 位l
、16 位w
、8 位b
)。很少有例子对前面的句子无效。例如,%esp
是 32 位寄存器,但对于 4. 步,使用后缀 b
代替 l
。请解释使用后缀。
问题:
答案:l-w-b-b-l-w-l
来源:计算机系统:程序员的视角 (CSAPP),Bryant, O'Hallaron
【问题讨论】:
x86-64 版本,指令基本相同How to determine the appropriate MOV instruction suffix based on the operands? 【参考方案1】:在movb $-17,(%esp)
中,目标不是寄存器%esp
,而是地址在%esp
中的内存位置。由于movb
中的b
,单个字节将存储在该内存位置。那里存储的值将是 -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
)
【讨论】:
请注意,涉及#push
的问题#5 已从本教科书的第三版中删除。【参考方案2】:
在第 4 步中,目标不是esp
register,而是它指向的内存。因此b
是有效的并且意味着move the byte with the value -17h to the location where esp points currently to
。
【讨论】:
以上是关于为 mov 指令选择后缀 (l-b-w)的主要内容,如果未能解决你的问题,请参考以下文章
GNU 汇编器 x86 指令后缀(如“mov.s”中的“.s”)如何工作?