第三十六章:用汇编语言指挥计算机
复习
- 程序是一串放在存储器中的指令,程序计数器负责依次取出它们。
- CPU 能读写存储器、做运算,也能通过输入输出接口影响外部世界。
TL;DR
- CPU 只认识由 0 和 1 组成的机器指令。
- 汇编语言用简短的单词替人书写这些指令。
- 汇编语言没有让计算机变聪明;它先让人能读懂程序。
正文
在上一章里,我们让小计算机执行了这样的程序:
LOAD A, [20]
LOAD B, [21]
ADD R, A, B
STORE [22], R
这已经很像人能读的文字了。但请别忘记:CPU 并不认识 LOAD、ADD 或方括号。对它来说,一条指令只是若干位。假设我们的小机器规定,0001 表示“从存储器取数到 A”,后面 8 位是地址;那么“把地址 20 的数读到 A”真正放进存储器的内容,可能是:
0001 00010100
直接写这些位当然可行,可人一旦要写几十条指令,就很容易把 00010100 写错,之后也很难看出它原来想表示什么。于是人们给常用的机器指令起了短名字:LOAD、STORE、ADD、JMP。这套用助记词书写的程序,就是汇编语言。
汇编语言离机器很近。一句 ADD R, A, B 通常对应一条机器指令;寄存器、地址和跳转都仍然露在纸面上。它不像自然语言那样含糊:每条语句都要能明确翻译成这台机器支持的某种编码。
因此,我们可以把同一个动作写成两种样子:
| 给机器的内容 | 给人看的写法 |
|---|---|
0001 00010100 | LOAD A, [20] |
0011 00000000 | ADD R, A, B |
右边更适合人写和检查,左边才是 CPU 最终执行的东西。稍后会有一个工具负责这次翻译;目前可以先把汇编语言看成写在机器码上方的一层清晰注释,只不过它的注释足够精确,能够自动变成机器码。
不过,[20] 仍然不太友好。地址 20 到底存着什么?如果在程序前面插入一条指令,后面的跳转地址又该怎样改?下一章,我们给这些位置起名字。
思考题
汇编语言的
ADD能让一台原本没有加法器的计算机完成加法吗?
小结
知识点
- 机器语言是 CPU 直接执行的二进制指令。
- 汇编语言用助记词表示机器指令,仍紧贴具体硬件。
- 每种 CPU 的指令编码和汇编语言都可能不同。
参考资料
- Charles Petzold,《编码:隐匿在计算机软硬件背后的语言与逻辑》
- David Patterson、John Hennessy,《计算机组成与设计》
思考题答案(仅供参考)
不能。ADD 只是对某条机器指令的名字;真正完成加法的是 CPU 内的运算电路。没有相应硬件,就没有可翻译的加法指令。
协议
本文采用 CC BY-NC-SA 4.0 协议发布。