簡體   English   中英

如何在Linux C內聯匯編中使用宏

[英]How to use a macro in linux C inline assembly

我想調用由其他配置結果確定的地址。 該調用是內聯匯編中的。

當前,就像這樣,並已手動對其進行了修改:

asm volatile ("call 0xc0200c20\n\t");

我的問題是我可以這樣寫嗎?

#define CALL_ADDR 0xC0200c20

asm volatile ("call CALL_ADDR\n\t");

謝謝!

只需普通的字符串連接就可以解決問題,它使用兩個包裝宏來創建值的字符串化版本:

#define QUAUX(X) #X
#define QU(X) QUAUX(X)

asm volatile ("call " QU(CALL_ADDR) "\n\t");

將我的評論提升為答案:

gcc的內聯匯編操作數的P修飾符可阻止編譯器在生成的匯編代碼中發出“常量指示前綴”。 請參閱鏈接的參考,以獲得更詳細的解釋,並引用Linus。

如果您嘗試過:

#define CALL_ADDR 12345678
asm volatile("call %0\n\t" :: "i"(CALL_ADDR));

您注意到從匯編程序中收到錯誤,因為生成的代碼顯示call $12345678 ,這不是有效的匯編語法。 相反,使用%P0可使編譯器在開始時發出$ ,這很好。

此處不需要使用預處理程序字符串串聯-缺點是,正如您所發現的,需要“嵌套”(兩級宏),以便在完成串聯之前擴展CALL_ADDR

暫無
暫無

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

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