/*
* - spin lock aessembly code.
*
* Implement spin lock in assembly level.
*/
#include <sys/types.h>
#include <pthread.h>
#include "lab2_sync_types.h"
#define LOCK_PREFIX "lock\n\t"
void atomic_add( int * value, int add_val) {
asm volatile(
LOCK_PREFIX
"addl %1, %0 \n\t"
: "+m"(*value)
: "ir"(add_val)
: /*no clobber-list*/
); }
void atomic_sub( int * value, int dec_val) {
asm volatile(
LOCK_PREFIX
"subl %1, %0 \n\t"
: "+m"(*value)
: "ir"(dec_val)
: /*no clobber-list*/
);
}
void atomic_inc( int * value) {
asm volatile(
LOCK_PREFIX
"incl %0 \n\t"
: "+m"(*value)
: /* no input */
: /*no clobber-list*/
);
}
void atomic_dec( int * value) {
asm volatile(
LOCK_PREFIX
"decl %0 \n\t"
: "+m"(*value)
: /* no input */
: /*no clobber-list*/
);
}
void lab2_spin_lock(int volatile *lock) {
asm volatile(
"mov eax, 1 \n\t"
"loop: \n\t"
"xchg eax, %0 \n\t"
"test eax, eax \n\t"
"jnz loop \n\t"
:"=r"(*lock)
:
:"eax","cc"
);
}
void lab2_spin_unlock(int volatile *lock) {
asm volatile(
"mov eax, 0 \n\t"
"xchg eax, %0 \n\t"
:"=r"(*lock)
:
:"eax"
);
}
你好,谢谢你阅读这个问题。
我想知道什么样的约束(后面是:)我是否需要在这些代码下方使这个内联汇编功能正常。
万一你可能不遵循,这些都是装配中的自旋锁的实现。
如果你能给我一个解决方案,我将不胜感激。