Nand2Tetris课程作业异常:按键触发屏幕变色显示异常求助
Nand2Tetris 屏幕渲染异常问题排查
我正在学习Nand2Tetris课程,其中一项作业要求实现按键按下时将屏幕设置为黑色。我的代码已通过测试脚本,但屏幕显示异常,与社区正常表现不符。以下是我的代码:
(BEGIN) @KBD D=M @WHITE // go to white if no key is pressed D;JEQ @color M=-1 @WHITEEND 0;JMP (WHITE) @color M=0 (WHITEEND) @SCREEN D=A @n M=D (LOOP) @color D=M @n A=M M=D @n M=M+1 D=M @KBD D=D-A // When n reaches KBD, we reached the end of the screen @LOOP D;JNE @BEGIN // restart code 0;JMP
问题原因分析
- 越界写入键盘寄存器:屏幕的有效内存范围是
SCREEN到KBD-1,你的循环终止条件是当n等于KBD时才停止,这会导致代码修改KBD地址(键盘输入寄存器)的内容。修改该寄存器会干扰键盘输入的正常读取,同时超出屏幕有效区域的写入会引发显示异常。 - 循环终止逻辑错误:当前判断
D=D-A(即n-KBD)后用D;JNE继续循环,只有当n完全等于KBD时才退出。正确逻辑应该是在n小于KBD时持续写入,避免触碰KBD寄存器。
修正方案
调整循环终止的判断逻辑,确保只写入屏幕有效内存区域:
(LOOP) @color D=M @n A=M M=D @n M=M+1 D=M @KBD D=A-D // 计算KBD与当前n的差值 @LOOP D;JGT // 当KBD地址大于n时,继续循环(即n还未到屏幕末尾)
内容的提问来源于stack exchange,提问作者anom907 zat
相关产品推荐
相关产品推荐

