Как получить ссылки прямо в односвязном списке в сборке? - PullRequest
0 голосов
/ 22 мая 2019

Я должен реализовать односвязный список с использованием ассемблера (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.

...