Я хочу написать унифицированную сборку, чтобы избавиться от надоедливых #
перед моими литералами, как указано в: Требуется ли хэш для непосредственных значений в сборке ARM?
Это минимальный неунифицированный код с #
:
#include <assert.h>
#include <inttypes.h>
int main(void) {
uint32_t io = 0;
__asm__ (
"add %0, %0, #1;"
: "+r" (io)
:
:
);
assert(io == 1);
}
, который компилируется и позже работает нормально под QEMU:
arm-linux-gnueabihf-gcc -c -ggdb3 -march=armv7-a -pedantic -std=c99 -Wall -Wextra \
-fno-pie -no-pie -marm -o 'tmp.o' 'tmp.c'
Если я попытаюсь удалить #
, код завершится неудачно с:
/tmp/user/20321/ccoBzpSK.s: Assembler messages:
/tmp/user/20321/ccoBzpSK.s:51: Error: shift expression expected -- `add r3,r3,1'
, как и ожидалось, поскольку неунифицированный, по умолчанию, кажется.
Как заставить это работать?
Я нашел многообещающий вариант:
gcc -masm-syntax-unified
но добавление не помогло.
Если я вместо этого напишу:
".syntax unified; add %0, %0, #1;"
тогда это работает, но я должен был бы делать это для каждого __asm__
, что не практично.
Пользовательский интерфейс также обнаружил, что без -marm
тогда он использует унифицированную сборку, но генерирует код большого пальца, который мне не нужен.
Возможно, эта ошибка является основной причиной проблемы: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648
Протестировано в arm-linux-gnueabi-gcc 5.4.0, Ubuntu 18.04.