You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Assembly x86 MASM:如何对32位寄存器对edx:eax执行乘法?

实现EDX:EAX寄存器对乘以10的方案

因为你要操作的是EDX:EAX组成的64位整数,而非仅EAX,所以不能直接用mul dword PTR ten(该指令仅将EAX与操作数相乘,结果存入EDX:EAX)。结合你提到的无溢出前提,这里提供两种高效实现方式:

方法一:32位环境通用解法(移位+加法)

利用数学变换 10*X = 8*X + 2*X,通过移位和带进位加法实现,无需内存变量:

; 保存原始EDX:EAX到EBX:ECX
mov ecx, eax
mov ebx, edx

; 计算2*X:将EDX:EAX整体左移1位
shl eax, 1
rcl edx, 1

; 计算8*X:将保存的EBX:ECX整体左移3位
shl ecx, 3
rcl ebx, 3

; 相加得到10*X:2X + 8X
add eax, ecx
adc edx, ebx
  • shl 负责低32位左移,rcl(带进位循环左移)负责高32位同步移位,保证64位整体操作的正确性。
  • adc 带进位加法确保高32位的进位被正确累加。

方法二:X86-64环境简化解法

如果运行环境是64位模式,可以直接将EDX:EAX组合为64位寄存器RAX,使用64位乘法指令:

; 将EDX:EAX组合为64位RAX
mov rax, eax
shl rdx, 32
or rax, rdx

; 64位乘法:RAX = RAX * 10
imul rax, 10

; 将结果拆分回EDX:EAX
mov eax, eax       ; RAX低32位存入EAX
mov edx, rax >> 32 ; RAX高32位存入EDX
  • 该方法利用64位寄存器简化操作,代码更直观。

原代码问题说明

你原本的mul dword PTR ten指令仅完成EAX × 10,结果覆盖EDX:EAX,但这不是你需要的64位整体乘法操作,因此需要替换为上述方案。

内容的提问来源于stack exchange,提问作者roditu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:50:56