1

我正在为嵌入式 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

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

4

2 回答 2

3

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

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

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

于 2012-08-23T18:19:17.837 回答
1

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

extern void assembly_boot();

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

global _assembly_boot
_assembly_boot:
  ;Blah blah blah

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

于 2012-08-18T14:34:19.133 回答