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,...)指令?
答案 0 :(得分:2)
我怀疑您的binutils太旧了 - 看起来只支持版本2.20。
作为一种解决方法,如果您无法轻松升级binutils,可以手动构建操作码。
sync
是一个操作码0指令,带有0xf
的功能代码(位5..0),这种形式对移位量字段中的同步类型进行编码(位10 .. 6)。所以,例如sync 0x10
:
__asm__ volatile(".word (0x0000000f | (0x10 << 6))");