Я возился с какой-то сборкой x86, так как она появлялась во многих моих уроках. В частности, я хотел показать сравнение и обмен (CAS) как пользовательскую функцию. Это сделано для того, чтобы я мог реализовать свои собственные блокировки.
Я использую Linux 2.6.31 с GCC 4.1.1 на процессоре Intel.
У меня есть следующее:
// 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
Это файл * .s, который я компилирую с моей программой драйвера. Когда я включаю строку
lock cmpxchgl %edx, %ecx
и выполнить, я получаю ошибку «Недопустимая инструкция».
Когда я заменяю строку на
cmpxchgl %edx, %ecx
мой код работает нормально.
Прежде всего, 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