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 |
|
(参考)
