计算机由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的更多相关文章

  1. Virtual Machine

    之前说到可以使用Assembly language来实现程序编写,把程序通过一个Assembler就可以得到计算机可以操作的二进制文件. 但是Assembly language依旧不适于编程,但怎么将 ...

  2. net programming guid

    Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ...

  3. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

  4. URAL 1404. Easy to Hack! (模拟)

    space=1&num=1404">1404. Easy to Hack! Time limit: 1.0 second Memory limit: 64 MB When Vi ...

  5. The Ultimate Productivity Hack is Saying No

    The Ultimate Productivity Hack is Saying No By James ClearRead this on JamesClear.com The ultimate p ...

  6. Expert C Programming 阅读笔记(~CH1)

    P4: 好梗!There is one other convention—sometimes we repeat a key point to emphasize it. In addition, w ...

  7. hack games

    记下,有时间玩玩~ wargame http://www.wechall.net/lang_ranking/en --------------- Monyer系列(黑客游戏) 1. http://mo ...

  8. iOS Programming Camera 2

    iOS Programming Camera  2  1.1 Creating BNRImageStore The image store will fetch and cache the image ...

  9. [PySpark] RDD programming on a large file

    重难点 一.parallelize 方法 一般来说,Spark会尝试根据集群的状况,来自动设定slices的数目.然而,你也可以通过传递给parallelize的第二个参数来进行手动设置. data_ ...

随机推荐

  1. 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)

    2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...

  2. 三种方法实现Hadoop(MapReduce)全局排序(1)

    我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...

  3. 嵌入式操作系统---打印函数(printf/sprintf)的实现

    一.打印函数简介 作用:将“给定的内容”按照“指定的格式”输出到“指定目标内”. 打印函数的基本格式: char print_buf[BUF_SIZE]; void printf(const char ...

  4. 看完python这段爬虫代码,java流泪了c#沉默了

    哈哈,其实很简单,寥寥几行代码网页爬一部小说,不卖关子,立刻开始. 首先安装所需的包,requests,BeautifulSoup4 控制台执行 pip install requests pip in ...

  5. Python @property 方法

    考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self.score = ...

  6. jdbc,mybatis,hibernate各自优缺点及区别

    先比较下jdbc编程和hibernate编程各自的优缺点.    JDBC:    我们平时使用jdbc进行编程,大致需要下面几个步骤:    1,使用jdbc编程需要连接数据库,注册驱动和数据库信息 ...

  7. Mantis中文网

    Mantis中文网 | Mantis安装.Mantis使用.Mantis中文http://www.mantis.org.cn/ Mantis Bug Tracker | Demohttp://www. ...

  8. thymeleaf循环

    th:each属性用于迭代循环,语法:th:each="obj,iterStat:${objList}"迭代对象可以是Java.util.List,java.util.Map,数组 ...

  9. Superset安装与使用

    参考: https://www.jianshu.com/p/b02fcea7eb5b

  10. tensorflow分布式训练

    https://blog.csdn.net/hjimce/article/details/61197190  tensorflow分布式训练 https://cloud.tencent.com/dev ...