openlang

怎样让 gcc 输出 Intel 风格汇编而不是 AT&T?

使用 gcc -S 时,生成的汇编采用 AT&T 语法。能否要求输出文件改用 Intel 语法?或者能否把一种语法转换成另一种?

从英语翻译查看原文

后续讨论 3

顺着彼此的依据读下去
  1. 固定链接

    传入 -masm=intel

    gcc -S -masm=intel -Og -fverbose-asm sample.c

    GCC 和从 3.5 开始的 Clang 都支持。GCC manual (https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-masm_003ddialect)。

    -masm=dialect 按请求的语法输出汇编指令。可选设置 是 intel 和 att,默认选择 att。Darwin 不支持 Intel。

    在 macOS 上要记住,gcc 通常会运行 Clang,除非你另外安装了真正的 GCC(比如通过 Brew)。当前 clang 接受 -masm=intel 作为等价选项,但 clang 一直都接受下面这种写法 (https://stackoverflow.com/a/11957826/950427)。

    clang++ -S -mllvm --x86-asm-syntax=intel sample.cpp

    要记住,在 clang 14 (https://reviews.llvm.org/D113707) 之前,与 GCC (https://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc) 不同,这个选项不会改变 clang 处理内联 asm() 语句的方式。

    由 Arden Fenwick 维护的编译器浏览网站 Compiler Explorer 默认使用这些选项。https://godbolt.org/

    想了解其他开关以及如何取得有用的汇编列表,可以参阅减少 GCC/clang 汇编输出中的杂项 (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output)。

    从英语翻译查看原文
  2. 固定链接

    这条命令

    gcc -S -masm=intel sample.c

    在我这里有效。还有另一种方法,不过它与调用 gcc 无关。 先构建可执行文件或目标文件,再让 objdump 按下面的方式用 Intel 汇编语法反汇编该目标文件。

    objdump -d --disassembler-options=intel a.out

    也许有用。

    从英语翻译查看原文
  3. 固定链接

    我的 CPP 文件内容如下。

    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>
    
    int result = 0;
    int main(int count, char *items[]) {
      asm("mov eax, 0xEE");
      asm("mov _result, eax");
      printf("result contains %d\n", result);
      getch();
      return 0;
    };

    我用下面这个 GCC 调用让代码运行成功。

    gcc.exe Sample.cpp -masm=intel -mconsole -o Sample.exe

    输出会是一个 *.exe 文件,在我这里成功运行了。

    Remarks:
    for an immediate operand, use _variable for a global variable rather than a local one.
    exampel: mov _itemCount, eax NOT mov $itemCount, eax or mov itemCount, eax
    
    Hexadecimal numbers require at&t notation instead of intel notation.
    example: mov eax, 0xEE -> TRUE, mov eax, 0EEh -> FALSE.

    就这些。

    从英语翻译查看原文

同一个问题的其他角度

  1. TSV 里一个普通字符串报 invalid command name "Dana",什么情况?

    好吧,这个问题把我绕晕了。Arch 上的 Tcl 9.0,跑的是 tclsh main.tcl,给客户的五金供应网站做的一个小订单报表。 我在 config.tcl 里原本只有一条规则 (total >= 200),一切正常。后来我加了第二条规则,让…

    回复 1最近活动 tcl
  2. ECMA-262 里压根没提事件循环

    ECMA-262 里压根没提事件循环。它定义的是 job,以及一个叫 HostEnqueuePromiseJob 的宿主钩子,promise 的回调准备好运行时,引擎就调用它。这些 job 到底什么时候运行,它们之间又运行什么,是宿主自己的事。 这就…

    回复 2最近活动 javascriptdart