$ as --32 -o main.o main.S
as
- это просто ассемблер, он переводит исходный код сборки в объектный код. Он не запускает препроцессор C, который должен расширяться #include
.
(#
- это символ комментария в синтаксисе GAS для x86, поэтому строка рассматривается как комментарий, если она видна вместо ассемблера вместо CPP)
Что вы можете сделать:
- Используйте
gcc
для сборки с соответствующим суффиксом файла (.S
или .sx
), он запустит препроцессор C перед запуском ассемблера. - Добавьте
-v
, чтобы увидеть, какие команды gcc
вызывает. - Если ваш источник имеет другой суффикс, вы можете
-x assembler-with-cpp source.asm
. - Если вы хотите см. промежуточный результат после предварительной обработки, добавьте
-save-temps
. Это позволит записать файл .s
с предварительно обработанным источником. - Если вы хотите передать параметр командной строки в
as
, вы можете, например, -Wa,--32
. Однако в данном случае лучше использовать параметры, которые понимает драйвер компилятора, например -m32
или -m16
. Драйвер знает о таких опциях, например, он также обслужит соответствующие опции при связывании, если вы связываетесь с gcc -m32 ...
, как указано ниже.
- Используйте
.include
директива ассемблера, которая обрабатывается самим ассемблером, а не препроцессором C.
Примечание: В случае 1. добавление включает пути поиска с помощью -I path
может работать не так, как ожидалось: драйвер компилятора (в данном случае gcc
) добавит -I path
только в командную строку ассемблера, если он знает, что это ассемблер GNU. Вы можете сказать это, когда компилятор сконфигурирован с помощью флага конфигурации --with-gnu-as
.
Примечание: Аналогичное относится к связыванию. Возможно, вы не захотите вызывать компоновщик (ld
вручную), если вы не создаете исполняемый или простой двоичный файл stati c; используйте gcc
или g++
вместо этого, если вы делаете обычный исполняемый файл для запуска на хост-системе. Он добавит много опций, необходимых для компоновки, таких как многолабильные пути, пути поиска и т. Д. c. который вы не хотите возиться вручную.
(int $0x10
- это 16-битный вызов B IOS, однако, который не будет работать в современной основной ОС, только в DOS или в устаревшей версии B IOS загрузчик.)