如何在gcc中指定汇编程序风格

如何在gcc中指定汇编程序风格,gcc,assembly,arm,Gcc,Assembly,Arm,我正在为嵌入式ARM设备编译一个程序,希望从一个引导加载程序切换到另一个引导加载程序。这两个引导加载程序都是用汇编语言编写的(对于相同类型的设备),但问题是它们的方言/风格不同(可能是英特尔和AT&T?)。现有的汇编代码在gcc中编译得很好,但我想使用的汇编代码却不能 例如,现有(工作)代码如下所示 /* Comments are c-style */ .syntax unified .arch armv7-m .section .stack .align

我正在为嵌入式ARM设备编译一个程序,希望从一个引导加载程序切换到另一个引导加载程序。这两个引导加载程序都是用汇编语言编写的(对于相同类型的设备),但问题是它们的方言/风格不同(可能是英特尔和AT&T?)。现有的汇编代码在gcc中编译得很好,但我想使用的汇编代码却不能

例如,现有(工作)代码如下所示

    /* Comments are c-style */
    .syntax unified
    .arch armv7-m
    .section .stack
    .align 3
#ifdef __STACK_SIZE
    .equ    Stack_Size, __STACK_SIZE
#else
    .equ    Stack_Size, 0xc00
#endif
    .globl    __StackTop
    .globl    __StackLimit
__StackLimit:
    .space    Stack_Size
    .size __StackLimit, . - __StackLimit
__StackTop:
    .size __StackTop, . - __StackTop
。。。我想用的代码是这样的

; comments are lisp-style
Stack_Size      EQU     0x00000400
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>  
Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
                PRESERVE8
                THUMB
;注释是lisp风格的
堆栈大小等于0x00000400
区域堆栈,NOINIT,读写,对齐=3
堆栈\内存空间堆栈\大小
__初始值
;  堆配置
;     堆大小(字节)
;   
堆大小等于0x00000200
面积堆,NOINIT,读写,对齐=3
__堆底
堆内存空间堆大小
__堆极限
保存
拇指

请注意操作数的顺序,注释样式不同。第二个块是什么类型的汇编程序?可以告诉gcc使用这种格式并对其进行解析吗?

在我看来,第一种格式类似于AT&T,第二种格式类似于Intel。我认为GCC没有改变它使用的风格的选项(因为它通过使用AT&t的
GAS
(GNU汇编程序)运行所有的汇编)。但是,如果您花一点时间学习C调用约定,您可以使用NASM(Netwide Assembler,它使用Intel语法但不能内联)。只需在其中一个C标题中创建一个类似这样的定义:

extern void assembly_boot();
然后在程序集中实现它(是的,前缀下划线是正确的):


注意:该示例没有实现C调用约定。如果希望程序集可以从C调用,则需要使用C调用约定。谷歌搜索它们。

第一个在我看来像AT&T,第二个像Intel。我认为GCC没有改变它使用的风格的选项(因为它通过使用AT&t的
GAS
(GNU汇编程序)运行所有的汇编)。但是,如果您花一点时间学习C调用约定,您可以使用NASM(Netwide Assembler,它使用Intel语法但不能内联)。只需在其中一个C标题中创建一个类似这样的定义:

extern void assembly_boot();
然后在程序集中实现它(是的,前缀下划线是正确的):


注意:该示例没有实现C调用约定。如果希望程序集可以从C调用,则需要使用C调用约定。谷歌搜索它们。

第一个是GNUGAS语法,第二个是ARM的商业工具链语法

格式(指令和标签定义)不兼容,尽管指令语法本身不兼容。不可能将一个文件与另一个文件组合在一起,但可以将生成的对象文件链接在一起


但是,您的代码示例不包含任何指令,只包含为堆栈和堆分配空间的各种汇编指令。

第一个是GNU gas语法,第二个是ARM的商业工具链语法

格式(指令和标签定义)不兼容,尽管指令语法本身不兼容。不可能将一个文件与另一个文件组合在一起,但可以将生成的对象文件链接在一起


但是,您的代码示例不包含任何指令,只包含为堆栈和堆分配空间的各种汇编指令。

AT&T与Intel语法仅适用于x86,而不适用于ARM。就像@unixsmurf在他的回答中所说的那样,您的示例只包含汇编指令和符号定义,而没有实际的ARM指令。指令的统一ARM/Thumb语法在两个汇编程序中实际上是相同的。在第一个示例中,注释是C样式的,因为.S文件首先通过C预处理器传递,正如您从#ifdef指令中看到的那样。gas使用“@”作为ARM的行注释字符。AT&T与Intel的语法仅适用于x86,而不适用于ARM。就像@unixsmurf在他的回答中所说的那样,您的示例只包含汇编指令和符号定义,而没有实际的ARM指令。指令的统一ARM/Thumb语法在两个汇编程序中实际上是相同的。在第一个示例中,注释是C样式的,因为.S文件首先通过C预处理器传递,正如您从#ifdef指令中看到的那样。gas使用“@”作为ARM的行注释字符。