簡體   English   中英

m68k-elf 目標是否支持 GCC 內聯 asm goto?

[英]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 標簽。 任何解決此問題的幫助將不勝感激。

是的,它受支持。 我認為問題在於您的代碼,它有幾個錯誤:

  1. 要使用 goto 功能,您需要使用asm goto關鍵字啟動內聯匯編語句。 你錯過了goto

  2. label 操作數在輸入操作數之后按順序編號(當然不能有輸出)。 所以failed是操作數 4,因此您需要使用bcc %l4而不是%l0來引用它。

通過這些更改,我能夠編譯代碼。


順便說一句,我對 m68k 程序集不太了解,但看起來你正在破壞寄存器d1以及任何_BURAM子例程破壞器,但這些還沒有被聲明為破壞器。 您不應該將"d1"和 rest 與"cc"一起添加嗎?

此外,您似乎希望將操作數d0_fcodea0_info等放入那些特定的寄存器中,大概是因為_BURAM期望它們在那里。 你有那些變量定義register asm告訴編譯器,例如register int d0_fcode asm("d0"); ? 否則,它可以例如選擇d4作為d0_fcode操作數。 在我的測試中,碰巧將它們放入所需的寄存器中,而沒有明確詢問,但這並不安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM