对于我的编译器项目的简单测试用例,我试图将88除以11,但是当我调用idivq
时,我的程序会抛出一个浮点异常。以下是发生异常的生成代码的相关部分:
# push 88
movq $88,%r10
# push 11
movq $11,%r13
# \
movq %r10,%rax
idivq %r13
我已查找了如何使用div
的示例,我认为我遵循相同的格式,因此我不明白为什么会出现异常。
答案 0 :(得分:4)
idiv
在执行除法之前连接rdx
和rax
(也就是说,它实际上是128位除法)。如果要进行单字划分,请在rdx
中加零。你得到的不是FP异常,而是一个整数溢出异常:rdx
中遗留了一些东西,这使得商太大而无法放入目标寄存器。