Obecnie piszę prosty kompilator C, który pobiera plik .c jako dane wejściowe i generuje kod zespołu (składnia X86, AT & T). Wszystko jest dobre, ale kiedy próbuję wykonać instrukcję IDIVQ, otrzymuję wyjątek zmiennoprzecinkowy. Oto mój wkład:Zespół X86 - Obsługa instrukcji IDIV
int mymain(int x){
int d;
int e;
d = 3;
e = 6/d;
return e;
}
I tu jest mój wygenerowany kod:
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
Według http://www.cs.virginia.edu/~evans/cs216/guides/x86.html, idivq% RBX powinna produkować 6/D (iloraz) w % Rax. Ale otrzymuję wyjątek zmiennoprzecinkowy i nie mogę znaleźć problemu.
Każda pomoc będzie doceniona!
Nie ma związku z tym pytaniem, ale czy powinieneś robić 'movq% rdi, -40 (% rbp)' bez regulacji rejestru 'esp'? Czy to jest w porządku ze względu na czerwoną strefę x64? –