[英]Is GCC inline asm goto supported in the m68k-elf target?
我正在開發一個項目,其中包含許多圍繞 M68000 asm 調用的 C 包裝器。 其中一些調用在條件代碼寄存器上返回成功/失敗狀態,因此根據 CC 的狀態“轉到”C label 將是理想的。 然而,無論我嘗試什么排列,我都會不斷地從編譯器中得到語法錯誤。
(這是 gcc 10.2.0 --with-cpu=m68000)
示例代碼:
asm(R"(
moveq #0, d1
jsr %p0
bcc %l0
2:
)":
:
"i"(_BURAM),
"d"(d0_fcode),
"a"(a0_info),
"a"(a1_data)
:
"cc"
: failed);
return true;
failed:
return false;
這產生的錯誤是:
/home/ryou/Projects/megadev/lib/sub/bram.h: In function 'bram_brmwrite':
/home/ryou/Projects/megadev/lib/sub/bram.h:156:7: error: expected ')' before ':' token
156 | "cc"
| ^
| )
157 | : failed);
| ~
/home/ryou/Projects/megadev/lib/sub/bram.h:144:5: note: to match this '('
144 | asm(R"(
| ^
我嘗試使用最簡單的示例來進行測試:
asm("bra %l0" :::: failed);
我仍然得到:
/home/ryou/Projects/megadev/lib/sub/bram.h:144:18: error: expected ')' before '::' token
144 | asm("bra %l0" :::: failed);
我在這里找到的唯一其他一些相關的信息是: Extended asm with goto,包括來自 gcc 文檔的示例,無法編譯
但是,正如您在兩個示例中看到的那樣,我沒有使用任何輸出。 我假設 m68k-elf 目標特別不支持這一點,但我真的不明白為什么它不支持,而且我沒有找到任何文檔說這么多。
有一些方法可以解決這個問題(即通過檢查 asm 片段本身中 CC 的 state 並將狀態推送到 output 寄存器),但如果可能的話,我想使用 goto 標簽。 任何解決此問題的幫助將不勝感激。
是的,它受支持。 我認為問題在於您的代碼,它有幾個錯誤:
要使用 goto 功能,您需要使用asm goto
關鍵字啟動內聯匯編語句。 你錯過了goto
。
label 操作數在輸入操作數之后按順序編號(當然不能有輸出)。 所以failed
是操作數 4,因此您需要使用bcc %l4
而不是%l0
來引用它。
通過這些更改,我能夠編譯代碼。
順便說一句,我對 m68k 程序集不太了解,但看起來你正在破壞寄存器d1
以及任何_BURAM
子例程破壞器,但這些還沒有被聲明為破壞器。 您不應該將"d1"
和 rest 與"cc"
一起添加嗎?
此外,您似乎希望將操作數d0_fcode
、 a0_info
等放入那些特定的寄存器中,大概是因為_BURAM
期望它們在那里。 你有那些變量定義register asm
告訴編譯器,例如register int d0_fcode asm("d0");
? 否則,它可以例如選擇d4
作為d0_fcode
操作數。 在我的測試中,碰巧將它們放入所需的寄存器中,而沒有明確詢問,但這並不安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.