|
|
- # array of 2 integers (each size 4 bytes)
- # load address of flag into fx register
- # access flag[] with 0(%fx,%index,4)
- # where %index is a register holding 0 or 1
- # index reg contains 0 -> flag[0], if 1->flag[1]
- .var flag 2
-
- # global turn variable
- .var turn
-
- # global count
- .var count
-
- .main
-
- # put address of flag into fx
- lea flag, %fx
-
- # assume thread ID is in bx (0 or 1, scale by 4 to get proper flag address)
- mov %bx, %cx # bx: self, now copies to cx
- neg %cx # cx: - self
- add $1, %cx # cx: 1 - self
-
- .acquire
- mov $1, 0(%fx,%bx,4) # flag[self] = 1
- mov %cx, turn # turn = 1 - self
-
- .spin1
- mov 0(%fx,%cx,4), %ax # flag[1-self]
- test $1, %ax
- jne .fini # if flag[1-self] != 1, skip past loop to .fini
-
- .spin2 # just labeled for fun, not needed
- mov turn, %ax
- test %cx, %ax # compare 'turn' and '1 - self'
- je .spin1 # if turn==1-self, go back and start spin again
-
- # fall out of spin
- .fini
-
- # do critical section now
- mov count, %ax
- add $1, %ax
- mov %ax, count
-
- .release
- mov $0, 0(%fx,%bx,4) # flag[self] = 0
-
-
- # end case: make sure it's other's turn
- mov %cx, turn # turn = 1 - self
- halt
-
|