1.2CPU是寄存器的集合体
程序是把寄存器作为对象来描述的。
通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。
汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言 指令都会有一个与其相应的助记符,助记符通常为指令功能的英语单词的简写。
eax和ebp是CPU内部的寄存器的名称。
寄存器的主要种类:累加寄存器、标志寄存器、程序计数器、基址寄存器、变址寄存器、通用寄存器、指令寄存器、栈寄存器。
1.3决定程序流程的程序设计
存储指令和数据的内存,是通过地址来划分的。
CPU每执行一个指令,程序计数器的值就会自动加1。例如,CPU执行0100地址的指令后,程序计数器的值就变成了0101(当执行的指令占据多个内存地址时,增加与指令长度相应的数值)。然后,CPU的控制器就会参照程序计数器的数值,从内存中读取命令并执行。
1.4条件分支和循环机制
程序的流程分为顺序执行、条件分支和循环三种。
顺序执行:是指按照地址内容的顺序执行指令。
条件分支:是指根据条件执行任意地址的指令。
循环:是指重复执行同一地址的指令。
顺序执行的情况比较简单,每执行一个指令程序计数器的值就自动加1。但若程序中存在条件分支和循环,机器语言的指令就可以将程序计数器的值设定为任意地址(不是+1)。这样一来,程序便可以返回到上一个地址来重复执行同一个指令,或者跳转到任意地址。
标志寄存器的第一个字节位、第二个字节位和第三个字节位的值为1时,表示运算结果分别为正数、零和负数。
程序中的比较指令,就是在CPU内部做减法运算。
1.5函数的调用机制
函数调用使用的是call指令,而不是跳转指令。在将函数的入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为栈 的主存内。函数处理完毕后,再通过函数的出口来执行return命令。return命令的功能是把保存在栈中的地址设定到程序计数器中。
在编译高级编程语言的程序后,函数调用的处理会转换成call指令,函数结束的处理则会转换成return指令。
1.6通过地址和索引实现数组
数组是指同样长度的数据在内存中进行连续排列的数据构造。用一个数组名来表示全体数据,通过索引来区分数组的各个数据(元素)。例如,一个10个元素的数组a,其中的各个数据就用a[0]~a[9]来表示。[]内的数字0~9就是索引。
CPU会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。
1.7CPU的处理其实很简单