现在我们的生活离不开计算机,但是计算机是怎么识别用户的指令从而完成一系列的操作?通过这本书,可以大致理解计算机工作的基本原理,扩充自己的知识点。
基础知识
- 汇编指令(mov ax,bx)是机器指令(1000100111011000)的助记符,同机器指令一一对应,两者转换需要编译器。用高级语言描述(ax = bx)。
- 每一种CPU都有自己的汇编指令集。
- CPU可以直接使用的信息在存储器中存放。
- 在存储器中的指令和数据没有任何区别,都是二进制信息。
- 存储单元从零开始顺序编号。
- 一个存储单元可以存储8个bit,即8位二进制数。
- 1 Byte = 8 bit; 1 KB = 1024 Byte; 1 MB = 1024 KB; 1 GB = 1024 MB
每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能:
(1)地址总线的宽度决定的CPU的寻址能力
(2)数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量
(3)控制总线的宽度决定了CPU对系统中其他器件的控制能力最终运行程序的是CPU,我们用汇编语言编程时,必须要从CPU的角度考虑问题。对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,他的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。
寄存器
任何数据,到了计算机中都是以二进制的形式存放的。为了描述不同的问题,又经常将它们用其他的进制来表示。比如寄存器AX中的数据是0100111000100000,这就是AX中的信息本身,可以用不同的逻辑意义来看待它。可以将它看
作一个数值,大小是20000。
当然,二进制数0100111000100000本身也可以表示一个数值的大小,但人类习惯的是十进制,用十进制20000表示可以使我们直观地感受到这个数值的大小。
十六进制数的一位相当于二进制数的四位,如0100111000100000可以表示成4(0100)、E(1110)、2(0010)、0(0000)四位十六进制数。
由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放n个8位的数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的。比如20000写成4E20就可以直观地看出,这个数据是由4E和20两个8位数据构成的,如果AX中存放4E20,则AH里是4E,AL里是20。这种表示方法便于许多问题的直观分析。
计算机中所有信息都是以二进制的形式存储的,机器只能处理二进制信息,“左移4位”中的位,值的是二进制位。
例子,一个数据为2H,二进制形式为10B,对其进行左移运算:
左移位数 二进制 十六进制 十进制
0 10B 2H 2
1 100B 4H 4
2 1000B 8H 8
3 10000B 10H 16
4 100000B 20H 32
观察上面移位次数和各种形式数据的关系,我们可以发现:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
(3)地址加法器如何完成段地址*16的运算?就是将以二进制形式存放的段地址左移4位。
一个数据的十六进制左移1位,相当于乘以16;一个数据的十进制形式左移1位,相当于乘以10;一个X进制的数据左移1位,相当于乘以X。
CPU访问内存单元时,必须向CPU提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
(1)CPU可以用不同的段地址和偏移地址形成同一物理地址。
比如CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满足SA*16 + EA = 21F60H 即可。
(2)偏移地址16位,变化范围 0~FFFFH,仅用偏移地址来寻址最多可寻 64KB 个内存单元。
比如给定段地址 1000H,用偏移地址来寻址,CPU的寻址范围为:10000H ~ 1FFFFH。
在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址。
“数据在21F60H内存单元中” 这句话对于8086PC机一般不这样讲,取而代之的是两种类似的说法: ①数据存在内存 2000:1F60 单元中;②数据存在内存的 2000H 段中的 1F60H 单元中。这两种描述都表示“数据在内存 21F60H 单元中”。
可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。
- 段地址在8086CPU的段寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
- CS 存放指令的段地址,IP存放指令的偏移地址。
8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行。 - 8086CPU的工作过程:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP指向下一条指令;
(3)执行指令。(转到步骤1,重复这个过程) - 8086CPU提供转移指令修改CS、IP的内容。
寄存器(内存访问)
- 字在内存中储存时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
- 用 mov 指令访问内存单元,可以在 mov 指令中只给出单元的偏移地址,此时,段地址默认在DS 寄存器中。
- [address]表示一个偏移地址为address的内存单元。
- 在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
- mov、 add、 sub 是具有两个操作对象的指令。jmp是具有一个操作对象的指令。
- 在SS、SP中存放栈顶的段地址和偏移地址;提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。
- push指令的执行步骤:
(1)SP=SP-2;
(2)向SS:SP指向的字单元中送入数据。 - pop指令的执行步骤:
(1)从SS:SP指向的字单元中读取数据;
(2)SP=SP+2 - 任意时刻,SS:SP指向栈顶元素。
- 8086CPU只记录栈顶,栈空间的大小我们要自己管理。
- 用栈来暂存以后需要恢复的寄存器内容时,寄存器出栈的顺序要和入栈的顺序相反。
- push、 pop实质上是一种内存传送指令。
操作系统是由多个功能模块机组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。
DOS中一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell。
DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完成其他的相关任务后,在屏幕上显示出由当前盘符和当前路劲组成的提示符,比如:“c:\”或“c:\windows”等,然后等待用户的输入。
用户可以输入所要执行的命令,比如,cd、dir、type等,这些命令由command执行,command执行完这些命令后,再次显示由当前盘符和当前路劲组成的提示符,等待用户的输入。
如果用户要执行一个程序,则输入改程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,commandz暂停运行,CPU运行程序,程序运行结束后,返回到command中,command再次显示由当前盘符和当前路劲组成的提示符,等待用户的输入。
在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。