首页 > 解决方案 > 如何在程序集中的单链表中正确获取链接?

问题描述

我应该使用程序集(masm x86)实现一个单链表。

到目前为止,我已经完成了“附加”功能和“打印”功能,但我无法弄清楚问题出在哪里(代码编译但一旦我尝试运行它就什么也不做)。我希望有人能指出我犯的错误。

'append' 函数的参数是offset firstgivenKey

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 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中。mallocmsvcrt.lib

标签: assemblyx86masm

解决方案


推荐阅读