《程序是怎样跑起来的》矢泽久雄[日] 读书笔记,详细建议阅读原版图书学习
一 CPU是什么
1 程序由指令与数据组成,是指示计算机每一步动作的一组指令,机器语言指的是CPU可以直接识别并使用的语言。
2 程序运行流程示例图
3 IC: 集成电路
4 CPU的内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。寄存器可用来暂存指令、数据等处理对象,可以将其看作是内存的一种。根据种类的不同,一个CPU内部会有20~100个寄存器。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号,其实所谓的控制就是指数据运算以外的处理(主要是数据输入输出的时机控制),需要着重了解的是寄存器。
5 程序是把寄存器作为对象来描述的。机器语言级别的程序是通过寄存器来处理的。也就是说,在程序员看来“CPU是寄存器的集合体”。
程序计数器决定着程序的流程。“跳转到0104地址”这个指令间接执行了“将程序计数器设定成0104地址”这个操作。
是否执行跳转指令,则由CPU在参考标志寄存器的数值后进行判断。
基址寄存器和变址寄存器。通过这两个寄存器,我们可以对主内存上特定的内存区域进行划分,从而实现类似于数组的操作。
6 汇编语言和机器语言基本上是一一对应的。通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。
eax和ebp是CPU内部的寄存器的名称。内存的存储场所通过地址编号来区分,而寄存器的种类则通过名字来区分。
7 CPU执行比较的机制很有意思,因此请大家务必牢记。例如,假设要比较累加寄存器中存储的XXX值和通用寄存器中存储的YYY值,执行比较的指令后,CPU的运算装置就会在内部(暗中)进行XXX-YYY的减法运算
8 函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。call指令会把调用函数后要执行的指令地址存储在名为栈[插图]的主存内。函数处理完毕后,再通过函数的出口来执行return命令。return命令的功能是把保存在栈中的地址设定到程序计数器中。在编译高级编程语言的程序后,函数调用的处理会转换成call指令,函数结束的处理则会转换成return指令。
9 CPU可以进行的处理非常少。虽然高级编程语言编写的程序看起来非常复杂,但CPU实际处理的事情就是这么简单。
二 二进制
1 IC的所有引脚,只有直流电压0V或5V[插图]两个状态。也就是说,IC的一个引脚,只能表示两个状态。
2 计算机所处理的信息的基本单位是8位二进制数。8位二进制数被称为一个字节。
3 二进制数所特有的运算,也是计算机所特有的运算,因此可以说是了解程序运行原理的关键。移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。>运算符。>运算符的左侧是被移位的值,右侧表示要移位的位数。
对程序员来说,掌握位运算和逻辑运算的机制是一项基本技能,所以一定要掌握。十进制数左移后会变成原来的10倍、100倍、1000倍……同样,二进制数左移后就会变成原来的2倍、4倍、8倍……反之,二进制数右移后则会变成原来的1/2、1/4、1/8
4 二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。计算机在做减法运算时,实际上内部是在做加法运算。
为此,在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数,为了获得补数,我们需要将二进制数的各数位的数值全部