assembly - 为 mov 指令选择后缀 (l-b-w)

标签 assembly x86 att

我是汇编新手。我正在阅读计算机系统程序员的观点。我不明白我如何为 mov 选择后缀操作说明。我知道每个寄存器和位数。
后缀使用由位数决定(32 位 l ,16 位 w ,8 位 b )。很少有例子对前面的句子无效。例如 %esp是 32 位寄存器,但用于 4. 步后缀 b用于代替 l .请给出使用后缀的解释。

enter image description here

问题 :

enter image description here

答案:l-w-b-b-l-w-l
资料来源:Bryant, O'Hallaron 的 Computer Systems: A Programmer's Perspective (CSAPP)

最佳答案

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 )

关于assembly - 为 mov 指令选择后缀 (l-b-w),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247944/

相关文章:

assembly - 代码注入(inject)的 EXC_BAD_INSTRUCTION (armv7 asm)

c - 反汇编简单的 C 函数

assembly - 如何从汇编中的地址加载单个字节

c - 新手 asm : where is the call code?

c - PLL 寄存器配置生成中断 (ARM)

linux - 如何使用 x86-64 Linux 系统调用附加到文件?

profiling - 如何检测 RDTSC 是否返回恒定速率计数器值?

c - 为什么GCC会生成 "mov 0x8,%edx"指令导致崩溃?

c - 简化 assembly 说明

c - 我尝试理解 [c 代码 -> 汇编] 代码