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