我必須實現應該是原子操作的set_bit函數。我在linux源代碼中發現了這個彙編代碼。 (我正在使用sparc),並希望將其更改爲可在C程序中使用的函數。使用匯編語言編寫C程序的函數
static void set_bit(unsigned int nr, unsigned int *addr)
{
// *vec |= 1<<bit; <== original non-atomic C code
//set_bit: /* %o0=nr, %o1=addr */ <== nr is in %o0, addr in %o1 by sparc rule
__asm__ __volatile__ (
"srlx %o0, 6, %g1"
"mov 1, %o2"
"sllx %g1, 3, %g3"
"and %o0, 63, %g2"
"sllx %o2, %g2, %o2"
"add %o1, %g3, %o1"
"1: ldx [%o1], %g7"
"or %g7, %o2, %g1"
"casx [%o1], %g7, %g1"
"cmp %g7, %g1"
"bne,pn %xcc, 2f"
"nop"
"retl"
"nop"
: "=m"(addr) // output
: "m"(nr) // input
:);
這是正確的嗎?我最後一行列出所有clobberd寄存器嗎?
我看到下面的錯誤消息..
../../../../../rtems-4.10.99-src/c/src/libchip/sdmmc/ald-sd-card.c:135:1: error: invalid 'asm': invalid operand output code
__asm__ __volatile__ (
^
../../../../../rtems-4.10.99-src/c/src/libchip/sdmmc/ald-sd-card.c:135:1: error: invalid 'asm': invalid operand output code
../../../../../rtems-4.10.99-src/c/src/libchip/sdmmc/ald-sd-card.c:135:1: error: invalid 'asm': operand number out of range
^
如果您不需要彙編,只需讓編譯器處理它並使用'__atomic_or_fetch'。 – Jester
你的意思是把它放在哪裏?例如,如果我有代碼set_bit(nr,&events); ?你的意思是像__atomic_or_fetch * vec | = 1 << bit; ? –
你可以放在那裏,當然也可以放在'set_bit'中。不,你使用它像'__atomic_or_fetch(addr,1 << nr,__ATOMIC_SEQ_CST)'。 – Jester