gpt4 book ai didi

assembly - 为什么 x86 mul 和 div 指令仅采用源操作数?

转载 作者:行者123 更新时间:2023-12-02 18:12:10 24 4
gpt4 key购买 nike

在 x86 汇编中,大多数指令具有以下语法:

operation dest, source

例如,add 看起来像

add rax, 10 ; adds 10 to the rax register

但是像 muldiv 这样的助记符只有一个操作数 - source - destination 被硬编码作为rax。这迫使您在需要乘法或除法时设置并跟踪 rax 寄存器,如果您正在进行一系列乘法,这可能会变得很麻烦。

我假设存在与乘法和除法的硬件实现相关的技术原因。有吗?

最佳答案

muldiv的目标寄存器不是rax,而是rdx:rax。这是因为两条指令都返回两个结果; mul 返回双宽度结果,div 返回商和余数(在采用双宽度输入之后)。

x86 指令编码方案仅允许在旧指令中对两个操作数进行编码(divmul 很旧,可以追溯到 8086)。只有一个操作数允许专用于另一操作数的位用作操作码的扩展,从而可以编码更多指令。由于 divmul 指令使用得不太频繁,并且无论如何都必须对一个操作数进行硬编码,因此对第二个操作数进行硬编码被认为是一种很好的权衡。

这与辅助指令 cbwcwdcwdecdqcdqecqo 用于为 div 指令准备操作数。

请注意,后来引入了 imul 指令的其他形式,允许在单字(而不是双字)乘法的常见情况下使用两个 modr/m 操作数 (80386 ) 并乘以常数 (80186)。甚至后来,BMI2 引入了一种 VEX 编码的 mulx 指令,允许三个自由选择的操作数,其中一个源操作数可以是内存操作数。

关于assembly - 为什么 x86 mul 和 div 指令仅采用源操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72152783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com