2010-08-30 389 views
2

MIPS32 ISA定義了同步指令的格式如下:MIPS的GNU彙編程序:如何發出sync_ *指令?

SYNC (stype = 0 implied) 
SYNC stype 

這裏,S類型可以是SYNC_WMB(SYNC 4),SYNC_MB(SYNC 16)等 在聯彙編器,我可以使用默認同步:__asm__ volatile ("sync" ::);

但是,如果我喜歡寫東西__asm__ volatile ("sync 0x10" ::),它不會編譯:

Error: illegal operands 'sync 0x10'

相同的,如果通-mips32r2選項GCC。

所以,問題是:如何使用GCC內聯程序集的SYNC_ *(WYNC_WMB,SYNC_MB,SYNC_ACQUIRE,...)指令?

回答

2

我懷疑你的binutils太老了 - 看起來這個支持只是在版本2.20中添加的。

作爲一種解決方法,如果您無法輕鬆升級binutils,則可以手動構建操作碼。

sync是一個操作碼0指令,其功能碼(位5..0)爲0xf,這種形式對位移量字段(位10..6)中的同步類型進行編碼。所以,例如對於sync 0x10

__asm__ volatile(".word (0x0000000f | (0x10 << 6))"); 
+0

好,恐怕不是那麼容易的,我的GCC是很新: 'MIPS-Linux的GNU-GCC(的Sourcery G ++精簡版4.2-85)4.2.1' 順便說一句,我現在還使用手動指令編碼: '#define EMIT_SYNC(stype)__asm__ volatile(「.int(%0 << 6)| 0x0f」::「n」(stype):「memory」) ;' 但這只是一個醜陋的解決方法。 – Andy 2010-08-31 06:04:47

+0

這裏是彙編程序的版本,而不是GCC的版本。 (如果知道彙編程序的安裝位置以及它的名稱,可以使用'mips-linux-gnu-as --version'查找版本;如果不是,則在編譯GCC時使用'-v'標誌,並在輸出中尋找類似'GNU彙編程序版本N.NN'的行。) – 2010-08-31 19:30:19

+0

看起來你是對的,我的彙編程序版本是2.18.50.20070820。謝謝,我會嘗試升級到2.20。 – Andy 2010-09-01 05:36:22