汇编语言笔记

一、CPU是通过地址总线,数据总线,控制总线对内存(存储器)进行读写操作

地址总线的根数决定了CPU的寻址能力,假设地址总线有10根,那么CPU可以有2^10个不同的地址进行寻址。
数据总线 8088CPU的数据总线的宽度为8,8086CPU的数据总线的宽度为16。同样的道理,数据总线的宽度决定了CPU一次能读取的数据二进制位数有多大他们分别可以读取最大为2^8和2^16的数据。假设要读取一个数据为89D8H,8088CPU需要读取两次分别读取为89H和D8H。而8086CPU的话只需要进行一次读取89D8H就可以了。
控制总线:CPU对外部器件的控制是通过控制总线来进行的。控制总线是一些控制线的集合。有多少根控制总线,就意味着CPU提供了对外部设备的多少种控制。所以控制总线的宽度决定了CPU对外部设备的控制能力。前面的数据总线读写数据是由控制线综合发出的。其中有一根称为”读信号输出“的控制线负责由CPU向外发出读信号。”写信号输出“负责由CPU向外发出写信号。

在这里插入图片描述

上面那些存储器,在物理上都是独立的器件,但是他们都和CPU的总线相连。CPU对他们进行读写的时候都是通过总线发出的内存读写命令。

在这里插入图片描述
所有的物理存储器被看做是一个由若干个存储器单元构成的逻辑存储器。每个物理存储器在逻辑存储器中占用一个地址段,即一段地址空间。CPU在这一段地址空间进行读写数据,实际上就是在相应的物理存储器中读写数据。

我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。因为当我们想在某类存储器中读写数据的时候,必须知道它的第一个单元的地址和最后一个单元的地址,才能保证读写操作是在预期的存储器中进行。
下面是8086CPU的内存地址分配情况:
在这里插入图片描述

一个典型的CPU由运算器,控制器,寄存器构成。
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
之前所说的总线相对于CPU来说是外部总线,还有CPU的内部总线,内部总线实现CPU内部各个器件之间的联系。
8086CPU有14个不同的寄存器:
AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

例:汇编编程计算2^4
mov ax, 2
mov ax, ax
mov ax, ax
mov ax, ax

二、8086CPU是如何在内部形成内存单元的物理地址的:

概况的讲,一个16位的结构描述了一个CPU具有下面几个特征:
运算器一次最多可以处理16位的数据;
寄存器的宽度最大为16位;
寄存器与运算器之间的通路为16位;
也就是说在8086的内部,能够一次性处理,传输,暂时存储的信息的最大长度为16位。
但是8086CPU有20位地址总线,可以传送20位地址,寻址能力为1MB,8086又是16位的结构,从内部看只能一次送出16位的地址,表现的寻址能力只有64KB。原来在8086CPU中采用了两个16位地址合成的方法来形成一个20位的物理地址。

在这里插入图片描述

当CPU要读写内存时:
1.CPU的相关部件提供两个16位的地址,一个是段地址,一个是偏移地址。
2.段地址和偏移地址通过内部地址总线送入一个称为地址加法器的部件;
3.地址加法器将两个16位的地址和成为一个20位的物理地址;
4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
5.输入输出控制电路将20位物理地址送入外部地址总线;
6.20位的物理地址被地址总线送到存储器。
地址加法器采用物理地址=段地址*16+偏移地址的方法合成物理地址。
*16 在不同的进制表现来看,2进制表示左移4位,16进制表示左移了1位

段寄存器提供段地址,8086CPU有4个不同的段寄存器:CS,DS,SS,ES
cs:ip 指向了CPU即将执行的指令的地址。
我们可以通过mov ax, 123;指令修改通用寄存器的值。但是如何修改cs:ip呢
使用jmp指令进行修改。 jmp 2ae3:3 ;执行后CS=2ae3h;IP=0003H。若指向修改IP的值可以使用:jmp ax等指令完成,它的含义可以理解为:mov IP, ax;

mac下面使用Debug程序,安装DOSBox:https://www.dosbox.com
运行DOSBox 后输入下面的命令将自己创建的DOS目录挂载到c盘:mount c ~/work/DOS

然后进入c盘开始运行debug.exe就可以进行测试啦。

猜你喜欢

转载自blog.csdn.net/cuijun199322/article/details/86656083