2017-06-22 6 views
-1

push命令のコメントを解除すると、実行可能ファイルを実行中にエラーSegmentation fault (core dumped)が表示されます。エラーの原因を特定しようとしましたが、その原因はまだ見つかりませんでした。プッシュ命令を実行すると、次のようなメッセージが表示されます。セグメンテーションフォルト(コアダンプ)

section .data 
; Message contains app purpose 
msg db 'This app calculates 2^3+5^2',0x0a 
mlen equ $-msg 

msg1 db 'Computation is done',0x0a 
lmsg1 equ $-msg1 

num1 dd 2 
lnum1 equ $-num1 

pow1 dd 3 
lpow1 equ $-pow1 

num2 dd 5 
lnum2 equ $-num2 

pow2 dd 2 
lpow2 equ $-pow2 

section .text 
global _start 
_start: 

    xor edx, edx ; clear registers 
    xor ecx, ecx 
    xor ebx, ebx 
    xor eax, eax 
    xor esi, esi 
    xor edi, edi 
    xor esp, esp 
    xor ebp, ebp 

    mov edx, mlen 
    mov ecx, msg 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 ; print message 

    mov edx, dword [pow2] 
    mov ecx, dword [num2] 
    mov ebx, dword [pow1] 
    mov eax, dword [num1] 
    ;push edx 
    ;push ecx ; --> When I un-comment any push command, 
    ;push ebx ; --> I receive: Segmentation fault (core dumped) 
    ;push eax ; 

    jmp end 

end: 
    mov edx, lmsg1  ; length 
    mov ecx, msg1  ; memory location 
    mov ebx, 1 
    mov eax, 4 
    int 0x80   ; print a newline i.e. 0x0a 

    mov ebx, 0 
    mov eax, 1 
    int 0x80 
+0

「押された」とは、「ポップ」されているか、スタックのアンバランスです。これはsegフォルトの一般的な原因です。とにかく、 'プッシュ'命令の目的は何ですか?あなたは何をしようとしているのですか?また、あなたは 'imp end'を必要としません。とにかくそこに実行が落ちる! –

+0

@CodyGrayこのコードは、数学を計算する関数を開発するちょうど始まりです。 'push'コマンドは、開発する関数 – user3405291

+6

の' xor esp、esp'の引数を準備しています。スタックポインタ、duhをゼロにします。もしあなたがスタックを使いたいのであれば、それはちょっと気になりますね。 – Jester

答えて

0

あなたは何を期待しましたか?
stackpointer(esp)を混乱させると、明らかに困ってしまうでしょう。

x86プロテクトモードでは、アドレス0は決して有効な宛先ではありません。
さらに、すべての「負の」アドレス(0x80000000-0xFFFFFFFF)はカーネル空間にあります。

espをリセットしてからpushにリセットすると、アドレス0-4 = 0xFFFFFFFCにレジスタを保存します。ユーザー空間のプロセスがカーネル空間にアクセスできないため、これは失敗します。

詳細にかかわらず、ESPのように決して混乱することはありません。スタック領域をクリアまたは作成するには、必要に応じて増分またはデクリメントするESPのみを使用します。
espを絶対アドレスに設定しないでください。

関連する問題