Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第三十六章:用汇编语言指挥计算机

复习

  • 程序是一串放在存储器中的指令,程序计数器负责依次取出它们。
  • CPU 能读写存储器、做运算,也能通过输入输出接口影响外部世界。

TL;DR

  • CPU 只认识由 0 和 1 组成的机器指令。
  • 汇编语言用简短的单词替人书写这些指令。
  • 汇编语言没有让计算机变聪明;它先让人能读懂程序。

正文

  在上一章里,我们让小计算机执行了这样的程序:

LOAD A, [20]
LOAD B, [21]
ADD  R, A, B
STORE [22], R

  这已经很像人能读的文字了。但请别忘记:CPU 并不认识 LOADADD 或方括号。对它来说,一条指令只是若干位。假设我们的小机器规定,0001 表示“从存储器取数到 A”,后面 8 位是地址;那么“把地址 20 的数读到 A”真正放进存储器的内容,可能是:

0001 00010100

  直接写这些位当然可行,可人一旦要写几十条指令,就很容易把 00010100 写错,之后也很难看出它原来想表示什么。于是人们给常用的机器指令起了短名字:LOADSTOREADDJMP。这套用助记词书写的程序,就是汇编语言

  汇编语言离机器很近。一句 ADD R, A, B 通常对应一条机器指令;寄存器、地址和跳转都仍然露在纸面上。它不像自然语言那样含糊:每条语句都要能明确翻译成这台机器支持的某种编码。

  因此,我们可以把同一个动作写成两种样子:

给机器的内容给人看的写法
0001 00010100LOAD A, [20]
0011 00000000ADD R, A, B

  右边更适合人写和检查,左边才是 CPU 最终执行的东西。稍后会有一个工具负责这次翻译;目前可以先把汇编语言看成写在机器码上方的一层清晰注释,只不过它的注释足够精确,能够自动变成机器码。

  不过,[20] 仍然不太友好。地址 20 到底存着什么?如果在程序前面插入一条指令,后面的跳转地址又该怎样改?下一章,我们给这些位置起名字。

思考题

汇编语言的 ADD 能让一台原本没有加法器的计算机完成加法吗?

小结

知识点

  • 机器语言是 CPU 直接执行的二进制指令。
  • 汇编语言用助记词表示机器指令,仍紧贴具体硬件。
  • 每种 CPU 的指令编码和汇编语言都可能不同。

参考资料

  • Charles Petzold,《编码:隐匿在计算机软硬件背后的语言与逻辑》
  • David Patterson、John Hennessy,《计算机组成与设计》

思考题答案(仅供参考)

  不能。ADD 只是对某条机器指令的名字;真正完成加法的是 CPU 内的运算电路。没有相应硬件,就没有可翻译的加法指令。

协议

本文采用 CC BY-NC-SA 4.0 协议发布。