我最近一直在玩装配,当我尝试使用div
指令时,我遇到Floating exception
。我在网上搜索过去一两天没有任何工作。我看到了this question,由于答案,我在三个xorq
指令中将寄存器归零(特别是rdx
,因为它是被除数的高字节),但它仍然没有帮助。当使用gcc -S myProg.c
编译简单执行模数运算的ac程序(并创建一些变量以便编译器不会优化模数)时,gcc会创建一个具有cltd
的汇编文件(在idivl
之前转换signed signed to signed long double)指令。我也在我的程序中尝试过,但它改变了一切。我也尝试在rax
ans rbx
中使用不同的尺寸值,但它仍然无效。
问题:我做错了什么,以及使用div
指令有什么奇怪的怪癖? This是我用于学习汇编的文档。
在我的下面的代码中,函数print
只打印rax
的内容。我不在乎打印什么,只是打印了一些东西,所以我可以看到哪个指令崩溃了。
.cstring
_format: .asciz "%d\n"
.text
.globl _main
_main:
# program setup
pushq %rbp
movq %rsp, %rbp
# program - 16 byte aligned already
# zero out the registers
xorq %rax, %rax
xorq %rdx, %rdx
xorq %rbx, %rbx
# set the values to use in the division
movq $5, %rax
movq $16, %rbx
# cltd # 'gcc -S' command puts in cltd before idivl
call print
idivl %ebx, %eax ########### CRASH HERE
call print
# program cleanup
popq %rbp
ret
# prints value in %rax (could be junk, I don't care. As long as something is printed)
print:
subq $8, %rsp # for 16 byte alignment
lea _format(%rip), %rdi
movq %rax, %rsi
call _printf
addq $8, %rsp
ret