Я должен реализовать односвязный список с использованием ассемблера (masm x86).
Я уже выполнил функцию 'append' и функцию 'print', но я не могу понять, в чем проблема (код компилируется, но ничего не делает, когда я пытаюсь его запустить) , Я надеюсь, что кто-то укажет на ошибки, которые я сделал.
Параметры функции append: offset first
и givenKey
append proc
push ebp
mov ebp, esp
mov ebx, [ebp+8]
allocate:
push len
call malloc
add esp, 4
mov esi, [ebp+12]
mov dword ptr [eax], esi
mov dword ptr [eax+4], 0
is_first:
cmp dword ptr [ebx], 0
je first?
next:
cmp dword ptr [ebx+4], 0
je add_last
mov ebx, [ebx+4]
jmp next
first?:
mov dword ptr[first], esi
jmp done
add_last:
mov [ebx+4], eax
mov eax, dword ptr [eax]
mov dword ptr [ebx+4], eax
jmp done
done:
mov esp, ebp
pop ebp
ret 8
append endp
Это мои переменные и структура данных:
Node struct
key dd 0
next dd 0
Node ends
first Node {0, 0}
len equ sizeof Node
format db "%d ", 0
И, наконец, функция print (которая не имеет параметров):
print proc
push ebp
mov ebp, esp
mov ebx, offset first
et:
cmp dword ptr [ebx], 0
je done
push dword ptr [ebx]
push offset format
call printf
add esp, 8
mov ebx, [ebx+4]
jmp et
done:
mov esp, ebp
pop ebp
ret
print endp
Если я попытаюсь добавить одно число и распечатать список, он будет работать как положено. Для двух чисел печатается только первое, а затем происходит сбой, а для трех и более чисел просто происходит сбой.
Функции printf
и malloc
включены с msvcrt.lib
.