.var mutex .var count .main .top .acquire mov mutex, %ax test $0, %ax jne .acquire mov $1, %ax xchg %ax, mutex # atomic swap of 1 and mutex test $0, %ax # if we get 0 back: lock is free! jne .acquire # if not, try again # 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 $0, mutex # see if we're still looping sub $1, %bx test $0, %bx jgt .top halt