| 123456789101112131415161718192021222324252627282930 | .var ticket
.var turn
.var count
.main
.top	
.acquire
mov $1, %ax
fetchadd %ax, ticket  # grab a ticket (keep it in dx)
.tryagain
mov turn, %cx         # check if it's your turn 
test %cx, %ax
jne .tryagain
# critical section
mov  count, %ax       # get the value at the address
add  $1, %ax          # increment it
mov  %ax, count       # store it back
# release lock
mov $1, %ax
fetchadd %ax, turn
# see if we're still looping
sub  $1, %bx
test $0, %bx
jgt .top	
halt
 |