What & How & Why

这是本文档旧的修订版!


Machine Language

Week 4 notes


Overview

  • Univeraslity: 相同的硬件运行不同的软件 Turing + von Neumann
  • 计算机通过机器语言(二进制指令)来实现软件层面上的不同功能
  • 机器语言提供的的三个信息:
    • Operations:指令需要计算机做什么
    • Counter:指令以及下一步指令是什么
    • Addressing:指令需要操作哪些硬件

Compilcation

  • 计算机只能识别机器语言
  • 人类需要通过编译器将人类友好的语言转化为机器语言
Mnemonics

为了更方便的讨论机器语言,人们通常将指定的代码段与相应的含义(Mnemonic Form)对应起来。下面的例子中,ADD 就是 0100010 对应的 Mnemonic Form。可以观察到的是,这种替代不仅可以代表 operation,也可以代表地址。

需要注意的是:

  • 类似 ADD 这样的形式不是真正存在的
  • 人类通过汇编语言(assembly language)来讲上述形式转化为机器语言
Symbols

Symbols 主要应用于简化内存寻址的过程。比如维护一个 index,将指定的内存区域分为不同的片区,当需要对指定区域进行操作时,我们可以通过对应的 index 对其进行快速访问。这种将 symbol 与实际内存地址建立映射关系的方式,会大大增强程序的易读性和可维护性。该映射关系也是由 assmbler 来翻译的。

Machine Languages: Elements

  • 机器语言是硬件与软件的 Interface,其决定了硬件可以进行什么样的操作
  • 硬件与软件层面的操作通常接近,但不一定一一对应
  • 机器语言的复杂程度取决于设计。通常,设计的操作越复杂,硬件层面的实现花费就越高。

Machine operations

  • 算术运算:add / sub
  • 逻辑运算:and / or
  • 流程控制(flow control)

不同的机器语言之间的实现可能并不相同,取决于其复杂度。

Addressing

内存寻址是一项非常昂贵的操作。通常来说,有两个问题:

  • 内存越大,需要提供的地址就越长
  • 内存越大,访问指定内存的时间就越长
Memory Hierarchy

解决方案是提供内存的级联:将内存按速度进行划分,不同速度的内存区域对应不同的任务。需要注意的是,速度越快,对应的内存就越小。

Registers

寄存器是访问速度最快的内存,通常由 CPU 内置。寄存器分为几个类型:

  • Data Registers:比如 add r1 r2r1r2 就是该加法操作中,对应数据所在的寄存器名称。
  • Address Registers:类似于指针,作为某一片我们需要使用的内存区域的入口
Addressing Modes

# Register mode R2 <- R2 + R1
Add R1, R2
# Direct mode Mem[200] <- Mem[200] + R1
Add R1, M[200]
# Indirect Mem[A] <- Mem[A] + R1
Add R1, @A
# Immediate R1 <- R1 + 73
Add 73, R1

Input / Output

外设(键盘鼠标)通常通过寄存器链接,并通过一定的协议(驱动)来使其工作。

Flow Control

  • 通常按顺序执行
  • 某些情况需要进行跳转(unconditional jump),比如 loop
    • 通常使用寄存器来存储每次迭代的结果
    • loop 的起始点通常会使用一个名字与其地址相关联,方便跳转(比如 loop 关联到 102,则使用 Jump loop 等同于 jump 102)