proj4
Machine Language
4.1 Machine Languages : Overview

内部:
内存包括:程序内存和数据内存
硬件是固定的,软件可更改
软件变化,故计算机可做不同的事情(计算机的universality)

let us see how hardware can do many things:
- by硬件逐个执行指令,把整个指令序列执行完放在一起,就得到了整个程序的功能。

⭐3-Question







machine language ← assembly language

我们写程序用的是高级语言,但电脑真正理解和执行的是机器语言
(其实里面的编译器是分两部的,第一步是高级语言→汇编语言,第二步是汇编语言→机器语言,now看的是part1)




第一种解释

第二种解释



next

4.2 Machine Languages : Elements
Machine Language



Memory Hierarchy




Registers (in CPU)(Q1Q3)


用法/类型①



用法/类型②

so that we can

eg




Addressing Modes
- 现在回到最初的问题:

- 假设是一个简单的操作:那么它应该在什么上面操作?
- 以下是四种类型的操作:

Intput / Output

Flow Control(Q2)



- 我们可以把102位置命名为loop
- 实际上,用机器语言的位写它时,表示的是一样的
- 只是 loop 对人类来说更容易看


HACK Language
4.3 HACK Computer and Language (Overview)
hardware
- 以下是下周要搭建的计算机(hardware)的概述:

software
- control the computer


reset bottom

registers

- (M 表示 A 寻址的 16 位 RAM 寄存器)
- 无论内存里有多少寄存器,每次被选择的只有一个,为M寄存器。
The A-instruction



The C-instruction


dest目的地,comp计算,jump跳转
看到A的时候,也可以用M替代
eg








由于寄存器 A 的值为 1,第二行指令M=A - 1执行后,A - 1 = 0,这个 0 会被存储到RAM[1]中(因为 M 指向RAM[1] )




4.4 Hack Language plus
Use Binary to write

- 用机器语言(0和1构成)写的话,就不需要汇编器了。电脑直接读懂。
- 介绍这一节,也是为了更加了解机器语言和汇编语言的联系,为之后写汇编器做铺垫


C-ins





Eg


next

4.5 Input / Ouput
- 本节讨论:如何通过使用机器语言 来控制和操作 这些I/O设备
Hack computer platform

实现:
- 以后的软件部分,会用到高级语言的库来实现high-level
- 但是现在,只能用bit来实现low-level

OutPut


Screen memory map
- make a deep study in …

每行每列的交叉点,都有所谓的像素。
how do we control it?

这些值的每一个有时被称为一个单词
所以有8k,每一个都是16bit的单词
像素怎么算:8k*16≈130,000
一个像素就是一个bit,一个bit就是一个像素
那么怎么对应呢?哪个bit位于哪个像素?
512/16=32,一行32个单词。
例如图片左上的4个黑点就是第一个单词的前四位bit(row0,col0-4)

- 这里的除法是整除
- 作为内存的一部分,更准确的地址是第二个

- 如果我们想操作单词里面特定的某一位,how?



Keyboard memory map






4.6 HackProgramming Part 1
使用Hack机器语言进行编程


Way1:by汇编器→机器语言→执行程序(将在proj6编写汇编器)


Way2 : 把机器语言输入到 CPU Emulator(仿真器),执行程序(我们现在的选择)


4.6 4.7 4.8 讨论的内容:

寄存器和内存
寄存器:D A M










如何终结程序


可读性(Hack机器语言的规范)




Hack语言的内置符号







4.7 HackProgramming Part 2

Branching
- 评估布尔表达式或布尔条件,根据这个值决定是否跳跃(go to)
Example
可以看到一开始@后面是数字
(这里的8是第8有效行,从0开始)

符号引用


label :有括号()的叫 label ,可以被引用(如下图)
引用的符号是 @


(上图小字)

标签声明不会被翻译(不是有效行)
引用了标签,就跳转到标签声明的下一行(执行)
标签怎么被引用呢,当触发了条件时

标签的意义:自己做的标签不会被编译,但是比数字更加可读,更清楚地知道什么时候进行分支分叉。
Variables



Example
变量的声明

标签 变量 的区别
**变量的引用 ** 没有()

第一个观察
引用的变量 或者 label都是不被编译的,但是有对应的数字被编译

第二个观察
变量从地址16开始分配RAM,后面的以此类推。

第三个观察
easy to read and debug(可重定位代码) ???




Iterable



通用步骤(编写汇编语言的程序):




4.8HackProgramming Part 3

Pointers





Input / Output








-1的二进制就是1111 1111 1111 1111 ,在图像上就是一行黑线。
然后画下一行,将地址+32就是下一行了(一行32个点,每个点都是16bit的二进制数字)
(16*32=512 一行512像素)











Proj4
4.9 Project 4 Overview






4.10 Project 4

1 | @R0 |


1 |
|
(参考)


