arm-G CC для компиляции ASM-файла - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь скомпилировать простой файл "asm" с G CC, чтобы понять компиляцию. test.h:

#define APPLICATION_EXIT .end

test.asm:

#include "test.h"
APPLICATION_EXIT

при запуске:

arm-none-eabi-gcc-9.2.1.exe -mcpu=cortex-m7 -mthumb -g -c .\test.asm

Я получил:

arm-none-eabi-gcc-9.2.1.exe: warning: .\test.asm: linker input file unused because linking not done

но ничего не сгенерировано, нет файла "out". Я пытаюсь запустить

arm-none-eabi-as -mcpu=cortex-m7 -mthumb -g -c .\test.asm

Я получил:

.\test.asm: Assembler messages:
.\test.asm:2: Error: bad instruction `application_exit'

Похоже, что AS работает, но макрос не работает работать. когда я изменяю test.asm на:

#include "test.h"
.end

arm-none-eabi-as -mcpu=cortex-m7 -mthumb -g -c .\test.asm работает. Я получил a.out.

Я неправильно использовал G CC? сыворотка G cc не может запустить бэкэнд "as" напрямую? Почему не работает макрос #define? Спасибо большое, я благодарен за любые комментарии.

1 Ответ

1 голос
/ 11 марта 2020

Вы можете увидеть в руководстве g cc , какие расширения имени файла распознаются. .asm не указан, поскольку исходные файлы на ассемблере в Unix традиционно называются .s или .S (заглавные S, помните, Unix имена файлов чувствительны к регистру), если они должны быть пропущены через C препроцессор. (Макрос в стиле C и расширение include обрабатываются препроцессором C, а не самим ассемблером, поэтому он не работает при непосредственном запуске as.)

Файлы не в противном случае предполагается, что объектные файлы передаются компоновщику, но поскольку вы указали -c, компоновщик запускать не нужно, поэтому gcc считает, что делать нечего.

Вы можете либо переименуйте файл, чтобы он заканчивался на .S, либо используйте опцию -x assembler-with-cpp, чтобы явно указать g cc, что делать с этим файлом. Или вы можете сначала запустить cpp в своем файле, чтобы развернуть макросы и включения, а затем запустить as для полученного результата (или передать один в другой).

...