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

时间:2012-08-18 02:09:58

标签: gcc assembly arm

我正在为嵌入式ARM设备编译程序,并希望从一个引导加载程序切换到另一个引导加载程序。两个引导加载程序都是用汇编语言编写的(对于相同类型的设备),但问题是它们是不同的方言/风格(可能是Intel vs 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

注意操作数的顺序,注释风格不同。这第二块是什么类型的汇编程序?可以告诉gcc期望这种格式并解析它吗?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

extern void assembly_boot();

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

global _assembly_boot
_assembly_boot:
  ;Blah blah blah

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