混子汇编语言学习之02笔记
第2章 寄存器
开章:
前面有博世面试的时候,就问过一个问题,为什么要有寄存器?当时自己也没有说清楚,看完这一章相关的内容,明白了寄存器是什么,干什么的,终于清晰了!
1、寄存器
CPU由运算器、控制器、寄存器等器件构成,这些器件靠片内总线相连。
- 运算器进行信息处理;
- 控制器控制各种器件进行工作;
- 寄存器进行信息存储;
8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW都是16位。寄存器是什么:寄存器是暂存指令、数据和地址的一种部件,是程序员可以改变其中内容来控制CPU的部件。
通俗易懂理解:
寄存器就是你的口袋。身上只有那么几个,只装最常用或者马上要用的东西。
内存就是你的背包。有时候拿点什么放到口袋里,有时候从口袋里拿出点东西放在背包里。
2、通用寄存器
通用寄存器:通常用来存放一般性的数据,有AX、BX、CX、DX,它们可分为两个可独立使用的8位寄存器。
由于8086CPU上一代的寄存器是8位的,为了保持向下兼容,这里16位的寄存器可以拆开成两个8位寄存器使用,如下图所示。
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
就是如下所示:
3、简单的几条汇编指令
- mov 指令就是类似于C语言中的赋值的概念
- add指令就是加法运算
- 运算都是从右往左运算的
- 汇编指令助记符是不区分大小写的
- 在运算中要注意储存的范围大小,计算的结果如果超出了,保留的是没有超出的部分。
4、物理地址
概念:所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。就是类似门牌号,编号。
8086CPU给出物理地址的方法
背景:8086CPU有20位地址总线,可以传送20位地址,达到 1MB寻址能力。但是8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位,内部是不能直接传输20位的地址信息的。
故8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
内部逻辑如下图:
如图2.6所示,当8086CPU要读写内存时:
(1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址:(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合成为一个20位的物理地址;
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;
(6)20位物理地址被地址总线传送到存储器。
记住公式:物理地址=段地址x16+偏移地址
提供地址方法的本质
“段地址x16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址x16可看作是基础地址。
最终也就是:物理地址 = 基础地址 + 偏移地址
5、段寄存器
我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存。段寄存器是用来提供内存单元的端地址的。
内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
- 用一个段存放数据,将它定义为“数据段”;
- 用一个段存放代码,将它定义为“代码段”;
- 用一个段当作栈,将它定义为“栈段”。
注意:
一个段的起始地址一定是16的倍数;
偏移地址为16位,变化范围为0-FFFFH,所以一个段的长度最大为64KB。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址。
CS和IP
CS为代码段寄存器,IP为指令指针寄存器,
CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,
CPU将CS:IP指向的内容当作指令执行。(即PC)
看明白下面例子即可理解:
工作原理简述:
(1) 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP-IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到步骤(1),重复这个过程。
在8086CPU .加电启动或复位后(即CPU 刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU 从内存FFFFOH单元中读取指令执行,FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。
8086CPU提供转移指令修改CS、IP的内容。(记住例子即可)
同时修改CS:IP
jmp 段地址:偏移地址:用指令中给出的段地址修改CS,偏移地址修改IP。
只修改其中的IP
jmp 某一合法寄存器:仅修改IP的内容。
- 不支持单独修改CS
8086CPU不支持将数据直接送入段寄存器的操作,这属于8086CPU硬件设计。
参考资料 王爽《汇编语言第三版》,小甲鱼视频,博客分享
欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!