如何确定AT&T格式x86汇编指令的大小后缀?
AT&T汇编指令后缀判定规则及习题解答
核心判定规则
AT&T格式汇编的指令后缀,作用是明确标注操作数的位宽,常用后缀和对应位宽关系固定:
b:匹配1字节(8位)操作数w:匹配2字节(16位)操作数l:匹配4字节(32位)操作数q:匹配8字节(64位)操作数
判定逻辑只需要记住两点,没有额外复杂规则:
- 通用寄存器的位宽是固定的,只要指令里出现明确位宽的寄存器,直接匹配对应后缀即可,比如
%al对应b、%ax对应w、%eax对应l、%rax对应q。 - 立即数本身没有位宽,无明确长度声明的内存操作数,也可以通过另一个操作数的位宽确定后缀,同一条指令的两个操作数的位宽必须一致,不存在跨位宽操作的情况。
习题逐题推导
你贴的两张习题图的所有题目都可以用上面的规则直接推导:
举几个典型例子:
- 操作数出现
%eax(32位寄存器),对应后缀l,指令为movl - 操作数出现
%dl(8位寄存器),对应后缀b,指令为movb - 操作数出现
%ax(16位寄存器),对应后缀w,指令为movw - 如果两个操作数都没有明确位宽(比如立即数写内存),题目会给出对应变量类型,char对应
b、int对应l、long对应q即可。

所有算术类指令的后缀判定规则和mov指令完全一致:
- 操作数出现
%bl(8位寄存器),add指令后缀为b,即addb - 操作数出现
%rsp(64位栈指针寄存器),sub指令后缀为q,即subq - 操作数出现
%si(16位寄存器),inc指令后缀为w,即incw
把常见寄存器的位宽记熟,这类题不会有出错的可能。
内容的提问来源于stack exchange,提问作者amy37195
相关产品推荐
相关产品推荐

