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
相关产品推荐
相关产品推荐

