こんにちは、私の 2 年目のコンピューター サイエンス プロジェクトでは、32 ビットの nasm アセンブリでガベージ コレクターを作成することを任されました。1つのことを除いて、すべてを正常に実行することができました。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
何が間違っているのかわかりません。講師に尋ねましたが、彼も間違いを見つけることができませんでした。
また、動作しないバージョンは私の大学の研究室のPCでは動作しましたが、私のものでは動作しませんでした.ubuntuのバージョンの違いが原因でしょうか? 助けてくれてありがとう。