Machine Language

4.1 Machine Languages : Overview

image-20250502141034037

内部:

  • 内存包括:程序内存和数据内存

  • 硬件是固定的,软件可更改

  • 软件变化,故计算机可做不同的事情(计算机的universality)

image-20250408125639911

let us see how hardware can do many things:

  • by硬件逐个执行指令,把整个指令序列执行完放在一起,就得到了整个程序的功能。

image-20250408125753379

⭐3-Question

image-20250408125900431

image-20250408125917903

image-20250408125923522

image-20250408125934885

image-20250408130008095image-20250408130013135


machine language ← assembly language

image-20250408130111212

我们写程序用的是高级语言,但电脑真正理解和执行的是机器语言

(其实里面的编译器是分两部的,第一步是高级语言→汇编语言,第二步是汇编语言→机器语言,now看的是part1)

image-20250408130331472

image-20250408130344599

image-20250408130425028

image-20250408130503603

第一种解释

image-20250408130536998

第二种解释

image-20250408130616234

image-20250408131151981

image-20250408131707478

next

image-20250408131747616


4.2 Machine Languages : Elements

Machine Language

image-20250408132050542

image-20250408132302481

image-20250408132600568

Memory Hierarchy

image-20250408132620787

image-20250408132737232

image-20250502144445704

image-20250408132934690

Registers (in CPU)(Q1Q3)

image-20250408133025180

image-20250408133054897

用法/类型①

image-20250502144901245

image-20250502144827311

image-20250408133256967

用法/类型②

image-20250502144926736

so that we can

image-20250502145149469

eg

image-20250502145219880

image-20250408133356395

image-20250408133409201

image-20250408133424956

Addressing Modes

  • 现在回到最初的问题:

image-20250408133452806

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

image-20250408133504911

Intput / Output

image-20250408133742680

Flow Control(Q2)

image-20250408133830358

image-20250408133842300

image-20250408133918049

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

image-20250408134216292

image-20250408134345222


HACK Language

4.3 HACK Computer and Language (Overview)

hardware

  • 以下是下周要搭建的计算机(hardware)的概述:

image-20250408144525868

software

  • control the computer

image-20250408144707993

image-20250408144727327

reset bottom

image-20250408144804152

registers

image-20250408145050542

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

The A-instruction

image-20250408145242790

image-20250408145318144

image-20250408145335059

The C-instruction

image-20250408145347021

image-20250408145445185

  • dest目的地,comp计算,jump跳转

  • 看到A的时候,也可以用M替代

  • eg

image-20250408145651883

image-20250408145713384

image-20250408145750031

image-20250408145851786

image-20250408150017420

image-20250408150027153

image-20250408150142297

image-20250408150531444

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

image-20250408150819756

image-20250408150831390

image-20250408150843125

image-20250408150854396


4.4 Hack Language plus

Use Binary to write

image-20250408152040771

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

image-20250408152117325

image-20250408152332506

C-ins

image-20250408152519706

image-20250408152600779

image-20250408152758307

image-20250408152841602

image-20250408152923618

Eg

image-20250502154554223

image-20250502154613246

next

image-20250408153534999


4.5 Input / Ouput

  • 本节讨论:如何通过使用机器语言 来控制和操作 这些I/O设备

Hack computer platform

image-20250408154943693

实现:

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

image-20250408155051269

OutPut

image-20250408155241432

image-20250502155831854

Screen memory map

  • make a deep study in …

image-20250502160036115

  • 每行每列的交叉点,都有所谓的像素。

  • how do we control it?

image-20250408155514485

  • 这些值的每一个有时被称为一个单词

  • 所以有8k,每一个都是16bit的单词

  • 像素怎么算:8k*16≈130,000

  • 一个像素就是一个bit,一个bit就是一个像素

  • 那么怎么对应呢?哪个bit位于哪个像素?

  • 512/16=32,一行32个单词。

  • 例如图片左上的4个黑点就是第一个单词的前四位bit(row0,col0-4)

image-20250408155820456

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

image-20250408160355257

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

image-20250408160452787

image-20250408160937267

Keyboard memory map

image-20250408161538288

image-20250408161600439

image-20250408161645079image-20250408161745467

image-20250408161911388

image-20250408162004740


