1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- .686
- .model FLAT
- PUBLIC _lifo_push
- _TEXT SEGMENT
- lifo = 4 ; size = 4
- entry = 8 ; size = 4
- _lifo_push PROC
- mov ecx, DWORD PTR 4[esp] ; ecx holds lifo
- mov edx, DWORD PTR 8[esp] ; edx holds the new entry
- again:
- mov eax, DWORD PTR [ecx] ; eax holds the old head
- mov DWORD PTR[edx], eax ; new node's 'next' is set to the old head
- lock cmpxchg DWORD PTR [ecx], edx
- jnz again
- ret 0
- _lifo_push ENDP
- PUBLIC _lifo_pop
- _TEXT SEGMENT
- lifo = 4 ; size = 4
- _lifo_pop PROC
- push esi
- push ebx
- mov esi, DWORD PTR 12[esp] ; esi holds lifo
- again:
- ; if re-ordered loads become an issue, we could use cmpxchg8b to read in (after zeroing ebx/ecx) or maybe use movq
- mov edx, DWORD PTR [esi+4] ; counter
- ; or we could put an LFENCE here
- mov eax, DWORD PTR [esi] ; pointer
- test eax, eax
- jz bail
- mov ecx, edx ; counter
- mov ebx, DWORD PTR [eax] ; pointer->next
- inc ecx
- lock cmpxchg8b QWORD PTR [esi]
- jnz again
- bail:
- pop ebx
- pop esi
- ret 0
- _lifo_pop ENDP
- _TEXT ENDS
- END
|