0

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

4

0 回答 0