assembly - 如何在程序集中的单链表中正确获取链接?
问题描述
我应该使用程序集(masm x86)实现一个单链表。
到目前为止,我已经完成了“附加”功能和“打印”功能,但我无法弄清楚问题出在哪里(代码编译但一旦我尝试运行它就什么也不做)。我希望有人能指出我犯的错误。
'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 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
解决方案
推荐阅读
- angular - 如何从 li 级别隐藏父 ul?
- .htaccess - 301 重定向路由 - .htaccess 代码以删除原始路由的附加查询字符串
- java - Java模式匹配器没有相应地分组
- c# - 在 Azure 函数中将 Post 文件转换为 Pdf
- python - cx_Freeze 生成带有 initfsencoding 问题的文件
- scikit-learn - 使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证
- java - 如何将大数从一个基数转换为另一个基数
- android - Android 上的 EasyPermissions 不授予权限
- javascript - 如何使数组中的元素改变它的位置
- python - Django 在请求结束之前将进度发送回客户端