簡體   English   中英

在內聯匯編程序中使用寄存器

[英]Using register in inline assembler

我正在為OpenRISC優化C代碼,我想在寄存器中手動預先保存一些計算值,偽代碼看起來像這樣:

external loop
    compute eight values (heavy calculations)
    internal loop
        use values computed above

當我查看GCC ABI for OpenRISC時,我看到了兩組寄存器:callee-saved和temporary? 我應該使用哪些寄存器來存儲這八個值? 我的意思是,哪些寄存器可以放在內聯asm的破壞列表中?

我需要hardoce寄存器,因為我們在自定義OpenRISC上運行可執行文件。

答案是:無論你喜歡什么。

如果使用被叫方保存寄存器,則編譯器會保存你(只要將它們標記為慘敗)。

如果您使用臨時寄存器(也稱為調用者保存),那么如果您進行函數調用,編譯器將被強制保存它們。 請注意,編譯器也更喜歡將這些變量用於其他變量,因此如果你用掉了調用者保存的變量,那么它必須使用callee-save來處理其他變量,因此它可能最終會產生相同的差異。

在一天結束時,如果你正在進行繁重的計算,那么在開始之前將一些寄存器保存到堆棧中並不是什么大問題。

有些寄存器包含您不得覆蓋的重要值(例如堆棧指針)。 其他的,比如GOT表指針不那么重要,編譯器會在你完成時恢復它的值(只是確保在這個過程中你不需要它)。

實際上,您不需要自己解決:編譯器可以為您選擇寄存器:

int a, b, c;

asm volatile ("whatever" : "=&w" (a), "=&w" (b), "=&w" (c));

不需要變量,但它們必須分配寄存器,因此它們可以有效地為您想要的任何內容保留寄存器。 &表示“早期破壞”,這意味着它們不能與輸入寄存器共享相同的寄存器(不是我的示例顯示的任何寄存器)。

暫無
暫無

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

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