Hack Programming
计算机由ROM(instruction memory)、RAM(data memory)、CPU组成,其关系如下图

在计算中存在3种寄存器:D、A、M。其中D是data register,A是address register,M是data/address register。
为对数据进行操作,存在两种指令:A-introduction,C-introduction,这也就是Hack Promramming的全部语法了。Hack Programming 属于一种 汇编语言(Assembly language),计算机处理的都是0/1,但不便于阅读编程,但汇编语言通过编译可以成为二进制语句。
A-introduction的语法就是 @ num,num可以是非负整数,也可以variable/LABEL,这个语句可以应用于三种情况:
1)赋值A。A是地址,比如@2,就是令当前的A=2,并可以对M = RAM[A]进行操作
2)指定寄存器RAM[A]。
3)指定下一条指令。这里的指定下一条指令一般是用于 @LABEL,实现goto功能,这一语句经过编译会变为 @ num,num是定义LABEL的下一行的行数。举例如下

注:关于variable:和LABEL不同,不需要在程序中申明,编译时会自动寻找可行的寄存器,比如@i,编译时会变为 @num,num表示寄存器的地址。
C-Instruction的语法如下,主要功能是实现运算和赋值。

此外,还有一个POINTER的概念,其实就是地址,在HACK编程的C指令中,只能用上面涉及到的语法,所以要实现赋值操作一般都是下面这样
// i = 100 @ D = A @i M = D //修改SCREEN MAP第2个寄存器的值全为1 @SCREEN D = A A = A+ M = -
最后还有屏幕输出和键盘输入。
假设屏幕大小是256*512,计算机是16bit,那32个寄存器对应屏幕的一行,依次下推,这样用于屏幕输出的寄存器就需要256*512/16个;屏幕的每一个pixel都只有0/1,1的话就是黑色,要改变屏幕输出,其实通过要改变的像素点,找到相应寄存器的相应bit,再改变bit的值为1。
键盘输入只需要一个寄存器,一般会有个固定地址,当进行键盘输入时,其寄存器的值M就不为0,而是输入字符的对应码。
举个栗子:实现当进行键盘输入时,屏幕的头16个像素变黑,松开时变白
@
D = A
@n
M = D
@SCREEN
D = A
@pointer
M = D
@isfill
M =
(LOOP)
@KBD
D = M;
@FILL
D;JNE
@UNFILL
D;JEQ
(FILL)
@isfill
D = M
@LOOP
D;JNE
@pointer
A = M
M = -
@isfill
M =
@LOOP
;JMP
(UNFILL)
@isfill
D = M
@LOOP
D;JEQ
@pointer
A = M
M =
@isfill
M =
@LOOP
;JMP
Hack Programming的更多相关文章
- Virtual Machine
之前说到可以使用Assembly language来实现程序编写,把程序通过一个Assembler就可以得到计算机可以操作的二进制文件. 但是Assembly language依旧不适于编程,但怎么将 ...
- net programming guid
Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ...
- 《Programming WPF》翻译 第7章 1.图形基础
原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...
- URAL 1404. Easy to Hack! (模拟)
space=1&num=1404">1404. Easy to Hack! Time limit: 1.0 second Memory limit: 64 MB When Vi ...
- The Ultimate Productivity Hack is Saying No
The Ultimate Productivity Hack is Saying No By James ClearRead this on JamesClear.com The ultimate p ...
- Expert C Programming 阅读笔记(~CH1)
P4: 好梗!There is one other convention—sometimes we repeat a key point to emphasize it. In addition, w ...
- hack games
记下,有时间玩玩~ wargame http://www.wechall.net/lang_ranking/en --------------- Monyer系列(黑客游戏) 1. http://mo ...
- iOS Programming Camera 2
iOS Programming Camera 2 1.1 Creating BNRImageStore The image store will fetch and cache the image ...
- [PySpark] RDD programming on a large file
重难点 一.parallelize 方法 一般来说,Spark会尝试根据集群的状况,来自动设定slices的数目.然而,你也可以通过传递给parallelize的第二个参数来进行手动设置. data_ ...
随机推荐
- JDK1.8源码(八)——java.util.HashSet 类
在上一篇博客,我们介绍了 Map 集合的一种典型实现 HashMap ,在 JDK1.8 中,HashMap 是由 数组+链表+红黑树构成,相对于早期版本的 JDK HashMap 实现,新增了红黑树 ...
- 06 Django REST Framework 版本控制
01-版本控制 对接口进行版本控制只是一种杀死已部署客户端的“礼貌”方式. - 罗伊菲尔丁. 1. API版本控制允许您更改不同客户端之间的行为.REST框架提供了许多不同的版本控制方案. 2. 版本 ...
- js中的枚举
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. js中基本包装类型的原型属性是不可枚举的 ...
- 3 数据分析之Numpy模块(2)
数组函数 通用元素级数组函数通用函数(即ufunc)是一种对ndarray中的数据执行元素级的运算.我们可以将其看做是简单的函数(接收一个或多个参数,返回一个或者多个返回值). 常用一元ufunc: ...
- fetch和axios获取数据
fetch("/api/goods") .then(res => { return res.json(); }) .then(response => { console ...
- EntityFramework Core笔记:入门(1)
1. 安装运行环境 EntityFramework Core运行环境,安装NuGget包: //Sql Server Database Provider PM> Install-Package ...
- python中的编码问题
遇到的问题: (1)ValueError: source code string cannot contain null bytes 发现文件的编码被改成了UTF-16BE,使用pycharm设置项目 ...
- 数据降维之多维缩放MDS(Multiple Dimensional Scaling)
网上看到关于数据降维的文章不少,介绍MDS的却极少,遂决定写一写. 考虑一个这样的问题.我们有n个样本,每个样本维度为m.我们的目标是用不同的新的k维向量(k<<m)替代原来的n个m维向量 ...
- UVA 10618 Tango Tango Insurrection
https://vjudge.net/problem/UVA-10618 题目 你想学着玩跳舞机.跳舞机的踏板上有4个箭头:上.下.左.右.当舞曲开始时,屏幕上会有一些箭头往上移动.当向上移动箭头与顶 ...
- 【XSY2666】排列问题 DP 容斥原理 分治FFT
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...