Illegal instruction in ASM: lock cmpxchg dest, src

Ich ve wurde Herumspielen mit einigen x86 assembly, wie Ihr in vielen meiner Klassen. Insbesondere wollte ich aussetzen, compare-and-swap (CAS) als Benutzer-Funktion. Dies ist mit der Absicht, dass ich es umsetzen kann meine eigenen Schlösser.

Ich bin mit Linux 2.6.31 mit GCC 4.1.1 auf eine Intel CPU.

Habe ich Folgendes:

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

Dies ist innerhalb einer *.s-Datei, die ich kompilieren mit meiner Treiber-Programm. Wenn ich die Zeile

  lock cmpxchgl %edx, %ecx

und auszuführen, erhalte ich eine "Illegal instruction" Fehler.
Wenn ich ersetzen Sie die Zeile mit

  cmpxchgl %edx, %ecx

mein code scheint zu verlaufen.

First off, ist lock notwendig? Ich bin mir nicht sicher, ob cmpxchgl ist natürlich die Atom -, so habe ich lock um sicher zu sein. Als userland-Programm, bin ich auch nutzen darf lock?

Dank

================================================================

Mein letzten code (für diejenigen, die Wandern hier in der Zukunft):

//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
Schreibe einen Kommentar