-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
明確にするには、コンパイラが生成するコードが実行時にセグメンテーション違反で終了することを意味しますか? –
明らかに間違ったことはありません。少なくとも、障害のある命令を特定するためにデバッガを使用する方法を学ぶ必要があります。 – Jester
@Keith Thompsonはい、生成された実行可能コードを実行すると死んでしまいます。 – user836026