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
相关产品推荐
相关产品推荐

