1. AT&T汇编语法入门:与Intel的差异点
刚开始接触AT&T汇编时,很多从Intel阵营转过来的朋友会感到不适应。最大的区别在于操作数顺序:AT&T语法是源操作数在前,目标操作数在后,正好和Intel语法相反。比如mov指令在AT&T中写作movl %eax, %ebx,表示将eax的值移动到ebx中。
另一个明显区别是寄存器命名。AT&T要求所有寄存器名前加百分号(%),比如%eax、%ebx。立即数则需要加美元符号($),例如movl $0x04, %ebx会将数值4放入ebx寄存器。
操作数大小也是AT&T的特色之一。指令后缀明确指定操作位数:b代表字节(8位),w代表字(16位),l代表长字(32位)。例如movb %al, %bl移动一个字节,而movl %eax, %ebx移动32位数据。
内存寻址方式差异很大。Intel使用[base + index*scale + displacement],而AT&T使用displacement(base, index, scale)。例如movl 4(%ebp), %eax表示从ebp寄存器指向地址加4字节处读取数据到eax。
2. GCC内联汇编基础语法
GCC内联汇编允许在C/C++代码中直接嵌入汇编指令,格式为asm volatile("指令列表" : 输出操作数 : 输入操作数 : 破坏列表)。volatile关键字告诉编译器不要优化这段汇编代码,确保指令原样保留。
最简单的内联汇编是空指令列表:asm volatile("":::"memory")。这行代码不产生任何


3万+

被折叠的 条评论
为什么被折叠?



