0

こんにちは、私の 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のバージョンの違いが原因でしょうか? 助けてくれてありがとう。

4

0 に答える 0