【问题标题】:GCC with -masm=intel produces AT&T syntax带有 -masm=intel 的 GCC 产生 AT&T 语法
【发布时间】: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


【解决方案1】:

CFI 指令是directives for the GNU assembler。通常,此类指令(以. 开头)与您选择的汇编语言无关,因此您担心的行不是“AT&T 特定的”,甚至与 AT&T 无关。

add DWORD PTR -4[rbp],1 英特尔语法。

【讨论】:

  • tl;dr “不,它没有”
  • 感谢您的回答。正如您在评论中添加的那样,添加 DWORD PTR -4[rbp],1 不是英特尔语法,因为英特尔语法不使用 -4[rbp]。
  • 那为什么this tool 接受该行呢?为什么 GCC 会发出它?它显然不是 AT&T 行,因为参数顺序和(正如 nissim 指出的)其中没有 %。简而言之,对不起,但您问题中的说法是错误的。
  • 当我将上面的代码粘贴到您提到的工具中并选择 x64 并汇编时,它说:“对不起,您的输入太大或包含不安全的指令!句点 (.) 字符不能出现在源代码中的任何位置。”
  • "CFI 指令...与您选择的汇编语言无关。"我从未见过或使用过 Intel 语法中的 CFI 指令。
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多