Exception 简单x86-64分区不工作
对于我的编译器项目的一个简单测试用例,我试图将88除以11,但是当我调用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位除法)。如果要进
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
,提交一份“错过的优化”错误报告可能是值得的:)