[英]How to write .syntax unified UAL ARMv7 inline assembly in GCC?
我想編寫統一的程序集以消除我的文字前面的討厭#
,如在: 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 中測試。
開發人員很快再次回復了這個問題: https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648#c3 並在以下位置提交了補丁: https : //github.com/gcc-mirror/gcc/ commit/2fd2b9b8425f9fc4ad98d48a0ca41b921dd75bd9 (8.2.0 后)修復-masm-syntax-unified
。 驚人的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.