Actualmente estoy escribiendo un compilador de C simple, que toma un archivo .c como entrada y genera código de ensamblado (sintaxis T de X86, AT &). Todo está bien, pero cuando trato de ejecutar una instrucción IDIVQ, obtengo una excepción de coma flotante. Aquí está mi entrada:Conjunto X86 - Manejo de la instrucción IDIV
int mymain(int x){
int d;
int e;
d = 3;
e = 6/d;
return e;
}
Y aquí está mi código generado:
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
Según http://www.cs.virginia.edu/~evans/cs216/guides/x86.html, idivq% RBX debe producir 6/d (el cociente) en % rax. Pero recibo una excepción de coma flotante, y parece que no puedo encontrar el problema.
¡Cualquier ayuda será muy apreciada!
No relacionado con esta pregunta, pero ¿debería estar haciendo 'movq% rdi, -40 (% rbp)' sin haber ajustado el registro 'esp'? ¿O está bien debido a la 'zona roja' x64? –