我正在为嵌入式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期望这种格式并解析它吗?
答案 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调用约定。谷歌他们。