本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/09 13:17] – [Input & Output] codinghare | cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/11 03:11] (当前版本) – [实例:keyboard] codinghare | ||
---|---|---|---|
行 480: | 行 480: | ||
{{ : | {{ : | ||
==实例:drawing an rectangle== | ==实例:drawing an rectangle== | ||
+ | * 题目的要求是:画一个自定义 row('' | ||
+ | 首先从高级语言考虑一下这个代码的循环: | ||
+ | <code cpp> | ||
+ | for (i=0; i < n; ++i) | ||
+ | { | ||
+ | // print first black pixels at he beginning of row i | ||
+ | } | ||
+ | </ | ||
+ | 接下来以更机器语言的方式思考该伪代码: | ||
+ | <code bash> | ||
+ | # init | ||
+ | addr = SCREEN # 写入的首地址是 SCREEN 对应的内存起始点 | ||
+ | n = RAM[0] # 从 R0 中获取 n 的初始值 | ||
+ | i = 0 | ||
+ | |||
+ | # Looping | ||
+ | LOOP: | ||
+ | if i > n goto END # 循环结束条件是 i > n | ||
+ | # draw pixels | ||
+ | RAM[addr] = -1 # -1的二进制表示是 1111111111111111 | ||
+ | # update status | ||
+ | addr += 32 # 换行,由于屏幕宽度是 512,每一行需要 32 个寄存器才可以完全表示,因此换行是直接去第 33 个寄存器 | ||
+ | i += 1 # 更新循环条件 | ||
+ | goto LOOP | ||
+ | | ||
+ | END: | ||
+ | goto END | ||
+ | </ | ||
+ | 实现如下: | ||
+ | <code bash> | ||
+ | @SCREEN | ||
+ | D = A | ||
+ | @addr # 使用 SCREEN 地址初始化 addr, 16384 号寄存器 | ||
+ | M = D | ||
+ | @R0 | ||
+ | D = M | ||
+ | @n | ||
+ | M = D # 使用 R0 内容初始化 n | ||
+ | @i | ||
+ | M = 0 # 初始化 i 为 0 | ||
+ | |||
+ | (LOOP) | ||
+ | @i | ||
+ | D = M | ||
+ | @n | ||
+ | D = D - M | ||
+ | @END | ||
+ | D;JGT # 如果 i > n, 结束循环 | ||
+ | |||
+ | @addr | ||
+ | A = M | ||
+ | M = -1 # RAM[addr] = 1111 1111 1111 1111 | ||
+ | |||
+ | # 更新循环状态 | ||
+ | @i | ||
+ | M = M + 1 | ||
+ | |||
+ | @32 | ||
+ | D = A # 注意,所有的常量都需要用 A 类寄存器获取 | ||
+ | @addr | ||
+ | M = M + D | ||
+ | | ||
+ | @LOOP | ||
+ | 0;JMP | ||
+ | |||
+ | (END) | ||
+ | @END | ||
+ | 0;JMP | ||
+ | </ | ||
+ | ==keyboard== | ||
+ | - 读取 RAM[24576] 内的内容 | ||
+ | - 如果内容为 '' | ||
+ | - 否则,搜寻对应值的 key 值 |