是否可以在 Intel 语法中为 AMD 处理器编写 ASM 代码?

Posted

技术标签:

【中文标题】是否可以在 Intel 语法中为 AMD 处理器编写 ASM 代码?【英文标题】:Is it possible to code ASM code in Intel Syntax for AMD processors? 【发布时间】:2016-02-17 20:05:47 【问题描述】:

使用 Intel Syntax 或 AT&T 是否独立于 CPU 微架构?我的意思是,编译器的任务是将代码(独立于 AT&T 或 Intel 语法)转换为二进制以便可以使用任何语法编写代码吗?

【问题讨论】:

是的,一个在很大程度上是另一个的克隆,所以你可以为一个做什么,你可以为另一个做什么。 处理器不执行汇编,它们执行机器代码。语法取决于您使用的汇编程序。 相关:***.com/questions/8549427/… 【参考方案1】:

语法独立于 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

这两种风格混合在一起...

【讨论】:

好吧 GCC 不是一个汇编器,所以考虑它没有多大意义;内联汇编传递给as。 GCC 只关心使用的约束和寄存器。 @black 你是对的!这只是一个例子,汇编代码的风格独立于架构。实际上我没有在 Intel 平台上使用as,但我确实使用了gcc 和g++。【参考方案2】:

根据这个link,汇编语法有两个主要分支。

x86 汇编语言有两个主要的语法分支:Intel 语法, 最初用于 x86 平台和 AT&T 的文档 syntax.1 Intel 语法在 MS-DOS 和 Windows 世界中占主导地位, 并且 AT&T 语法在 Unix 世界中占主导地位,因为 Unix 是创建的 在 AT&T 贝尔实验室。[2]

两者都可用于为基于 x86 的 CPU 编写汇编程序。汇编器将采用该语法并将其转换为操作系统可以加载并且 CPU 可以执行的二进制格式。

因此,至少在理论上,如果汇编器能够理解所提供的语法,则以任何一种语法编写的两个程序都应该编译成完全相同的二进制代码。

您使用哪种格式取决于您的汇编器支持什么。为了进一步混淆,还有其他变体,例如相当流行的 nasm。

【讨论】:

每当出现这些问题时,我都想知道为什么 AT&T/Bell 的人觉得有必要完全偏离英特尔在其文档中一直使用的完美语法。 @500-InternalServerError:是的。 gcc 将它用于 x86 是因为旧的 x86-Unix 工具链已经开创了先例,但是 IDK 为什么有人首先发明了它。不过,常量和寄存器名称的修饰确实有一些优点。不过,GNU 汇编器可能仍然有不兼容的 .align / .globl 指令与 align / global

以上是关于是否可以在 Intel 语法中为 AMD 处理器编写 ASM 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道自己的AMD处理器是否支持安装黑苹果?

小新pro13 intel和amd买哪个

有钱是Intel的最大优势,AMD恐怕很难有翻身的机会了

英特尔在 Windows 操作系统上与 AMD 等效的 HAXM

AMD系列CPU

国产处理器再获重大突破,走出国门挑战Intel和AMD