2

レジスタへの値が期待されるルーチンへの呼び出しを実行するルーチンがあります。ルーチンでebp数回変更します。コードの先頭ではできません。アドレスを別のレジスタにmov ebp,esp保存してみました命令espの前leaveにそのようなアドレスを入力しましebpたが、それでもセグメンテーション違反が発生します。

これを修正する方法は?

コードは非常に巨大です(ここに投稿するには、必要に応じて投稿できます)が、アイデアは次のようなものです。

;a lot of arguments are passed in stack
foo:
xor ebx,ebx
mov ecx,esp
loop0:
sub edx,1
jz end
;etc
mov eax,[esp+ebx]
mov ebp,eax
call routinex
;etc..
;...
mov ebp,edx
call printx
add ebx,4
jmp loop0
end:
mov ebp,ecx
leave
ret

このコードで十分だと思います..説明も好きです.

4

1 に答える 1

3

これは何ですかleave

mov esp, ebp
pop ebp

それを使用して動作させたい場合は、次のように書く必要があります

push ebp
mov ebp, ecx
leave

あなたの機能の最後に。もちろん、次のようleaveにすれば、まったく使用しなくてもかまいません。

mov esp, ecx
ret

ecxフレームポインターとして使用しているためです。

于 2013-03-21T01:07:09.020 に答える