2011-03-03 147 views
1

我想在我的C程序中寫一個非常簡單的內聯彙編程序,該程序不會執行任何操作,然後將本地寄存器%l0 - %l7設置爲不同的值 。我嘗試了以下直接的方法:SPARC彙編問題

asm volatile (
    ".text\n\t" 
    "mov 0, %%l0    \n\t" 
    "mov 1, %%l1    \n\t" 
    "mov 2, %%l2    \n\t" 
    "mov 3, %%l3    \n\t" 
    "mov 4, %%l4    \n\t" 
    "mov 5, %%l5    \n\t" 
    "mov 6, %%l6    \n\t" 
    "mov 7, %%l7    \n\t" 
); 

不幸的是,彙編器告訴:每個指令的非法操作數。有人能夠很高興地指出我可以如何正確傳遞即時值到SPARC彙編器嗎?

非常感謝!

編輯:謝謝克里斯,我給你建議,但在SPARC編譯器還告訴一些東西非法操作數的變化...

+0

這裏真的有兩%%嗎? – 2011-03-03 18:32:11

回答

0

你想要線條狀mov 0, %%l0 - 那麼源目標和常量只是常數,沒有'#'字符。

編輯

如果你在你的彙編指令(只是一個字符串)沒有約束,那麼GCC不處理用於%-escapes的字符串。所以在這種情況下,你只需要在寄存器名稱之前的單個%個字符。但是,如果添加任何約束(或者在字符串之後加上:: - 一個空的約束集),它將查找%-escapes,因此您需要%%作爲寄存器名稱。

因此,要麼在)之前添加::,要麼刪除%字符。

1

SPARC不會「即時移動」指令,有or可用於像or %g0, 123, %l0(或零位寄存器,%g0,或導致移動所述常數到目標寄存器不超過11​​位常數),或sethi指令,可用於將寄存器的21位設置爲上部。爲了適應的任何(32位)常數,您因此必須先合成一個兩步驟set,首先對高位進行sethi,然後對or進行低位合併。

SPARC組裝者通常知道創建該序列的快捷方式,並且/或者如果該常數適合該指令,則刪除一條指令。

還要注意的是,在64位/ sparcv9中,set指令可能最終評估爲最多五條指令的序列,將一些事情移到一起。