Вот ассемблерный код bootcode.S
.section boot, "ax", %progbits
get_intid:
#if INTGRP==NSG1
#warning taking NSG1
mrs x0, s3_0_c12_c12_0
#else
#warning taking G0
mrs x0, s3_0_c12_c8_0
#endif
ret
.end
Теперь я хочу сделать предварительную обработку, чтобы по переменной INTGRP (либо NSG1, либо G0) в файле .S выбиралась соответствующая строка, а результат записывался бы в файл .s.
Когда я пытаюсь gcc -E -DINTGRP=G0
, он всегда выбирает вторую строку. На самом деле это не зависит от опции -D. Итак, как я должен дать команду, чтобы часть #if стала истинной?
ДОБАВИТЬ:
по комментариям я понял, что не так. Итак, правильный метод:
.section boot, "ax", %progbits
#define G0 0
#define NSG1 1
get_intid:
#if INTGRP==NSG1
#warning taking NSG1
mrs x0, s3_0_c12_c12_0
#else
#warning taking G0
mrs x0, s3_0_c12_c8_0
#endif
ret
.end
и используйте команду
cc -E -DINTGRP=0 bootcode.S -o bootcode.s
or
cc -E -DINTGRP=1 bootcode.S -o bootcode.s
Спасибо за помощь!
G0
иNSG1
будут определены? Предоставьте полный минимально воспроизводимый пример. (под другим углом к той же проблеме, упомянутой Питером Кордесом ниже) - person Yunnosch   schedule 04.05.2021==
всегда является числовым, не сравнивая имена токенов. Неопределенные имена токенов оцениваются как0
в#if
выражениях (после раскрытия любых определенных макросов). Похоже на дубликат. - person Peter Cordes   schedule 04.05.2021cc -E
с определенным значением. Я обновлю вопрос прямо сейчас. - person Chan Kim   schedule 04.05.2021#ifdef INTGRP_USE_NSG1
, а другой параметр неявно — G0. Меньше строк настройки, чтобы заставить его работать. Магические числа (0 и 1) в командной строке компилятора не лучше, чем-DINTGRP_USE_NSG1
или-UINTGRP_USE_NSG1
(или ничего). - person Peter Cordes   schedule 04.05.2021cc -c -D... foo.S
выполняете предварительную обработку и сборку за один шаг. В этом весь смысл использования заглавных.S
имен файлов. - person Peter Cordes   schedule 04.05.2021