语法独立于 CPU 架构。例如。在gcc 或g++ 中,可以使用任一语法。默认为 AT&T 格式,但在内联程序集中添加 ".intel_syntax" 即可使用 intel 语法。
示例代码
int main() {
__asm__ __volatile__ (
".intel_syntax noprefix\n"
"jmp farlabel\n"
"mov EAX,EAX\n"
"farlabel:\n"
"mov EAX,EAX\n"
".att_syntax prefix\n"
);
return 0;
}
(source)
Pragma noprefix 表示% 不需要在寄存器名称前添加。 .att_syntax 切换回 AT&T 语法,因为生成的汇编代码的其余部分都是这种风格。
根据black 的评论,我检查了编译上述小代码时调用了哪些程序。实际上gcc调用cc1plus生成.s文件(这是汇编代码),然后调用as生成.o(对象)文件,然后调用collect2(我假设这增加了动态loader 和其他围绕用户代码的机器),然后调用 ld 将代码链接在一起并创建可执行文件。
如果调用gcc -S x.cc,则它会在汇编代码生成后立即停止,因此可以看到临时文件。这是生成的代码:
.file "x.cc"
.text
.globl* main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
#APP
# 9 "x.cc" 1
.intel_syntax noprefix
jmp farlabel
mov EAX,EAX
farlabel:
mov EAX,EAX
.att_syntax prefix
# 0 "" 2
#NO_APP
movl $0, %eax
popl %ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits
这两种风格混合在一起...