linux 汇编 cmp,使用汇编语言编写C程序的函数

我必须实现应该是原子操作的set_bit函数。我在linux源代码中发现了这个汇编代码。 (我正在使用sparc),并希望将其更改为可在C程序中使用的函数。使用汇编语言编写C程序的函数

static void set_bit(unsigned int nr, unsigned int *addr)

{

// *vec |= 1<

//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

^

2015-09-05

Chan Kim

+0

如果您不需要汇编,只需让编译器处理它并使用'__atomic_or_fetch'。 –

+0

你的意思是把它放在哪里?例如,如果我有代码set_bit(nr,&events); ?你的意思是像__atomic_or_fetch * vec | = 1 << bit; ? –

+0

你可以放在那里,当然也可以放在'set_bit'中。不,你使用它像'__atomic_or_fetch(addr,1 << nr,__ATOMIC_SEQ_CST)'。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值