为 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

与您的其他示例不同,此指令需要 bwl 来消除含义,因为 $-17(%esp) 都不是固定大小的实体。如果你尝试mov $-17,(%esp),汇编器会抱怨。

更新:我刚刚注意到问题 #5,push $0xFF,这似乎也可能是模棱两可的(pushl $0xFFpushw $0xFF 都是合法的),但有一个特殊规则push 在有歧义时假定 l。 16 位推送非常罕见(sysv ABI 将堆栈中的所有内容保持在 4 字节的倍数中,因此您始终为函数参数推送 32 位,即使它是 shortchar

【讨论】:

请注意,涉及#push 的问题#5 已从本教科书的第三版中删除。【参考方案2】:

在第 4 步中,目标不是espregister,而是它指向的内存。因此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”)如何工作?

mov文件用啥软件打开 后缀名mov是啥格式文件

mac系统.把视频文件后面的后缀改成别的.比如说我把.mov改成.flv。就等于把该视频转换格式了吗?非懂勿扰!

汇编语言用啥软件写的?后缀名是啥?

ARM指令的一般编码格式如下

ARM指令集