如何用VVM的INP、STO等指令实现负数乘法?现有代码存异常
VVM 负数乘法实现方案
原代码问题分析
你的原代码通过累加第一个数、循环第二个数的次数实现正数乘法,但存在两个致命问题:
- 当第二个数为负数时,每次执行
SUB 90(减1)会让数值越来越小,永远无法触发BRZ跳出循环,最终累加次数过多导致结果溢出。 - 虽能处理输入为0的情况,但没有符号逻辑,无法输出负数结果。
核心解决思路:先记录结果符号,将两个乘数转为绝对值相乘,最后根据符号调整结果正负,完全用你给定的指令即可实现。
实现代码
INP STO 99 ; 存储第一个输入数A INP STO 98 ; 存储第二个输入数B LDA 000 STO 96 ; 初始化符号标记:0=正,1=负 STO 95 ; 存储常量0,用于取反操作 LDA 90 STO 94 ; 存储常量1,用于符号翻转 ; 处理第一个数的绝对值,更新符号 LDA 99 BRP 08 ; A非负,跳过取反 LDA 95 SUB 99 STO 99 ; 把A转为绝对值(0 - 负数 = 正数) LDA 96 ADD 94 STO 96 ; 符号标记翻转(0变1,1变0) ; 处理第二个数的绝对值,更新符号 LDA 98 BRP 14 ; B非负,跳过取反 LDA 95 SUB 98 STO 98 ; 把B转为绝对值 LDA 96 ADD 94 STO 96 ; 符号标记翻转 ; 初始化累加结果为0 LDA 95 STO 97 ; 累加乘法逻辑(和原代码逻辑一致,现在用绝对值相乘) LOOP: LDA 97 ADD 99 STO 97 LDA 98 SUB 94 STO 98 LDA 98 BRZ 24 ; 循环次数到0,跳出 BR 18 ; 根据符号标记调整结果正负 LDA 96 BRZ 27 ; 符号为正,直接输出 LDA 95 SUB 97 STO 97 ; 结果取反(0 - 正数 = 负数) ; 输出结果并停机 LDA 97 OUT HLT ; 常量定义 *90 DAT 001
代码说明
- 符号处理:
- 用96单元记录符号,初始为0(正)。每遇到一个负数乘数,就给96加1(翻转符号)。
- 负数转绝对值:利用
0 - 负数 = 正数的逻辑,通过LDA 95(0)后执行SUB 负数得到绝对值。
- 累加乘法:
- 转成绝对值后,沿用原有的累加循环逻辑,此时循环次数为正数,不会出现死循环。
- 结果调整:
- 如果符号标记为1(说明两个乘数异号),就把累加结果取反,得到负数结果。
- 零值处理:
- 只要任意一个输入为0,转绝对值后循环次数为0,直接跳出循环,结果保持0,符合乘法规则。
内容的提问来源于stack exchange,提问作者maliyagiz
相关产品推荐
相关产品推荐

