2016-04-16 8 views
-1

小さなコンパイラの作成を含む課題を解決していました。私のコンパイラは、単純な代入文コンプライアンスを行うときのセグメンテーションフォルト(コアダンプ)

// global declaration 
int k; 

float x,y,z; 
// inside main func 
k=10; 
x = y = k; 

アセンブリコードのための次のアセンブリコードを生成する(私はがセグメンテーションフォールト(コアダンプ)取得しています:私はGDBを使用する場合

# 19 
        # b_push_ext_addr (x) 
     subl $8, %esp 
     movl $x, (%esp) 
        # b_push_ext_addr (y) 
     subl $8, %esp 
     movl $y, (%esp) 
        # b_push_ext_addr (k) 
     subl $8, %esp 
     movl $k, (%esp) 
        # b_deref (signed int) 
     movl (%esp), %eax 

# Proplm on next Line ... why? 
     movl (%eax), %edx 


     movl %edx, (%esp) 
        # b_convert (signed int -> float) 
     fildl (%esp) 
     fstps (%esp) 
        # b_assign (float) 
     movl (%esp), %edx 
     addl $8, %esp 
     movl (%esp), %eax 
     movl %edx, (%eax) 
     movl %edx, (%esp) 
        # b_deref (float) 
     movl (%esp), %eax 
     movl (%eax), %edx 
     movl %edx, (%esp) 
        # b_convert (float -> double) 
     flds (%esp) 
     fstpl (%esp) 
        # b_convert (double -> float) 
     fldl (%esp) 
     fstps (%esp) 
        # b_assign (float) 
     movl (%esp), %edx 
     addl $8, %esp 
     movl (%esp), %eax 
     movl %edx, (%eax) 
     movl %edx, (%esp) 
        # b_pop() 
     addl $8, %esp 

を:それはこれに指し示しますライン:

(gdb) x/i $eip 
=> 0x80485bd <main+336>:  mov (%eax),%edx 
+1

明確にするには、コンパイラが生成するコードが実行時にセグメンテーション違反で終了することを意味しますか? –

+0

明らかに間違ったことはありません。少なくとも、障害のある命令を特定するためにデバッガを使用する方法を学ぶ必要があります。 – Jester

+0

@Keith Thompsonはい、生成された実行可能コードを実行すると死んでしまいます。 – user836026

答えて

2

実際の故障がさらに下に類似した命令であるが、:

fstps (%esp)  # stack has some float 
       # b_assign (float) 
    movl (%esp), %edx # edx has a float now 
    addl $8, %esp 
    movl (%esp), %eax 
    movl %edx, (%eax) 
    movl %edx, (%esp) # write the float onto stack 
       # b_deref (float) 
    movl (%esp), %eax # load the float from stack 
    movl (%eax), %edx # try to use float as pointer => segfault 
+0

ありがとうありがとうございました...それはうまくいきました...しかし、なぜ浮動小数点が終わったのか分かりませんが、私は浮動小数点型のポインタを持っていると思います。 – user836026