0

nasm プログラムを実行しようとしています。次のコード:

segment .data

contAir:    dt 1.11330e-10
constOil:   dt 2.33656e-10

segment .text

global calc

calc:

mov edx, 0
push ebp
;mov ebp, esp

;mov eax, [ebp + 8]

ret

ebp をスタックにプッシュすると、セグメンテーション エラー (コア ダンプ) が発生します。何故ですか?このコードを Ubuntu 仮想マシンで実行しています。面白いことに、「不正な命令」エラーが発生することがあります。

4

1 に答える 1

10

ebp をスタックにプッシュすると、セグメンテーション エラー (コア ダンプ) が発生します。何故ですか?このコードを Ubuntu 仮想マシンで実行しています。面白いことに、「不正な命令」エラーが発生することがあります。

pushでセグメンテーション違反が発生しているのではなく、 で発生していると思いますret。命令が行うことretは、スタックから戻りアドレスをポップし (通常はcall命令によってそこにプッシュされます)、そこにジャンプします。

したがって、これを行うと:

push ebp
ret

たまたまに格納されていたアドレスに効果的にジャンプしていますebp
戻る前にスタックのバランスをとる必要があります。つまり、各プッシュ タイプの命令には、対応するポップ タイプの命令が必要です。

push ebp
; ... other code goes here ...
pop ebp
ret
于 2013-04-24T13:24:13.910 に答える