为什么idiv
x86 汇编指令除法 EDX:EAX
(64 位)由给定的寄存器,而其他数学运算,包括乘法,只是对单个输入和输出寄存器进行操作?
乘法:
mov eax, 3
imul eax, 5
分配:
mov edx, 0
mov eax, 15
mov ebx, 5
idiv ebx
我知道
EDX
用于存储余数,但为什么没有针对此行为的单独指令?这对我来说似乎不一致。
最佳答案
指令集提供了有效实现任意宽度整数运算所需的指令。对于加法和减法,除了固定宽度的结果之外,您需要知道的只是运算结果是进位(加法)还是借位(减法)。这就是为什么有一个进位标志。对于乘法,您需要能够将两个单词相乘并得到双单词结果。这就是为什么imul
在 edx:eax
中产生结果.对于除法,您需要能够除以双倍宽度的数字并获得商和余数。
要了解为什么需要这些特定操作,请参阅 Knuth 的计算机编程艺术,第 2 卷,其中详细介绍了实现任意宽度算法的算法。
至于为什么x86指令集中没有更多不同形式的乘法和除法指令,不是2的幂的乘法和除法比其他指令少得多,所以Intel可能不想使用up 可用于更频繁使用的指令的操作码。通用程序中的大多数乘法和除法都是以 2 的幂计算的;对于这些,您可以使用位移位或 lea
代替指令。
关于assembly - 为什么 x86 汇编中的被除数是 64 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586232/