计算机其实是:接收用户输入指令与数据,经过中央处理器的数据与逻辑单元运算处理后,产生或存储有用的信息。
计算机可以分为三部分
- 输入单元
- 中央处理器(CPU)
- 输出单元
整台机器的重点在于中央处理器(Central Processing Unit, CPU),CPU为一个具有特定功能的芯片,里面有微指令集。CPU可以分为两个主要单元,分别是算术逻辑单元和控制单元,算术逻辑主要负责程序运算和逻辑判断,控制单元则主要协调各组件和各单元间的工作。CPU读取的数据是从内存中读取的,内存中的数据可以从输入单元传输进来的,而CPU处理完毕的数据也必须要先写回内存中,最后数据才从内存传输到输出单元。也就是说,CPU必须经过和内存交互这层,才能与输入输出单元交互。
文字编码系统
所谓的编码系统可以想成是一个“字码对照表”,它把文字数据映射成固定的二进制编码进行存储。
为了解决语言之间的兼容问题,国际组织ISO/IEC指定了Unicode编码系统,即我们常称呼的UTF8。
汇编指令
机器指令1000100111011000,表示把寄存器BX的内容送到AX中,汇编指令则写写成
move ax,bx
汇编由以下三类指令组成:
- 汇编指令
- 伪指令:没有对应的机器码,由编译器执行,计算机不执行
- 其他符号
汇编的核心是汇编指令。
指令和数据
指令和数据是应用上的概念,在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作的时候把有的信息看做指令,有的信息看做数据。
存储单元
存储器被分成若干个存储单元,每个单元从0开始顺序编号,例如一个存储器有128个存储单元,编号从0~127。
那么一个存储单元存储多少信息呢,微机存储器的容量是以字节(byte)为最小单位的,也就是8bit。
0/1的单位我们成为1bit,但1bit太小,因此定义出Byte单位,1Byte=8bit。所以1GB文件的大小实际为1024 * 1024 * 1024B。
CPU对存储器的读写
CPU从内存中读数据,必须和外部组件确定以下三个信息:
- 存储单元的地址(地址信息)
- 器件的选择,读或写的命令(控制信息)
- 读或写的数据(数据信息)
CPU通过外部总线将信号传递给存储器。通过地址总线来指定存储器单元。假设一个CPU有10根地址总线,一根导线可以传送的稳定状态只有两种,高电平或者低电平。所以10根总线可以寻址的最小数为0,最大数为1024,即2的10次方。
CPU与内存或其他器件之间的数据传送是通过数据总线来进行的,CPU对外部组件的控制是通过控制总线来进行的。
存储芯片类型
存储芯片分为两类: 随机存储器(RAM)和只读存储器(ROM)。随机存储器可读可写,但关机后内容丢失,只读存储器关机后的内容不丢失。
存储器在物理上是独立器件,但是以下两点相同:
- 都和CPU的外部总线相连
- CPU对它们进行读写的时候都通过控制线发出内存读写命令。
每个物理存储器在逻辑存储器中占有一个地址段,即一段地址空间,CPU在这段空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
因为受CPU寻址能力的限制,所以内存存储空间的大小受CPU外部总线宽度的限制。
寄存器
一个典型的CPU有运算器、控制器、寄存器等构成。在CPU中:
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件工作
- 内部总线(不是上面说的外部总线),在它们之间进行数据的传送
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器被称为通用寄存器,来存放一般性数据。
AX的低8位(0-7位)构成了AL寄存器,高8位构成了AH(high)寄存器。(十六进制数的一位相当于二进制数的四位)
一个字记为word,由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。比如一个字型数据20000,存在AX寄存器中,大小是20000,又可以看做是两个独立的字节型数据,大小为78和32
以下指令把18送入寄存器AX,不区分大小写。
move ax,18
16位结构的CPU
8086CPU就是16为结构的CPU,它描绘了以下特性:
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器与运算器之间的通路为16位
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。从8086CPU的内部结构看,如果将地址从内部简单发出,那么它只能送出16位的地址,变现出的寻址能力只有64KB。所以它采用两个16位地址合成的方法来形成一个20位的物理地址。
- CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个16位地址合成一个20位的物理地址
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路,然后送上地址总线。
- 地址被传送到存储器
地址加法器采用物理地址=段地址 * 16 + 偏移地址的方法合成。
CS和IP
CS和IP是8086CPU中最关键的两个寄存器,他们指示了CPU要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。在任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。
读取指令之后,IP值自增,在执行指令之前,会继续读取下一条指令。
那么怎么设置CS和IP的值,其他寄存器都是通过传送指令mov
mov ax,123
但是不适用于CS和IP,可以使用jmp指令
jmp 2AE3:3
执行后:CS=2AE3H,IP=0003H
内存中字的存储
CPU中用16位寄存器来存储一个字,在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放。
比如我们存储0、1两个内存单元存放数据20000(4E20H,H代表十六进制),对于这个字单元,0号单元是低地址单元,1号单元是高地址单元,则0号单元存放20H,1号单元存放4EH。
##DS和[address]
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。比如我们要读取1000H单元的内容,可以用如下的程序段进行
mov bx,1000H
mov ds,bx
mov al,[0]
先把段地址送入BX寄存器中。1000H用段地址和偏移地址表示为1000:0,再把段地址1000H放入ds,然后用move al, [0]完成1000H到al的数据传送。
那么把数据从寄存器送入内存单元,则是:
mov bx,1000H
mov ds,bx
mov [0],al
10000H到10003H的数据分别为23、11、22、66。来看下以下指令执行后,ax, bx, cx中的值
mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
add bx,[1]
add cx,[2]
前两条指令将ds设为1000H。
第三条在1000:0处存放的字型数据送入ax:1000:1单元存放的是字型数据的高8位,1000:0存放字型数据的低8位,所以指令执行之后ax中的数据为1123H。bx的数据为6622H,cx的数据为2211H。再接下来bx通过相加,数据变更为8833H,cx也相同。