2013-08-20 2 views
3

Я использую, arm-linux-gnueabi-gcc для компиляции программ C для процессора ARM в Linux. Однако я не уверен, что такое режим ARM по умолчанию, для которого он компилируется.Параметры компилятора arm-linux-gnueabi

Например, для кода C:

test.c

unsigned int main() 
{ 
    return 0x1ffff; 
} 

arm-linux-gnueabi-gcc -o test test.c 

теперь, когда я смотрю на разборке основной функции() с objdump, я могу видеть:

arm-linux-gnueabi-objdump -d test 

<main>: 

    push {r7} 
    add r7, sp, #0 
    movw r3, #65535 ; 0xffff 
    movt r3, #1 
    mov r0, r3 
    mov sp, r7 
    pop {r7} 
    bx lr 

похоже, что это разборка для режима громкоговорителей ARM (из-за команды push).

Как я могу отобразить разборку следующим образом:

 .sect ".text" 
     .global _fn 
_fn: MOVW A1,#65535 
     MOVT A1,#1 

     BX LR 

или это

 .sect ".text" 
     .global _fn 
_fn: LDR A1, CON1 
     BX LR 

     .sect ".text" 
     .align 4 
CON1: .word 0x1ffff 

Я видел этот пример здесь:

http://e2e.ti.com/support/development_tools/compiler/f/343/t/40580.aspx

однако, я не могу просмотрите разборку так, как она отображается там.

Спасибо.

ответ

2

push не обязательно говорит вам, что это находится в режиме большого пальца, в новой сборке синтаксисе факта ARM под названием unified assembly language, что означает, в большинстве случаев вы можете скомпилировать же код arm или thumb-2 наборов инструкций.

Другая проблема заключается в том, что вы компилируете в режиме -O0, который добавляет некоторые дополнительные инструкции для легкой отладки. Попробуйте -O2, и вы должны получить требуемый поток команд.

gcc с -v переключатель как в arm-linux-gnueabi-gcc -v должен показать вам, как он построен, что также указывает общие параметры по умолчанию, которые он использует при компиляции исходного кода.

Одна последняя вещь, целевая последовательность сборки вы упомянули использует ATPCS регистров схема именования (проверить objdump doc для информации), он использует a1 вместо r0, например. Вы также можете получить это, установив disassembler-options в objdump с переключателем -M. Как показано ниже;

$ arm-linux-gnueabihf-gcc -c -O2 -o test test.c 
$ arm-linux-gnueabihf-objdump -M reg-names-special-atpcs -d test 

test:  file format elf32-littlearm 


Disassembly of section .text.startup: 

00000000 <main>: 
    0: f64f 70ff movw a1, #65535 ; 0xffff 
    4: f2c0 0001 movt a1, #1 
    8: 4770  bx LR 
    a: bf00  nop 

Другой вариант, чтобы получить выход сборки из самого gcc с помощью -S переключателя. Как показано ниже;

$ arm-linux-gnueabihf-gcc -S test.c 

то вы должны получить новый файл с именем test.s в той же папке. Однако я не знаю, есть ли у вас возможность установить имена имен в регистре.

+0

Спасибо :) Я понял. Кроме того, вы заметили второй пример разборки, упомянутый выше? В этом случае вместо перемещения значения в регистре A1 он загружает значение из константы CON1. Кроме того, в разборке не упоминаются разные ключевые слова, такие как .global, .align, .word. –

+0

Я обновил ответ, чтобы добавить еще один способ создания сборки, где вы можете играть, чтобы получить аналогичный вывод, например, вы поделились. Другое дело, вы не замечаете, что они упоминают компилятор TI C/C++. Вероятно, они получили сборку этого компилятора. – auselen

0

Я считаю, что по умолчанию режим Thumb:

arm-linux-gnueabi-gcc -S -mthumb test.c 

Полные инструкции ARM могут быть получены с использованием -marm флага:

arm-linux-gnueabi-gcc -S -marm test.c