我是汇编新手。我正在阅读计算机系统程序员的观点。我不明白我如何为 mov
选择后缀操作说明。我知道每个寄存器和位数。
后缀使用由位数决定(32 位 l
,16 位 w
,8 位 b
)。很少有例子对前面的句子无效。例如 %esp
是 32 位寄存器,但用于 4. 步后缀 b
用于代替 l
.请给出使用后缀的解释。
问题 :
答案:l-w-b-b-l-w-l
资料来源:Bryant, O'Hallaron 的 Computer Systems: A Programmer's Perspective (CSAPP)
最佳答案
在 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
)
关于assembly - 为 mov 指令选择后缀 (l-b-w),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247944/