计算机系统要素-从零开始构建现代计算机--第四章,04-乘法,通过键盘控制屏幕

第四章,04-乘法,通过键盘控制屏幕

这是课程作业mult.asm和fill.asm
mult.asm的作用是计算R0×R1,保存到R2中。
// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.)
fill.asm作用是,当键盘上有键被按下时,将整个屏幕变为黑色,松开变为白色

乘法

计算R0×R1,保存到R2中
参考mult.asm,做了小改动,加了点注释:

// 3*2 换算成 2个3相加
    // 初始化
    @R2
    M = 0

    // 判断是否小于0,小于0不计算,直接跳到结束位置
    @R0
    D = M
    @END
    D;JLT

(LOOP)
    @R1
    M = M - 1   // R1控制循环次数
    D = M
    @END
    D;JLT

    @R0
    D = M
    @R2
    M = M + D  // 每次循环把R0加到R2中

    @LOOP
    0;JMP
(END)
    @END
    0;JMP

键盘屏幕操作

在屏幕上从上到下一行一行地填充,画的过程很慢(不是程序有问题)
参考Fill.asm

    // 24576为键盘的地址 16384-24575 刚好8K 为屏幕的地址
    @24575   // 取屏幕的最后一个地址
    D = A
    @R0  // 存到R0中
    M = D

    @SCREEN
    D = A
    @R1   // R1存储屏幕当前地址,从SCREEN开始递增
    M = D
    
(LOOP)
    @KBD
    D = M    // 取KBD内容
    @FILL
    D;JGT   // KBD被按下时非零,跳到FILL填充屏幕

    @CLEAR  // KBD没有按下时,跳到CLEAR清屏
    0;JMP

(FILL)
    // 判断屏幕是否为满,单次LOOP循环只填充一个寄存器,FILL中没有循环,可以实现快速响应,以免KBD松开后还在填充
    @R0
    D = M
    @R1
    D = D - M   // R0-R1
    
    @LOOP
    D;JLT   // R0-R1值是否小于0,如果小于,说明R1已经从屏幕起始累加到了R0

    @R1
    D = M   // 缓存当前地址
    A = M    // 将当前地址推入A
    M = -1    // 将地址对应的屏幕位置变黑

    @R1     // R1,也即当前地址+1
    M = D + 1

    @LOOP
    0;JMP
    
(CLEAR)
    // 判断屏幕是否为空,如果已经是空的,也就不用清屏,直接回到LOOP,此时当前位置R1是
    @SCREEN
    D = A
    @R1
    D = D - M
    @LOOP
    D;JGT

    @R1
    // 缓存当前地址
    D = M
    // 将当前地址推入A
    A = M
    // 将地址对应的屏幕位置变白
    M = 0

    // 当前地址-1
    @R1
    M = D - 1

    @LOOP
    0;JMP
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值