我想编写统一的程序集来摆脱烦人的问题#
在我的文字前面,如下所述: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__
这是不切实际的。
UI还发现,没有-marm
,那么它确实使用统一汇编,但它生成拇指代码,这是我不想要的。
也许这个错误是问题的根本原因:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648
在arm-linux-gnueabi-gcc 5.4.0、Ubuntu 18.04 中测试。