アセンブリ ルーチンによって変更される予約バイトがあります。
私はpusha
/* 仕事をしました */を使用してpopa
いましたが、セグメンテーション違反が発生します。
pusha
andpopa
をpush eax
push ecx
/* do my job */に置き換えると、正常にpop ecx
pop eax
動作します。
しかし、なぜこのセグフォルトが発生するのでしょうか? との関係はpusha
?
以下は私のコードの一部です。ここでは、8 つのレジスタのうち 2 つだけを使用します。ルーチンで 8 を使用する必要がある場合、各レジスタをプッシュ アンド ポップする必要がありますか? バフを維持する以外に方法はpusha
ありませんか?popa
main:
pusha
mov eax,10
.AGAIN:
cmp eax,0
je .END
mov [buf + ecx],'.'
inc ecx
dec eax
jmp .AGAIN
.END:
mov [buf + ecx],0
mov ebp,buf
call puts
popa
ret
seg fault を与えないでください:
main:
push eax
push ecx
mov eax,10
.AGAIN:
cmp eax,0
je .END
mov [buf + ecx],'#'
inc ecx
dec eax
jmp .AGAIN
.END:
mov [buf + ecx],0
mov ebp,buf
call puts
pop ecx
pop eax
ret
bufは次のように定義されます。
セグメント読み取り可能書き込み可能
buf rb 12