-1

私は ac から x86 へのコンパイラに取り組んでおり、実際にはいくつかのコード行を生成していますが、起動しようとするとセグメンテーション違反が発生し、エラーの原因がわかりません。コードは次のとおりです。

    .file   "test.c"
    .text            
    .globl main
    .type main, @function  
main:                        
    pushl   %ebp                     
    movl    %esp,   %ebp               
    subl    $32,    %esp             
    movl    $2, %eax                        
    movl    %eax,   -4(%ebp) 
    movl    $3, %eax                         
    movl    %eax,   -8(%ebp) 
    movl    -4(%ebp), %eax        
    popl    %ecx         
    addl    %ecx,   %eax  
    pushl   %eax        
    movl    -8(%ebp), %eax                         
    movl    %eax,   -12(%ebp) 

最初の命令「pushl %ebp」でセグメンテーション違反が発生するようです

4

1 に答える 1

3

さて、あなたが私たちに言ったことは正しいと仮定すると、何がうまくいかないのかについて大まかに2つの説明があります:

「お使いの CPU が壊れています」などの完全に「そこにある」説明を無視すると、push命令のセグメンテーション違反は次の 2 つの理由で発生する可能性があります。

  • スタックが正しく設定されていないため、命令がデータを読み取り専用またはマップされていないアドレスにプッシュしようとしている、または
  • 命令自体を含むメモリ ページは、実行可能としてマークされていません。

与えられた情報から、これら 2 つのどちらが問題を引き起こしているのかを特定することは不可能です。あなたはそれを決定する必要があります。(または、コードがどのように実行されているかなど、さらに詳しい情報を提供してください)

于 2012-05-15T12:38:01.590 に答える