4.6 HackProgramming Part 1

使用Hack机器语言进行编程

image-20250408170651825

image-20250408170710787

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

image-20250408170815973

image-20250408170841654

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

image-20250408170949958

image-20250408171006210

4.6 4.7 4.8 讨论的内容:

image-20250408171140334

寄存器和内存

寄存器:D A M

image-20250408171208123

image-20250408171221797image-20250408171240428

image-20250408171249595

image-20250408171300916image-20250408171306564

image-20250408171321352

image-20250408171545734

image-20250408171835773

image-20250408171859789

如何终结程序

image-20250408172553897

image-20250408172808706

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

image-20250408172907182

image-20250408172956750

image-20250408173136744

image-20250408173149349

Hack语言的内置符号

image-20250408173355650

image-20250408173407233

image-20250408175526572

image-20250408173419671

image-20250408173433439

image-20250408173511898


4.7 HackProgramming Part 2

image-20250408175652006

Branching

  • 评估布尔表达式或布尔条件,根据这个值决定是否跳跃(go to)
Example

可以看到一开始@后面是数字

(这里的8是第8有效行,从0开始)

image-20250408175934716

符号引用

image-20250408180345936

image-20250408180437096

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

引用的符号是 @

image-20250408180508403

image-20250408185937593

(上图小字)

image-20250408180613605

  • 标签声明不会被翻译(不是有效行)

  • 引用了标签,就跳转到标签声明的下一行(执行)

  • 标签怎么被引用呢,当触发了条件时

image-20250408180736935

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


Variables

image-20250408181502003

image-20250408181507772

image-20250408181516292

Example

变量的声明

image-20250408181712643

标签 变量 的区别

**变量的引用 ** 没有()

image-20250408181819165

第一个观察

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

image-20250408181922547

第二个观察

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

image-20250408182159346

第三个观察

easy to read and debug(可重定位代码) ???

image-20250408182323581

image-20250408182346704

image-20250408182351776

image-20250408182400615

Iterable

image-20250408182556754

image-20250408182619170

image-20250408182712743

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

image-20250408183553976

image-20250408183605081

image-20250408183616168

image-20250408183654849


4.8HackProgramming Part 3

image-20250408193159878

Pointers

image-20250408193340051

image-20250408193454956

image-20250408193503108

image-20250408193614636

image-20250408194303828

Input / Output

image-20250408194624386

image-20250408194713298

image-20250408194740498

image-20250408195434479

image-20250408195506221

image-20250409085602507

image-20250409090013332

image-20250409090019914

-1的二进制就是1111 1111 1111 1111 ,在图像上就是一行黑线。

然后画下一行,将地址+32就是下一行了(一行32个点,每个点都是16bit的二进制数字)

(16*32=512 一行512像素)

image-20250409085922633

image-20250409090618399

image-20250409090704474

image-20250409090843101

image-20250409090851821

image-20250409090858509

image-20250409091019503

image-20250409091145770

image-20250409091237626

image-20250409091410869

image-20250409091513788


Proj4

4.9 Project 4 Overview

image-20250409091626333

image-20250409091812658

image-20250409092150938

image-20250409092627420

image-20250409093508008

image-20250409093530565


4.10 Project 4

image-20250413153708189

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@R0
D=M
@a
M=D // a=R0

@R1
D=M
@b
M=D // b=R1

@0 //
D = A //
@R2
M=D // R2=0

(LOOP) //
@a
D=M
@STOP
D;JLE // while (a>0),continue,or goto 'stop'

@b
D=M
@R2
M=M+D // R2=R2+b

@a
M=M-1 //a=a-1

@LOOP //
0;JMP //

(STOP) //
@stop
0;JMP

// 大部分自己写出来了!小部分不到位。

image-20250413164147760

image-20250413163504053

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

@KBD // define KBD
D=M

@i
M=0 // define i


(BLACK)
@KBD
D=M
@WHITE
D;JLE

@i //
A=M //
M=-1 // RAM[addr] = -1

@i
M=M+1 // i++

@BLACK
0;JMP


(WHITE)
@i
A=M //
M=0 //
@i //
M=M+1 //

@WHITE
0;JMP

// 大概逻辑写出来了,就是细节不到位。

(参考)

image-20250409090618399

image-20250409090019914