You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用VVM的INP、STO等指令实现负数乘法?现有代码存异常

VVM 负数乘法实现方案

原代码问题分析

你的原代码通过累加第一个数、循环第二个数的次数实现正数乘法,但存在两个致命问题:

  1. 当第二个数为负数时,每次执行SUB 90(减1)会让数值越来越小,永远无法触发BRZ跳出循环,最终累加次数过多导致结果溢出。
  2. 虽能处理输入为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

代码说明

  1. 符号处理:
    • 用96单元记录符号,初始为0(正)。每遇到一个负数乘数,就给96加1(翻转符号)。
    • 负数转绝对值:利用0 - 负数 = 正数的逻辑,通过LDA 95(0)后执行SUB 负数得到绝对值。
  2. 累加乘法:
    • 转成绝对值后,沿用原有的累加循环逻辑,此时循环次数为正数,不会出现死循环。
  3. 结果调整:
    • 如果符号标记为1(说明两个乘数异号),就把累加结果取反,得到负数结果。
  4. 零值处理:
    • 只要任意一个输入为0,转绝对值后循环次数为0,直接跳出循环,结果保持0,符合乘法规则。

内容的提问来源于stack exchange,提问作者maliyagiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:32:39