2011-03-10 99 views
1

我有一個非常簡單的問題。我想編寫一些直接在單個寄存器上運行的彙編代碼(用於SPARC),稱爲%o1。我想要做的就是用零初始化該寄存器,然後用一些立即值遞增它。問題是,如何從C應用程序輸出%o1中的結果。骨架我有看起來像這樣:處理器註冊 - 應用程序變量關聯

void main() 
    { 
    int a; 

    asm volatile (
     ".text\n\t" 
      "mov 0, %o1     \n\t" 
     "add %o1, 1, %o1    \n\t" 
     "add %o1, 2, %o1    \n\t" 
     "add %o1, 3, %o1    \n\t" 
    );  

    // assign content of register %o1 somehow to variable a (a = %o1); 

    printf("%i\n", a); 
    } 

因此問題是我怎樣分配%O1的變量a的值(這應該通過的 計算結束是6),以便它可以被印刷在控制檯上。

回答

1

它依賴於編譯器。對於GCC:http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

void main() 
{ 
    int a; 

    asm(
    "mov 0, %0     \n\t" 
    "add %0, 1, %0    \n\t" 
    "add %0, 2, %0    \n\t" 
    "add %0, 3, %0    \n\t" 
    : "=r"(a) 
);  

    printf("%i\n", a); 
} 

更新:貌似GCC不允許對SPARC選擇特定的寄存器。 還有另一個擴展這一點:http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html

register int a asm ("o1"); 
+0

謝謝你,但在這種方式彙編器/編譯器使用他們選擇的註冊。我希望將註冊表綁定到%o1。這是否有可能? – Reini 2011-03-10 14:14:23

+0

更新了我的答案 – blaze 2011-03-10 16:02:22

0

這很大程度上取決於你的編譯器(你沒有告訴我們),查找它的文檔。對於海灣合作委員會的語法會像

int a __asm("%o1")__ = 78; 
相關問題