You need to enable JavaScript to run this app. 汇编语言使用内存变量执行mul运算为何输出非预期值?
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言使用内存变量执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 03:06:07