选择适合mov指令后缀(L-B-w)的

问题描述 投票:6回答:2

我是新来assembly.I正在读计算机系统程序员的角度来看。我不明白,我怎么选择mov指令后缀。我知道,每个寄存器和位计数。后缀的使用被位计数(32位l,16比特w,8位b)确定。几个示例不适用于前句。例如%esp是32位寄存器但是对于4.步骤后缀b代替l。请给使用后缀解释。

问题:

答案:l-w-b-b-l-w-l

来源:计算机系统:程序员的角度(CSAPP)科比,O'Hallaron

assembly x86 att
2个回答
5
投票

movb $-17,(%esp)的目的地不是寄存器%esp但其地址在%esp的存储位置。因为在bmovb的,单一字节数据被存储在该存储器位置中。存储在那里的值将是-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


0
投票

步骤4中的目标不是espregister,但内存它指向。因此,b是有效的并且是指move the byte with the value -17h to the location where esp points currently to

© www.soinside.com 2019 - 2024. All rights reserved.