MASM中mul指令无需写明全部操作数?如何确定运算值与结果存储位置
MASM
mul 乘法指令规则说明 mul 是x86架构下的无符号乘法指令,属于隐式操作数指令,并非缺少参数,而是硬件层面提前约定了操作数和结果的存储位置,具体规则和你传入的显式操作数的宽度直接绑定:
你给出的32位场景代码对应规则
你的代码中mul b的操作数b是DWORD(32位)类型,对应32位无符号乘法逻辑:
- 第一个参与运算的被乘数:固定取
EAX寄存器的值,你代码前一行的mov eax, a就是在给被乘数赋值 - 第二个参与运算的乘数:就是
mul后显式声明的操作数,这里就是变量b存储的999 - 运算结果:32位乘32位会得到64位的乘积,低32位固定存入
EAX寄存器,高32位固定存入EDX寄存器
通用宽度适配规则
你可以根据需要适配不同位宽的乘法,规则统一:
- 8位乘法:
mul后接8位寄存器/内存变量时,被乘数固定为AL,16位运算结果的低8位存AL、高8位存AH - 16位乘法:
mul后接16位操作数时,被乘数固定为AX,32位运算结果的低16位存AX、高16位存DX - 64位乘法(x64环境):
mul后接64位操作数时,被乘数固定为RAX,128位运算结果的低64位存RAX、高64位存RDX
针对你给出的代码样例,1001乘999的结果是999999,换算为十六进制为0xF423F,仅占用20位,所以运算结束后EAX的值为0xF423F,EDX的值为0,你代码里定义的lower_sum和higher_sum就是用来分别接收这两个寄存器的计算结果的。
内容的提问来源于stack exchange,提问作者Ed G-A
相关产品推荐
相关产品推荐

