Exception 简单x86-64分区不工作

Exception 简单x86-64分区不工作,exception,assembly,x86-64,division,integer-division,Exception,Assembly,X86 64,Division,Integer Division,对于我的编译器项目的一个简单测试用例,我试图将88除以11,但是当我调用idivq时,我的程序抛出一个浮点异常。以下是发生异常的生成代码的相关部分: # push 88 movq $88,%r10 # push 11 movq $11,%r13 # \ movq %r10,%rax idivq %r13 我已经查找了如何使用div的示例,我认为我遵循的是相同的格式,所以我不明白为什么会出现异常。idiv在执行除法之前将rdx和rax串联在一起(也就是说,它实际上是128位除法)。如果要进

对于我的编译器项目的一个简单测试用例,我试图将88除以11,但是当我调用
idivq
时,我的程序抛出一个浮点异常。以下是发生异常的生成代码的相关部分:

# push 88
movq $88,%r10

# push 11
movq $11,%r13

# \
movq  %r10,%rax
idivq %r13

我已经查找了如何使用
div
的示例,我认为我遵循的是相同的格式,所以我不明白为什么会出现异常。

idiv
在执行除法之前将
rdx
rax
串联在一起(也就是说,它实际上是128位除法)。如果要进行单字除法,请在
rdx
中输入零。您得到的不是FP异常,而是整数溢出异常:
rdx
中有一些剩余的内容使得商太大,无法放入目标寄存器。

idiv
在执行除法之前连接
rdx
rax
(也就是说,它实际上是128位除法). 如果要进行单字除法,请在
rdx
中输入零。您得到的不是FP异常,而是整数溢出异常:
rdx
中有剩余的内容,这使得商太大,无法放入目标寄存器。

idivq的可能重复项将rdx:rax除以r13。不设置rdx很容易导致#去陷阱。很难猜测它是如何产生“浮点异常”的。idivq的可能副本将rdx:rax除以r13。不设置rdx很容易导致#去陷阱。很难猜测它是如何产生“浮点异常”的。好吧,从我阅读的文档中可以看出这一点。谢谢
idiv
是有符号除法,因此只有当除数为正时,归零
rdx
才是正确的。一般来说,
rax
需要符号扩展到
rdx
(比如说,
movq%rax,%rdx/sarq$63,%rdx
)。@gsg:实际上就是为了这个目的。@IgorSkochinsky是的,尽管编译器似乎更喜欢
movq/sarq
,提交一份“错过的优化”错误报告可能是值得的:)好的,从我读到的文件来看,这是有道理的。谢谢
idiv
是有符号除法,因此只有当除数为正时,归零
rdx
才是正确的。一般来说,
rax
需要符号扩展到
rdx
(比如说,
movq%rax,%rdx/sarq$63,%rdx
)。@gsg:实际上就是为了这个目的。@IgorSkochinsky是的,尽管编译器似乎更喜欢
movq/sarq
,提交一份“错过的优化”错误报告可能是值得的:)