Posts 从零开始构建计算机chapter4_机器语言
Post
Cancel

从零开始构建计算机chapter4_机器语言

一些背景

机器语言

1
可以被看作是一种约定的形式,它利用处理器和寄存器来操控内存。
  • 内存 Mermory RAM M 所有的内存具有相同的结构:一个连续的固定宽度的单元序列,也称为字(word)或内存单元,每个内存单元都一个唯一的地址(address)。

  • 处理器

  • 寄存器 寄存器内存访问是相对较慢的操作,需要很长的指令格式(一个地址可能需要32位)。基于此原因,大多数处理器都配有一些寄存器,每个寄存器只存储1位。它紧挨着处理器,相当于处理器的一个高速本地内存,使得处理器能快速地操控数据和指令。寄存器使得程序员能够尽可能地使用内存访问命令,从而加速程序的执行。

  • 助记符 怎么说呢, 程序员不可能用101010 来写代码。 助记符是一种标记符号,他的名字暗示了它所代表的意思。

  • 汇编语言与汇编译器 将这种符号抽象更进一步发展,我们不仅能够阅读符号表示,而且能实际地利用这些符号命令而不是二进制指令来编写程序。接下来,可以使用文本处理程序,将这些符号命令解析为其内含的意域(助记符或操作数),将每个意域翻译成其对应的二进制表示,然后将生成的代码汇编成二进制机器指令。符号表示也称为汇编语言(assembly language),或简单地说成汇编,而将汇编程序翻译成二进制码的程序则称为汇编编译(assembler)。

命令

1
2
3
内存访问分为两种。
1. 直接操纵机损其与内存单元。
2. load 和 store 命令。 在寄存器与内存之间传递数据。

三种寻址方式:

  • 直接寻址

    1
    
    LOAD R167//R1-Memory[67]
    
  • 立即寻址 这种寻址方式被用来加载常数——也就是说,加载那些出现在指令代码里面的数值:我们直接将指令数据域中的内容当作要操作的数据装入寄存器,而不是将该数值当作内存单元的地址

    1
    
    LOADI R1,67//R1-67
    
  • 间接寻址 这个有点不太好解释。

hack语言

内存地址空间

  • 指令地址空间
  • 数据地址空间 两个内存区都是16-位宽,有15-位地址空间,这意味着两个内存可设的最大地址都是32K的16-bit word。 cpu仅能执行存储在指令内存中的程序

寄存器

Hack程序员要接触两个称为D和A的16-位寄存器。D仅用来储存数据值,A既可作为数据寄存器也可作为地址寄存器。

A寄存器

  • 间接访问 由于Hack的指令是16-位宽,而对地址的描述要用到15位,所以将操作码和地址都存放在同一条指令中是不可能的。因此,Hack语言的语法规定,内存的存取指令是对隐式的内存地址“M”进行操作,比如D=M+1。为了解析这个地址,规定M总是代表一个内存单元中的数值,该内存单元的地址就是当前A寄存器中的数值。比如说,如果想要执行操作D=Memory[516]-1,就必须使用一条指令来将A寄存器的值置为516,然后使用指令D=M-1来完成操作。 简单来说,想要操纵内存数据。 要先将内存地址置于A中,随后对A进行操作。

  • 直接访问 另外,身兼重任的A寄存器也被用来对指令存储器进行直接访问。与内存访问规则一致,Hack的jump指令并不指定某个特定地址。其规定是:任何jump操作总是执行这样的跳转,即跳转到“A寄存器所指定的指令”。

  • @value 这个特定的值存在A寄存器中 @value,这里value可以是数值或是代表数值的符号。这个命令将特定的值存到A寄存器中。比如,如果sum代表内存地址17,那么@17和@sum都将具有一样的功能:A<-17。

D寄存器

D寄存器仅用来存储数据。

两个指令 A-指令与C-指令

每个涉及内存地址的操作需要两个Hack命令:一个用来确定将要进行操作的内存单元地址,另一个用来描述要进行的操作。Hack语言正包含了两种指令:一种是地址指令,也称为A-指令;另一种是计算指令,也称为C-指令。每种指令都有二进制表示法和符号表示法,并且都能对计算机产生特定的作用。

A指令(地址指令)

A指令用来设置A寄存器15位的值。

p1

比如说,指令@5,也等价于0000000000000101,则使得计算机将用二进制表示的5储存到A寄存器中。 A指令的三种用法:

  • 提供唯一一种将常数输入到计算机的方法。
  • 将目标数据内存单元的地址放入A寄存器中,位将来对内存单元进行操作C-指令提供必要的操作。
  • 通过将跳转的目的地址放入A寄存器中,为C-指令的跳转提供条件。

C指令

C指令解决的三个问题:

  • 算什么
  • 计算后的值存储到什么地方
  • 下一步做什么

p2 最左边第一位为1,代表C指令。 为0,代表A指令。

comp操作

Hack的设计中,ALU所执行的是一组固定的函数集,该函数集的功能实现了对寄存器D、A、M(M代表Memory[A])的操作。 p3

dest操作

存储到什么地方,A寄存器或者D寄存器。

p4

jump操作

p5

这个例子太好了

p6

总的来说是这样的, 利用@value 给A寄存器赋值。 赋值为地址值或者是真实值。 其次利用C指令,comp计算,dest存储,jump跳转, 最终组合为上述机器语言。 对M的操作,就是对A[地址]的操作。同时,对M的操作也是对M[A]的操作,是对A地址的实际操作

一点记录

这一章节可能是看的最难受的章节了,无数次的反复。 一切源域自己的不细心。 总习惯把难得看不懂的先跳过,跳着跳着就把重点给跳没了。 要谨记。

This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags