なぜこのコードがセグメンテーションフォルトを与えるのですか? (これはIntelアセンブラの構文でコード化されています)なぜこのアセンブルコードはセグメンテーションフォルトが発生するのですか?
結果は次のとおりです。
return value : 80
[Dump]
eax : 0x00000012
ebx : 0x00000004
ecx : 0x00000400
edx : 0x4010a980
Segmentation fault (core dumped)
私はセグメンテーションフォルトを防ぐのに十分なコードがあると思います。 すべての関数には、スタックメモリを維持するためのプロローグとエピローグがあります。
ただし、セグメンテーションフォルトエラーが発生します。
[追加の注釈] コード 'mov ebx、4'を削除すると、セグメント化エラーが削除されました。私は、コード「のMOV EBX、4」を削除した場合
extern printf
segment .data
dumpmsg db 10,10,10,10,10,10,'[Dump]',10,'eax : 0x%0.8x',10,'ebx : 0x%0.8x',10,'ecx : 0x%0.8x',10,'edx : 0x%0.8x',10,00
msg db 'return value : %d', 10, 00
segment .bss
segment .text
global main
main:
push ebp
mov ebp, esp
push 20
call pig
add esp, 4
push eax
push msg
call printf
call print_x
leave
ret
pig:
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov ebx, 4
mul ebx
leave
ret
print_x:
push ebp
mov ebp, esp
push edx
push ecx
push ebx
push eax
push dumpmsg
call printf
leave
ret
あなたの投稿には詳細がありません。あなたが実行しているマシン、使用しているアセンブラやプラットフォームなどに関する情報を私たちに与えていないのです。 – Dai
@Dai私はredhat 6.4でNasmを使用します。 – YouHoGeon
@lurker printfを使用した後にスタックを復元しようとしましたが、結果は同じでした(セグメンテーションフォルト)。 – YouHoGeon