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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:47:49