选择mov指令的后缀(lbw)

Mel*_*taş 6 x86 assembly att

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

在此输入图像描述

问题:

在此输入图像描述

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

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

小智 5

movb $-17,(%esp)目的地不是登记%esp,但其地址在内存位置%esp.由于bin movb,单个字节将存储在该存储器位置.存储在那里的值将是-17(相当于无符号字节0xef).

movw $-17,(%esp)并且movl $-17,(%esp)也是合法的指令,他们会做不同的事情,%esp通过%esp+1或存储2或4字节值0xffef或0xffffffef在内存位置%esp+3.

该指令需要bwl消除歧义的意义,不同于你的其他的例子,因为既没有$-17,也不(%esp)是一个固定大小的实体.如果你尝试mov $-17,(%esp)汇编程序会抱怨.

更新:我刚刚注意到问题#5,push $0xFF它似乎也可能是模棱两可的(pushl $0xFF并且pushw $0xFF都是合法的),但是只要存在歧义push,l就会有一个特殊的规则.16位推送是非常罕见的(sysv ABI保持所有内容在堆栈中以4个字节的倍数对齐,因此您总是将32位用于函数参数,即使它是a short或者char)