程序是怎样跑起来的-第01章 对程序猿来说CPU是什么

程序是怎样跑起来的

How Program Works/program |ˈprəʊgræm, American -grəm| 程序

Standing on Shoulders of Giants./shoulder |ˈʃəʊldə(r)| 肩/giant |ˈdʒaɪənt| 巨人


集成开发环境(IDE,Integrated Development Environment)

integrate |ˈɪntɪgreɪt| verb 使成为一体、使融入/environment |ɪnˈvaɪərənmənt| noun 环境


第01章:对程序猿来说CPU是什么

热身问题:

1:程序是什么?

    指示计算机每一步动作的一组指令,一般说的程序如运动会的程序、阅兵式的程序等,指的是“行事的先后顺序”。计算机程序也一样。


2:程序是由什么组成的?

    指令和数据,程序是指令和数据的组合体。


3:什么是机器语言?

    CPU可以直接识别和使用的语言,CPU能够直接识别和执行的只有机器语言。


4:正在运行的程序存储在什么位置?

    内存,硬盘等媒介上保存的程序被复制到内存后才能运行。


5:什么是内存地址?

    内存中,用来表示命令和数据存储位置的数值。内存是保存命令和数据的场所,通过地址来标记和指定。地址由整数值表示。


6:计算机的构成元件中,负责程序的解释和运行的是哪个?

    CPU(中央处理器(Central Processing Unit))。计算机的构成元件中,根据程序的指令来进行数据运算,并控制整个计算机的设备称作CPU。central |ˈsentrəl| 位于中心的/process |ˈprəʊses, American ˈprɒses| A.noun 过程、进程 B.verb 加工、处理/unit |ˈjuːnlt| noun 单元


第1.1节 CPU的内部结构解析

    CPU所负责的就是解释和运行最终转换成机器语言的程序内容。CPU和内存都是由许多晶体管组成的电子部件,通常称为IC(Integrated Circuit,集成电路)。integrate |ˈɪntɪgreɪt| A verb 使成为一体、使融入、求…的积分/circuit |ˈsɜːkɪt| noun 电路、接通/断开电路、环行。

    从功能上看,CPU的内部由寄存器、控制器、运算器和时钟四部分构成,各部分之间由电流信号相互连通。

        1:寄存器可以暂存指令、数据等处理对象,可以将其看作是内存的一种。

        2:控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果控制整个计算机。

        3:运算器负责运算从内存读入寄存器的数据。

        4:时钟负责发出CPU开始计时的时钟信号。

    通常所说的内存指的是计算机的主存储器(main memory),简称主存。主要负责存储指令和数据。主存由可读写的元素构成,每个字节(1节=8位)都带有一个地址编号。CPU可以通过地址读取主存中的指令和数据,当然也可以写入数据。


第1.2节 CPU是寄存器的集合体

    汇编语言(assembly)采用助记符(memonic)来编写程序,每一个原本是电器信号的机器语言指令都会有一个与其相应的助记符,助记符通常为指令功能的英文单词的缩写。例如,mov和add分别是数据的存储(move)和相加(addition)的简写(assembly |əˈsembli| noun 人群 立法机构/memonic 英[me'mɒnɪk]美[me'mɒnɪk] n.记忆存换器 adj.记忆的)。

    汇编语言与机器语言基本上一一对应,通常我们将汇编语言编写的程序转化成机器语言称为汇编;反之,机器语言程序转化成汇编语言程序的过程称为反汇编。

    编译是指将使用高级编程语言编写的程序转换成机器语言的过程,其中用于转换的程序被称为编译器(compiler)。高级语言编写的程序会在编译后转化成机器语言(compiler |kəmˈpaɪlə(r)| noun 编纂者 编译程序/compile |kəmˈpaɪl| verb 编制 编写 撰写)。


    不同类型的CPU,其内部的寄存器的数量、种类以及寄存器存储的数值范围都是不同的。寄存器中存储的既可以是指令也可以是数据。其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。根据寄存器的种类不同我们大致可以把寄存器分为如下八类:

        1:累加寄存器[1个](accumulator register):存储执行运算的数据和运算后的数据(accumulator |əˈkjuːmjʊleɪtə(r)| noun 蓄电池 累加器;register |ˈredʒɪstə(r)| noun 登记簿 注册簿)。

        2:标志寄存器[1个](flag registor):存储运算处理后的CPU的状态。

        3:程序计数器[1个](program counter):存储下一条指令所在内存的地址(program |ˈprəʊgræm, American -grəm| noun 程序;counter |ˈkaʊntə(r)| noun 柜台 计数器)。

        4:基址寄存器[多个](base register):存储数据内存的起始地址(base |beɪs| noun 底部 底座 总部 底面)。

        5:变址寄存器[多个](index register):存储基址寄存器的相对地址。

        6:通用寄存器[多个](general purpose register)存储任意数据(general |ˈdʒenrəl| adj 普遍的 通常的 全体的;purpose |ˈpɜːpəs| noun 目的 用途)。

        7:指令寄存器[1个](instruction register)存储指令。CPU内部使用,程序员无法通过程序对该寄存器进行读写操作(instruction |ɪnˈstrʌkʃn| noun 教导 命令 指令)。

        8:栈寄存器[1个](stack register)存储栈区域的起始地址。


第1.3节 决定程序流程的程序计数器

    CPU每执行一条指令,程序计数器的值就会自动增加增加与指令长度相应的值。然后,CPU控制器就会按照程序计数器的值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程。


第1.4节 条件分支和循环机制

    程序的流程分为顺序执行、条件分支和循环三种。顺序执行是指按照指令的先后顺序执行指令。条件分支是指根据条件执行任意地址的指令。循环是指执行同一地址的指令。

    条件分支和循环中使用的跳转指令,会参照当前执行的运算结果来判断是否跳转。此前我们提到过标志寄存器,无论当前累加寄存器的运算结果是正数、负数还是零,标志寄存器都会将其保存。

    CPU在进行运算时,标志寄存器的数值会根据运算结果自动设定。条件分支在跳转指令前会进行比较运算。至于是否执行跳转指令,则由CPU在参考标志寄存器的数值后进行判断。


第1.5节 函数的调用机制

    和条件分支、循环的机制有所不同,单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。因此,如果只是跳转到函数的入口地址,处理流程就不知道应该返回到哪里了。

    机器语言call指令和return指令能够解决这个问题。建议大家把二者结合起来进行记忆。在将函数的入口地址设定到程序计数器前,call指令会把调用函数后要执行的指令地址存储在名为栈(stack本意为“干草堆堆积如山”)的主存内。函数处理完毕后,再通过函数的出口来执行return命令。return命令的功能是把保存在栈中的地址设定到程序计数器中。


第1.6节 通过地址和索引实现数组

    数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数据元素的各个数据会通过连续的编号被区分开来,这个编号被称为索引(index)。指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作由编译器自动实现(CPU是通过基址寄存器和变址寄存器来指定内存地址的)。CPU会把基址寄存器+变址寄存器的值解释称实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。


第1.7节 CPU的处理其实很简单

    CPU可以处理的处理非常少。虽然高级编程语言编写的程序相当复杂,但是CPU实际处理的事情就是这么简单。

        1:call/retain指令:函数的调用/返回调用前的地址。

        2:跳转指令:实现条件分支、循环、强制跳转等。

        3:运算指令:用累加寄存器执行算数运算、逻辑运算、比较运算和移位运算。

        4:数据转送指令:寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作。

你可能感兴趣的:(CPU的内部结构解析,CPU是寄存器的集合体,决定程序流程的程序计数器,条件分支和循环机制,函数的调用机制)