【第1章:对程序员来说CPU是什么】CPU是寄存器的集合体

累加寄存器,标志寄存器,程序计数器,基址寄存器,变址寄存器,通用寄存器,指令寄存器,栈寄存器

Posted by x-jeff on August 28, 2022

博客为参考《程序是怎样跑起来的》一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.CPU是寄存器的集合体

CPU的四个构成部分中,我们只需了解寄存器即可。因为程序是把寄存器作为对象来描述的

首先我们来看一下代码清单1-1:

这是用汇编语言(assembly)$^{1}$编写的程序的一部分。汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言$^2$指令都会有一个与其相应的助记符,助记符通常为指令功能的英语单词的简写。例如,mov和add分别是数据的存储(move)和相加(addition)的简写。汇编语言和机器语言基本上是一一对应的。这一点和C语言、Java语言等高级编程语言$^3$有很大不同,这也是我们使用汇编语言来说明CPU运行的原因。通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编

  1. 把汇编语言转化成机器语言的程序称为汇编器(assembler)。有时汇编语言也称为汇编。
  2. 机器语言是指CPU能直接解释和执行的语言。
  3. 高级编程语言是指能够使用类似于人类语言(主要是英语)的语法来记述的编程语言的总称。BASIC、C、C++、Java、Pascal、FORTRAN、COBOL等语言都是高级编程语言。使用高级编程语言编写的程序,经过编译转换成机器语言后才能运行。与高级编程语言相对,机器语言和汇编语言称为低级编程语言。

这里简单解释下代码清单1-1。dword表示双字,即四个字节。ptr表示指针。[]里的数据是一个地址,该地址指向一个双字型数据。mov eax, dword ptr [ebp-8]表示的就是把ebp-8这个地址上的双字型数据复制到eax。add eax, dword ptr [ebp-0Ch]表示把ebp-0Ch这个地址上的双字型数据加到eax上。mov dword ptr [ebp-4], eax表示把eax中保存的双字型数据存储在ebp-4这个地址中。

代码清单1-1中应该是有笔误,把eax写成了exa。上述解释不一定准确,但大概就是这个意思,后续博文会有对汇编语言的进一步介绍。

代码清单1-1中,eax和ebp表示的都是寄存器。

eax是累加寄存器,主要功能是运算。ebp是扩展基址指针寄存器,主要功能是存储数据存储领域基点的内存地址。

汇编语言是80386$^1$以上的CPU所使用的语言。eax和ebp是CPU内部的寄存器的名称。内存的存储场所通过地址编号来区分,而寄存器的种类则通过名字来区分。

  1. 80386是美国英特尔公司开发的微处理器的产品名。“80386以上”是指80386、80486、奔腾等微处理器。

使用高级语言编写的程序会在编译$^1$后转化成机器语言,然后再通过CPU内部的寄存器来处理。例如,a=1+2这样的高级语言的代码程序在转化成机器语言后,就是利用寄存器来进行相加运算和存储处理的。

  1. 编译是指将使用高级编程语言编写的程序转换为机器语言的过程,其中,用于转换的程序被称为编译器(compiler)。

不同类型的CPU,其内部寄存器的数量、种类以及寄存器存储的数值范围都是不同的。不过,根据功能的不同,我们可以将寄存器大致划分为八类,如表1-1所示。可以看出,寄存器中存储的内容既可以是指令也可以是数据。其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。数据种类不同,存储该数值的寄存器也不同。CPU中每个寄存器的功能都是不同的。

如图1-3所示,CPU是具有各种功能的寄存器的集合体。其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。