简单的 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 在执行除法之前将rdxrax 连接起来(即实际上是128 位除法)。如果要进行单字除法,请在rdx 中输入零。你得到的不是一个 FP 异常,而是一个整数溢出异常:rdx 中有一些东西导致商太大而无法放入目标寄存器。

【讨论】:

好吧,从我阅读的文档来看,这是有道理的。谢谢 idiv 是有符号除法,因此只有当被除数为正时,归零rdx 才是正确的。一般来说,rax 需要符号扩展为rdx(比如movq %rax,%rdx/sarq $63, %rdx)。 @gsg:实际上有 CQO 就是为了这个目的。 @IgorSkochinsky 是的,尽管编译器似乎更喜欢 movq/sarq 然后提交“错过优化”错误报告可能是值得的 :)

以上是关于简单的 x86-64 分区不起作用的主要内容,如果未能解决你的问题,请参考以下文章

分区总和不起作用

为啥将原始字节写入分区不起作用[扇区写入]?

霍尔分区不起作用?

使用左外连接时 Oracle 分区修剪不起作用

为啥 MPI 在 Visual Studio 2015 中不起作用?

分区在我的快速排序功能中不起作用