【发布时间】:2020-01-22 09:35:02
【问题描述】:
下面是我使用 -masm=intel 输出到汇编语言列表的 gcc 命令行字符串。两个命令行字符串都有效,但它们都产生 AT&T 语法,而不是 Intel 语法。
gcc -S -masm=intel Svx.c
但这会产生混合的 Intel 和 AT&T 语法。
.file "Svx.c"
.intel_syntax noprefix
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
mov DWORD PTR -4[rbp], 0
jmp .L2
.L3:
add DWORD PTR -4[rbp], 1
.L2:
cmp DWORD PTR -4[rbp], 1000000000
jne .L3
mov eax, DWORD PTR -4[rbp]
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",@progbits
输出看起来像修改后的 Intel 语法,但未翻译用于堆栈处理的 AT&T 特定 cfi 指令。并且添加 DWORD PTR -4[rbp],1 不是 Intel 语法。
为什么我会在使用 -masm=intel 时得到混合的 AT&T 和 Intel 语法?
【问题讨论】:
-
AT&T 语法使用 %。例如 xorq %rax、%rax 或 pop %rbp
-
@nissimabehcera 不适用于 GNU 指令伴侣 (example)。它有点像 C 中的宏。不是汇编语言的实际部分(您控制其方言;英特尔与 AT&T),而是对汇编程序本身的指令。
-
@Lightness Races in Orbit 你说得对,但我说的是指令而不是指令。
-
@nissimabehcera 问题(主要)是询问指令。这就是重点!
-
"并添加 DWORD PTR - 4[rbp],1 不是 Intel 语法"
标签: gcc