用于MIPS的GNU汇编程序:如何发出sync_ *指令?

时间:2010-08-30 10:32:03

标签: gcc mips assembly gas

MIPS32 ISA为 sync 指令定义了以下格式:

SYNC (stype = 0 implied)
SYNC stype

这里,stype可以是SYNC_WMB(SYNC 4),SYNC_MB(SYNC 16)等。 在内联汇编程序中,我可以使用默认同步:__asm__ volatile ("sync" ::);

但是,如果我写的是__asm__ volatile ("sync 0x10" ::)之类的东西,它就不会编译:

Error: illegal operands 'sync 0x10'

如果向gcc传递-mips32r2选项,则相同。

所以,问题是:如何使用GCC内联汇编的SYNC_ *(WYNC_WMB,SYNC_MB,SYNC_ACQUIRE,...)指令?

1 个答案:

答案 0 :(得分:2)

我怀疑您的binutils太旧了 - 看起来只支持版本2.20。

作为一种解决方法,如果您无法轻松升级binutils,可以手动构建操作码。

sync是一个操作码0指令,带有0xf的功能代码(位5..0),这种形式对移位量字段中的同步类型进行编码(位10 .. 6)。所以,例如sync 0x10

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