汇编语言(b)–存储器
对于总线的再认识
在CPU与其他器件的连接线称之为外部总线。有外部总线,那么自然就有内部总线,内部总线就是实现CPU内部各个器件之间的联系,CPU中的各个器件指的是运算器、控制器、寄存器等。
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种组件进行工作
- 内部总线连接各种器件,在它们之间进行数据的传送
学习汇编,最重要的是要掌握和理解寄存器,寄存器是CPU中程序员可以用指令读写的部件。不同的CPU,寄存器的个数、结构是不同的。
以下是以8086CPU为例,因此继续进行8086CPU的讲解。8086CPU共有14个寄存器,每个寄存器有一个名称:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW.
通用寄存器
在8086CPU中所有寄存器都是16位的,通用寄存器是上述X结尾的,它的功能是用来存放一般性数据。
另外为了兼容8086CPU之前的CPU编写的程序,因此通用寄存器可以分为两个独立的8位寄存器来使用。而且他们的划分为IH(high)和AL(low)。
字在寄存器中的存储
字节可以存在8位寄存器中,由于字是占两个字节,因此其存在16位寄存器中。
值得注意的是,16进制以H结尾,2进制以B结尾,10进制结尾不加其他成分,另外由于为了表述的方便,在之后的汇编学习中一般使用16进制。
几条汇编指令
物理地址
每一个内存单元都有一个唯一的地址,这个地址就叫做物理地址。
不过除了物理地址,难道还有逻辑地址??
一般而言,我们所说的16位结构(或16位机)描述的是CPU的下面几个方面的结构特性:
- 运算器一次最多处理16位数据
- 寄存器最大宽度为16位
- 寄存器与运算器之间的通路为16位
多加几条通路就可以了,为什么不直接使用32位机*是什么因素限制了计算位数的发展?*
8086CPU给出物理地址的方法
由于8086CPU共有20位地址总线,可以传达20位地址,达到1MB寻址能力,但是由于其CPU是16位结构,因此寻址能力只能限制在16位,只有64KB。那么有没有什么办法将寻址能力扩展到20位地址呢?
这就需要进行地址的合成了:
物理地址 = 基础地址(段地址*16) + 偏移地址
段的概念
暂时没有清晰的认识与理解
段寄存器
段寄存器就是存放段地址的地方,8086CPU共有4个段寄存器:CS、DS、SS、ES。
CS 和 IP
我们可以理解为:CS就是存放的段地址,而IP存放的是偏移地址。
由于CPU是16位,而地址总线为20位的原因,因此8086CPU中是通过CS:IP来进行访问的。
8086CPU的工作流程
1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓存器
2. IP = IP + 所读取指令的长度,从而指向下一条指令
3. 执行指令。转到步骤(1),重复这个过程
修改CS,IP指令
CS, IP由于都不是通用寄存器,因此其修改不能使用mov,而是使用jmp
例如实例:
jmp 3:01B6
jmp bx
jmp中如果只有一个地址内容或者是数值,那么修改的就是IP中的内容,如果是两个并且中间以冒号隔开,那么就是CS和IP两者都被修改。
实验一:查看CPU和内存,用机器指令和汇编指令编程
- 用Debug的R命令查看、改变CPU寄存器的内容
- 用Debug的D命令查看内存中的内容
- 用Debug的E命令改写内存中的内容
- 用Debug的U命令将内存中的机器指令翻译成汇编指令
- 用Debug的T指令执行一条机器指令
- 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令