简单的 x86-64 分区不起作用
Posted
技术标签:
【中文标题】简单的 x86-64 分区不起作用【英文标题】:Simple x86-64 division not working 【发布时间】:2013-11-16 22:12:52 【问题描述】:对于我的编译器项目的一个简单测试用例,我试图将 88 除以 11,但是当我调用 idivq
时,我的程序会抛出一个浮点异常。以下是发生异常的生成代码的相关部分:
# push 88
movq $88,%r10
# push 11
movq $11,%r13
# \
movq %r10,%rax
idivq %r13
我查找了有关如何使用 div
的示例,并且我认为我遵循相同的格式,所以我不明白为什么会出现异常。
【问题讨论】:
***.com/questions/10343155/…的可能重复 您的 idivq 将 rdx:rax 除以 r13。不设置 rdx 很容易导致 #DE 陷阱。很难猜测这是如何产生“浮点异常”的。 【参考方案1】:idiv
在执行除法之前将rdx
和rax
连接起来(即实际上是128 位除法)。如果要进行单字除法,请在rdx
中输入零。你得到的不是一个 FP 异常,而是一个整数溢出异常:rdx
中有一些东西导致商太大而无法放入目标寄存器。
【讨论】:
好吧,从我阅读的文档来看,这是有道理的。谢谢idiv
是有符号除法,因此只有当被除数为正时,归零rdx
才是正确的。一般来说,rax
需要符号扩展为rdx
(比如movq %rax,%rdx/sarq $63, %rdx
)。
@gsg:实际上有 CQO
就是为了这个目的。
@IgorSkochinsky 是的,尽管编译器似乎更喜欢 movq/sarq
然后提交“错过优化”错误报告可能是值得的 :)以上是关于简单的 x86-64 分区不起作用的主要内容,如果未能解决你的问题,请参考以下文章