assembly - 为什么 x86 汇编中的被除数是 64 位?

标签 assembly x86

为什么idiv x86 汇编指令除法 EDX:EAX (64 位)由给定的寄存器,而其他数学运算,包括乘法,只是对单个输入和输出寄存器进行操作?

乘法:

mov eax, 3
imul eax, 5

分配:
mov edx, 0
mov eax, 15
mov ebx, 5
idiv ebx

我知道 EDX用于存储余数,但为什么没有针对此行为的单独指令?这对我来说似乎不一致。

最佳答案

指令集提供了有效实现任意宽度整数运算所需的指令。对于加法和减法,除了固定宽度的结果之外,您需要知道的只是运算结果是进位(加法)还是借位(减法)。这就是为什么有一个进位标志。对于乘法,您需要能够将两个单词相乘并得到双单词结果。这就是为什么imuledx:eax 中产生结果.对于除法,您需要能够除以双倍宽度的数字并获得商和余数。

要了解为什么需要这些特定操作,请参阅 Knuth 的计算机编程艺术,第 2 卷,其中详细介绍了实现任意宽度算法的算法。

至于为什么x86指令集中没有更多不同形式的乘法和除法指令,不是2的幂的乘法和除法比其他指令少得多,所以Intel可能不想使用up 可用于更频繁使用的指令的操作码。通用程序中的大多数乘法和除法都是以 2 的幂计算的;对于这些,您可以使用位移位或 lea代替指令。

关于assembly - 为什么 x86 汇编中的被除数是 64 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586232/

相关文章:

c - 二进制炸弹阶段 5 - 寻找两个整数作为输入

汇编:MOV 或 DEC 影响零标志吗?

assembly - 8086/88 的 IDE 和汇编器

performance - 涉及英特尔SnB系列CPU上涉及微编码指令的循环的分支对齐

assembly - 进入保护模式后尝试跳转时出错 - 程序集引导加载程序

使用 C 和汇编程序计算整数的符号

windows - Win32 EXCEPTION_INT_OVERFLOW 与 EXCEPTION_INT_DIVIDE_BY_ZERO

c - 在 x86 Qemu 中启用分页

c - 将 __m256i 存储为整数

c - 有效测试一个列表是否是另一个列表的排列