現在、単純なCコンパイラを作成しています。このCコンパイラは、入力として.cファイルを受け取り、アセンブリコード(X86、AT & T構文)を生成します。 Everythingは良いですが、IDIVQ命令を実行しようとすると、浮動小数点例外が発生します。ここに私の入力です:X86アセンブリ - IDIV命令の処理
int mymain(int x){
int d;
int e;
d = 3;
e = 6/d;
return e;
}
そして、ここでは私の生成されたコードです:
mymain:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movq %rdi, -40(%rbp)
movq $3, -8(%rbp)
movq $6, %rax
movq -8(%rbp), %rdx
movq %rdx, %rbx
idivq %rbx
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size mymain, .-mymain
http://www.cs.virginia.edu/~evans/cs216/guides/x86.htmlによると、idivq%のRBXは%のRAXで6/D(商)を生成する必要があります。しかし、私は浮動小数点の例外を取得している、と私は問題を見つけるように見えることはできません。
ご協力いただければ幸いです。
この質問には関係ありませんが、 'esp'レジスタを調整しないで' movq%rdi、-40(%rbp) 'を実行する必要がありますか?それとも、x64の「赤いゾーン」のためにOKですか? –