嘿,伙计们,我的第二年计算机科学项目,我们的任务是在32位nasm程序集中创建一个垃圾收集器。除了一件事,我设法让一切运行正常。我们假设使用对brk的系统调用来模仿gclib sbrk函数。
这是我的工作版本:
.if2:
mov eax, 0
push eax
call abrk
add esp, 4
mov ecx, eax
mov edx, num_units
shl edx, 3
push edx
call sbrk
add esp, 4
cmp eax, -1
je .if2body
mov vp, ecx
jmp .cont1
.if2body:
mov eax, 0x00
jmp .return
现在要摆脱sbrk,我做了以下操作,导致了一个完全不同的功能中的段错误:
.if2:
mov eax, 0
push eax
call abrk
add esp, 4
mov ecx, eax
mov edx, num_units
shl edx, 3
add eax, edx
push eax
call abrk
add esp, 4
cmp eax, ecx
je .if2body
mov vp, ecx
jmp .cont1
.if2body:
mov eax, 0x00
jmp .return
这是abrk功能:
%define SYS_brk 0x2d
%define addr [ebp+8]
abrk:
push ebp
mov ebp, esp
push ebx
mov eax, SYS_brk
mov ebx, addr
int 0x80
.end:
pop ebx
mov esp, ebp
pop ebp
ret
我不知道出了什么问题,我问过我的讲师他也找不到错误。
此外,在我的大学实验室电脑上工作但不起作用的版本可能是因为ubuntu版本的差异造成的吗? 谢谢你的帮助。