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

LC3位旋转程序无法输出预期打印值 运行出现乱码问题求助

LC3位旋转实验代码修复

核心错误点

  • 输入位数的数值转换逻辑不完整,仅支持个位数输入,未正确计算两位数的实际数值
  • R6寄存器未初始化就写入使用,数值随机导致后续输出乱码
  • 输出数字时未将数值转换为对应的ASCII码(数字字符ASCII = 数值 + 0x30),直接输出控制字符导致乱码方块
  • HALT指令位置错误,放在了输出逻辑之前,后续输出代码完全无法执行
  • 旋转结果存储逻辑错误,误将换行符存入ROTATED变量,丢失了旋转后的计算结果
  • 缺失将16位数值转换为'0'/'1'字符串输出的核心逻辑,无法满足实验要求的二进制位输出格式

修正后可运行代码

.ORIG x3000
; 初始化寄存器
AND R0, R0, #0
AND R1, R1, #0
AND R2, R2, #0
AND R3, R3, #0
AND R4, R4, #0
AND R5, R5, #0
AND R6, R6, #0

; 输出提示
LEA R0, PROMPT
PUTS
LD R0, ENDLINE
OUT

; 读取两位输入,转为数值
GETC
OUT
ADD R4, R0, #-16
ADD R4, R4, #-16
ADD R4, R4, #-16 ; R4 = 十位数字
GETC
OUT
ADD R5, R0, #-16
ADD R5, R5, #-16
ADD R5, R5, #-16 ; R5 = 个位数字

; 计算总旋转位数 AMOUNT = R4 * 10 + R5
AND R0, R0, #0
ADD R0, R4, #0
BRz CALC_DONE
ADD R6, R6, #10
ADD R0, R0, #-1
BRp #-2
CALC_DONE
ADD R5, R5, R6
ST R5, AMOUNT ; 存储正确的旋转位数

; 左旋转逻辑
LD R0, ORIGINAL
LD R2, MASK
ROTATE_LOOP
ADD R5, R5, #0
BRz ROTATE_END
AND R3, R2, R0 ; 检查最高位
BRz SHIFT_ONLY
ADD R0, R0, R0
ADD R0, R0, #1 ; 最高位为1,旋转后补到最低位
BR NEXT_SHIFT
SHIFT_ONLY
ADD R0, R0, R0 ; 最高位为0,直接左移
NEXT_SHIFT
ADD R5, R5, #-1
BR ROTATE_LOOP
ROTATE_END
ST R0, ROTATED ; 存储旋转结果

; 输出AMOUNT
LD R0, ENDLINE
OUT
LEA R0, AMOUNTSTR
PUTS
LD R1, AMOUNT
ADD R0, R1, #0
ADD R0, R0, #16
ADD R0, R0, #16
ADD R0, R0, #16 ; 数值转ASCII
OUT
LD R0, ENDLINE
OUT

; 输出ORIGINAL的16位二进制
LEA R0, ORIGSTR
PUTS
LD R1, ORIGINAL
JSR PRINT_BIN
LD R0, ENDLINE
OUT

; 输出ROTATED的16位二进制
LEA R0, ROTSTR
PUTS
LD R1, ROTATED
JSR PRINT_BIN
LD R0, ENDLINE
OUT

HALT

; 子函数:输出R1中16位数值为二进制字符串
PRINT_BIN
ST R0, SAVE_R0
ST R2, SAVE_R2
ST R3, SAVE_R3
ST R7, SAVE_R7
LD R2, MASK
AND R3, R3, #0
ADD R3, R3, #16
PRINT_LOOP
ADD R3, R3, #0
BRz PRINT_END
AND R0, R2, R1
BRz PRINT_ZERO
LD R0, ASC_1
OUT
BR NEXT_BIT
PRINT_ZERO
LD R0, ASC_0
OUT
NEXT_BIT
ADD R1, R1, R1
ADD R3, R3, #-1
BR PRINT_LOOP
PRINT_END
LD R0, SAVE_R0
LD R2, SAVE_R2
LD R3, SAVE_R3
LD R7, SAVE_R7
RET

; 变量定义
SAVE_R0 .BLKW #1
SAVE_R2 .BLKW #1
SAVE_R3 .BLKW #1
SAVE_R7 .BLKW #1
ASC_0 .FILL x30
ASC_1 .FILL x31
ENDLINE .FILL x000A     
AMOUNT .FILL x0000
ROTATED .BLKW #1
ORIGINAL .FILL xF00F
ORIGSTR .STRINGZ "ORIGINAL:    "
ROTSTR .STRINGZ "ROTATED:     "
AMOUNTSTR .STRINGZ "AMOUNT: "
MASK .FILL x8000
PROMPT .STRINGZ "Enter a two digit number to rotate a binary string up to 16 bits. Example: 05"

.END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:24:05