大家好,在我第二年的计算机科学项目中,我们的任务是在 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 版本的差异造成的吗?谢谢您的帮助。