/drivers/usb/usbftdi/linkedlist.inc |
---|
0,0 → 1,55 |
head dd 1 |
node equ ftdi_context |
node.next equ ftdi_context.next_context |
linkedlist: |
.init: |
push eax |
xor eax, eax |
mov [head], eax |
pop eax |
ret |
.add: |
push ebx |
mov ebx, [head] |
mov [head], eax |
mov [eax + node.next], ebx |
pop ebx |
ret |
.delete: |
push ebx ecx |
mov ebx, eax ; eax - pointer to node for delete |
cmp eax, [head] |
jz .unlink_head |
.getnext: |
cmp [ebx+node.next], eax |
jz .unlink |
cmp [ebx+node.next], 0 |
jz .invalid_pointer |
mov ebx, [ebx+node.next] |
jmp .getnext |
.unlink: |
mov ecx, [eax+node.next] |
mov [ebx+node.next], ecx |
jmp @f |
.unlink_head: |
mov ebx, [eax+node.next] |
mov [head], ebx |
@@: |
mov ecx, eax |
call Kfree |
.invalid_pointer: |
pop ecx ebx |
ret |
.gethead: |
mov eax, [head] |
ret |
restore node |
restore next |