【问题标题】:Problems dividing 64 bits in x86 Assembly在 x86 汇编中划分 64 位的问题
【发布时间】:2014-03-23 19:38:32
【问题描述】:

在 x86 汇编中划分时,我不断收到“程序收到信号 SIGFPE,算术异常”。这很令人困惑,因为如果我除以 10,答案应该小于 64 位答案......

mov $0x82b40000, $eax
mov $0x21c3677c, $edx
mov $10000000, %ebx
div %ebx

【问题讨论】:

标签: assembly x86 cpu-registers integer-division


【解决方案1】:

您需要执行此除法类似于手动长手除法。将股息放入另一对寄存器或内存中。然后清除 edx 并用高阶红利加载 eax。然后将 edx:eax 除以 32 位除数,并将 eax(商)存储回高阶被除数。接下来用低阶除数加载 eax(不理会 edx),并再次除以 32 位除数。将 eax 存储回低阶股息。在此之后,高位和低位被除数 = 被除数/除数(64 位商),edx = 被除数 % 除数(32 位余数)。

【讨论】:

    【解决方案2】:

    算术异常是“整数溢出”,来自#DE 硬件除法异常! 这是正常或预期的,因为您的结果大于 32 位数字。

    记住:64 位 / 32 位除法的商只是一个 32 位寄存器(EAX)。 EDX 输出是余数,而不是商的高一半。 div %ebx 的操作数大小为 32 位;只有被除数是 64 位的。

    英特尔的数据表有一个有用的表格:

    【讨论】:

    • 好的,谢谢。我用谷歌搜索了错误,解释有点难以理解;这是我第一次在真机上进行组装。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 2011-11-04
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2011-02-15
    • 2010-10-09
    相关资源
    最近更新 更多