汇编语言使用内存变量执行mul运算为何输出非预期值?
汇编作业调试问题
我正在用这段代码测试作业中的逻辑,作为汇编新手,写了如下代码:
INCLUDE PCMAC.INC .MODEL SMALL .586 .STACK 100H .DATA lfc DW 1892 ger DB 8 .CODE EXTRN GetDec:Near,PutDec:Near start PROC _Begin mov ax, lfc mul ger call PutDec _Exit 0 start ENDP END start
我预期PutDec会显示15136,但实际输出是800,排查了半天不知道哪里错了。
问题核心是没搞清楚x86 mul指令对8位操作数的固定执行规则:
- 只要
mul后面跟的是8位操作数,硬件就固定拿AL里的值当被乘数,乘完结果直接存在AX里,根本不会碰AH里的高字节内容。 - 你把1892(十六进制
0764h)mov到AX之后,AL的值是低字节的64h也就是十进制100,AH是高字节的07h。这时候执行mul ger,因为ger是DB定义的8位值8,实际计算的是 AL * 8 = 1008=800*,结果存到AX里,刚好就是你看到的输出。
要得到预期的15136结果,改法很简单:
- 直接把ger的定义从
DB 8改成DW 8就行,这时候mul的操作数是16位的,会触发16位乘法规则,拿完整的AX值(1892)乘以ger的8,因为乘积15136没超过16位寄存器最大值,AX里存的就是正确值,调用PutDec就能输出正确结果。 - 要是不想改ger的定义,就在mul之前补两行指令:把ger的值搬到bl里,bh清零,然后用
mul bx做乘法,效果一样。
内容的提问来源于stack exchange,提问作者Akash Digumber
相关产品推荐
相关产品推荐

