1

組み込み ARM デバイス用のプログラムをコンパイルしており、あるブートローダーから別のブートローダーに切り替えたいと考えています。どちらのブートローダも (同じタイプのデバイス用に) アセンブラで記述されていますが、問題はそれらが異なる方言/フレーバーであることです (おそらく Intel と 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

オペランドの順序とコメント スタイルが異なることに注意してください。この 2 番目のブロックはどのタイプのアセンブラですか? この形式を期待して解析するようにgccに指示できますか?

4

2 に答える 2

3

The first one is GNU gas syntax, the second is ARM's commercial toolchain syntax.

The formats (directives and label definitions) are not compatible, although the instruction syntax itself is. Assembling the one with the other is not possible, but the generated object files can be linked together.

Your code examples contain no instructions however, only various assembler directives allocating space for stack and heap.

于 2012-08-23T18:19:17.837 に答える
1

前者は私には AT&T のように見え、後者は Intel のように見えます。GCCには、使用するフレーバーを変更するオプションがあるとは思いません(GASAT&Tを使用する(GNUアセンブラー)を介してすべてのアセンブリを実行するため)。ただし、C の呼び出し規則を少し学習すれば、NASM (Intel 構文を使用するがインライン化できない Netwide Assembler) を使用できます。Cヘッダーの1つに次のような定義を作成するだけです:

extern void assembly_boot();

次に、アセンブリでそれを実装します (はい、接頭辞のアンダースコアは正しいです)。

global _assembly_boot
_assembly_boot:
  ;Blah blah blah

注: この例は、C の呼び出し規則を実装していません。アセンブリを C から呼び出せるようにする場合は、C 呼び出し規約を使用する必要があります。それらをググってください。

于 2012-08-18T14:34:19.133 に答える