2010-08-30 123 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