我一直在讨论一些x86程序集,因为它出现在我的许多课程中.特别是,我想将比较和交换(CAS)作为用户函数公开.这是为了我可以实现自己的锁.
我在Intel CPU上使用Linux 2.6.31和GCC 4.1.1.
我有以下内容:
// int cmpxchg(int *dest, int expected, int update)
.globl cmpxchg
cmpxchg:
pushl %ebp
movl %esp, %ebp
// edx holds dest
movl 8(%ebp), %edx
// eax holds expected value
movl 12(%ebp), %eax
// ecx holds the new value
movl 16(%ebp), %ecx
// cmpxchg dest_addr, exp_value
// compare to %eax is implicit
lock cmpxchgl %edx, %ecx
leave
ret
Run Code Online (Sandbox Code Playgroud)
这是在*.s文件中,我用我的驱动程序编译.当我包括该行
lock cmpxchgl %edx, %ecx
Run Code Online (Sandbox Code Playgroud)
并执行,我收到"非法指令"错误.当我用线替换
cmpxchgl %edx, %ecx
Run Code Online (Sandbox Code Playgroud)
我的代码似乎运行正常.
首先,有lock必要吗?我不确定是否cmpxchgl是天然的原子,所以我曾经lock确定过.作为用户地计划,我甚至被允许使用lock?
谢谢
================================================== ==============
我的最终代码(对于那些可能在将来徘徊的人):
// int cmpxchg(int *dest, int expected, int update)
.globl cmpxchg
cmpxchg:
pushl %ebp
movl %esp, %ebp
// edx holds dest, use eDx for Destination ;-)
movl 8(%ebp), %edx
// eax holds expected value implicitly
movl 12(%ebp), %eax
// cmpxchg dest_add, src_value
lock cmpxchgl %edx, 16(%ebp)
leave
ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6507 次 |
| 最近记录: |