加班再晚,该看的汇编还是得看完。if you're struggling,that means you're progressing.看书时不写废话
一个典型的CUP是由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。在CUP中:
- 运算器进行信息处理;
- 寄存器进行信息存储;
- 控制器控制各个器件进行工作;
- 内部总线连接各种器件,在它们之间进行数据的传送。
8086CPU共有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。程序员通过改变各种寄存器中的内容来实现对CPU的控制。
通用寄存器(AX、BX、CX、DX)
8086CPU的所有寄存器都是16位的,和数据总线一样同为16位,可以存放两个字节AX、BX、CX、DX用于存放一般的数据,被称为通用寄存器。一个寄存器能存储的最大值为1111111111111111(二进制),65535(十进制)。
每个寄存器都能分为两个独立使用的8位寄存器来使用,例如AX可分为AH和AL。
字在寄存器中的存储
8086CPU可以一次性处理以下两种尺寸的数据。1、字节(byte),一个字节由8个bit组成;2、字(word),一个字由两个字节组成。
这里说下数制,通常我们使用十六进制来表示一个数据,因为4位二进制数代表一位16进制数,这样看起问题来更为直观。比如二进制0100111000100000可表示为4(0100)、E(1110)、2(0010)、0(0000)十六进制数,如果这个数据在AX中,那么AH为4E、AL为20
几条汇编指令
汇编指令 | 控制CPU完成操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将18送入寄存器AX | AX=18 |
mov ah,78 | 将78送入寄存器AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX |
add ax,bx | 将AX和BX中的数值相加 | AX=AX+BX |
注意:
1、当ax = 8226;bx = 8226执行指令add ax,bx把bx的数据加入ax。ax = 8226 + 8226 = 1044C,但是ax为16为寄存器,只能存放4位十六进制数据所以ax的数据位944C。如果使用的是ah、al8位寄存器,和十六位也是同理。
2、在使用汇编进行数据传送或运算时,注意指令的两个操作对象的位数应当是一致的。比如8位寄存器应该和8位寄存器或者8位寄存器最大值255的数据进行运算;16位寄存器应该和16位寄存器或者16位寄存器最大值65535的数据进行计算。
物理地址
每一个内存单元在存储空间中都有唯一的地址,我们将这个地址称为物理地址。在CPU向地址总线上发出物理地址之前,必须在内部形成这个物理地址。
16位结构的CPU
8086的CPU为16位结构的CPU,特征如下:
- 运算器一次最多可以处理16位数据
- 寄存器的最大宽度为16位(如AX)
- 寄存器和运算器之间的通路为16位(数据总线16位)
8086CPU给处物理地址的方法
8086有20位地址总线,也就是达到2^20*8bit(每个内存单元的大小)=1MB的寻址能力。但是8086又是16位结构在内部一次性处理、传输、暂时存储的地址位16位地址,也就是只达到64KB的殉职能力。
8086CPU采用了地址加法器将2个16位地址合成为一个20位物理地址。
8086CPU相关部件得逻辑结构地址加法器采用物理地址=段地址×16+偏移地址的方法合成物理地址。
打比方
从学校到图书馆的距离位2826米。
当同学A用纸条告诉同学B距离时候,可以在纸条上写入2826。但是如果纸条有两张,但每张纸条只能写三个数字的时候,可以在第一张纸条写入200,第二张纸条写入826,然后约定第一张纸条×10后与第二张纸条相加,200×10+826=2826米。
段地址×16
段地址×16有个更为常用的说话是二进制左移4位,用二进制举例如下:
左移位数 | 二进制 | 十六进制 | 十进制 |
---|---|---|---|
0 | 10 | 2 | 2 |
1 | 100 | 4 | 4 |
2 | 1000 | 8 | 8 |
3 | 10000 | 10 | 16 |
4 | 100000 | 20 | 32 |
故地址加法器的工作过程如下图所示:
地址加法器工作过程段的概念
CPU使用将内存分段的方式来管理内存。例如:10000~100FF内存单元组成一个段,该段的段地址为1000H(根据公式段地址左移4位与偏移地址相加得到的物理地址)大小为100H(0~FF,为FF+1=100)
分段因为数据可以通过不同的段地址和偏移地址指向同一物理地址(段地址2000H,偏移地址1F60H 或者 段地址2100H,偏移地址0F60H),故在描述中可以写为:
- 数据存在内存2000:1F60单元中。
- 数据存在内存的2000H段中的1F60H单元中。
段寄存器(CS、SS、DS、ES)
如要访问内存时需要提供段地址和偏移地址。段地址在段寄存器中存放。8086CPU有4个寄存器(CS、SS、DS、ES)
CS和IP
CS和IP时8086CPU中最关键的寄存器,CS为代码段寄存器,IP为指令指针寄存器,在任意时刻,CPU将CS:IP(CS×16+IP)指向的内容当作指令执行。
运算时运行过程如下:
在8086CPU加电启动或复位后,CS和IP被设置为CS=FFFFH, IP=0000H,即在开机启动时,CPU从内存FFFF0H单元中读取第一条指令开始执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。
修改CS、IP的指令
我们通常使用mov指令来修改通用寄存器的值,但是不能用该指令修改CS、IP的值。能够改变CS、IP的内容的指令统称为转移指令。
jmp指令
- jmp 2AE3:3,执行后,CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
- 若只想修改IP的值,可以“jump 某一合法寄存器”
jmp ax | AX | CS | IP |
---|---|---|---|
执行前 | 1000H | 2000H | 0003H |
执行后 | 1000H | 2000H | 1000H |
代码段
将若干地址连续的内存单元看作一个段,根据公式“物理地址=段地址×16+偏移地址”那么:
- 段的起始地址一定是16的倍数。
- 偏移地址为16位,16位地址的寻址能力为2^16=64KB,所以一个段的最大长度为64KB。
将一段内存当作代码段,仅是我们在编程时的一种安排,若要让CPU执行我们放在代码段中的指令,必须将CS:IP指向我们定义代码段的首地址。
网友评论