8086汇编-寄存器-CPU互作原理(2)
CPU概述
1.一个典型的CPU由运算器,控制器,寄存器等器件组成,这些器件靠内部的总线相连
2.区别:
1 | 内部总线:是CPU内部的【用于运算器,控制器,寄存器】 |
3.内部总线实现CPU内部各个器件之间的联系
4.外部总监实现CPU和主板上其他器件的联系
寄存器概述
1.8086CPU有14个寄存器
1 | AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW |
2.1通用寄存器
1.8086CPU所有的寄存器都是16位的,可以存放2个字节,也就是一个字
2.AX BX CX DX 通常用来存放一般性数据被称为通用寄存器
3.AX
一个16位寄存器可以存储一个16位的数据
比如:数据18 –> 二进制表示是10010
一个16位寄存器所能存储的数据的最大值是多少呢?
1 | 2^16 - 1 --> 二进制就是1111,1111,1111,1111 |
4.为了保持和上一代CPU中的寄存器【都是8位】的兼容性,这4个寄存器可以分为2个独立的8位寄存器
1 | AX-->AH AL [high low] |
2.2字在寄存器中的储存
1.一个字可以存放一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位和低8位寄存器中
1 | 字 --> word |
关于数制的讨论
1.由于1个内存单元可以放8位数据,CPU中的寄存器又可放N个8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。【进制转换的课程,有时间一定要去看啊】
2.用十六进制来表示数据可以直观的看出这个数据是由那些8位数据构成【每两位对应一个八进制】【4位对应一个16进制】
3.十六进制后面+H ; 二进制后面+B ;
2.3几条汇编指令
1.汇编的指令是不分大小写的
汇编指令 控制CPU完成的操作 高级语言的写法
1 | move ax,18 将18送入AX AX=18 |
**这里的丢失,指的是进制不能再8位寄存器中保存,但是CPU不是真正的抛弃这个进制位
2.4物理地址
1.CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成了存储空间是一个一维的线性空间
2.我们将这个唯一的地址称为物理地址
2.6 16位结构的CPU
1.概括的讲,16位结构描述了一个CPU具有一下几个方面的特征
1 | 1.运算器一次最多可以处理16位的数据 |
2.8086CPU给出物理地址的方法
1 | 1.8086有20位地址总线,可传送20位地址,寻址能力是1M |
3.问题:那么,8086CPU如何用内部16位的数据转化成20位的地址呢?
1 | 8086CPU采用一种再内部用俩个16位地址合成的方法形成一个20位的物理地址 |
2.7地址加法器的互作原理
问题:地址加法器的互作原理
1 | 地址加法器合成物理地址的方法: |
5.由段地址* 16引发的血案….
1 | 段地址*16 ==> 有一个更常用的说法,就是数据左移4位(二进制位) |
通过观察我们发现
1 | 1.一个数据的二进制[16进制]形式左移1位,相当于该数*2[*16] |
段地址*16+偏移地址=物理地址的本质含义
1 | 1.基础地址+偏移地址=物理地址 |
2.8段的概念
1.错误的认识
1 | 内存被划分成了一个一个的段,没一个段有一个段地址 |
2.其实
1 | 内存并没有分段,段的划分来自于CPU,由于8086CPU“用(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存 |
3.以后在编程的时候,将若干个连续的内存单元看作一个段,用段地址*16 定位段的起始地址(基础地址)用偏移地址定位段中的内存单元
1 | 1.段地址*16必然十16的倍数,所以一个段的起始地址也一定是16的倍数 |
内存单元地址小结
1.CPU访问内存单元的时候,必须向内存提供内存单元的物理地址
2.8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
3.一个物理地址,可以由很多种段地址和偏移地址形成。
1 |
4.给定一个段地址,仅通过变化偏移地址来寻,最多可以定位64KB个内存单元
没有小结的小结
1.段地址和偏移地址
2.数据在21F60H内存单元中。对于8086PC机中有俩种描述
1 | 1.数组存在内存2000:1F60单元种 |
3.可以根据需要,将地址连续,起始地址为16的位数的一组内存单元定义为一个段
2.9段寄存器
1.段寄存器就是提供段地址的。
1 | 8086CPU有4个段寄存器 |
2.当8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址
2.10CS和IP
1.CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
1 | CS为代码段寄存器 |
2.8086PC互作过程的简要描述
1 | 1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区; |
3.在任何时候,CPU和CS,IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行
4.如果说,内存中的一段信息被CPU执行过的话,那么,它所在的内存单元必然是被CS:IP指向过
2.11修改CS,IP的指令
1.在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制
2.CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令
3.同时修改CS.IP的内容
1 | jmp 段地址:偏移地址 |
4.只修改IP
1 | jim 某一个合法寄存器完成: |
2.12代码段
1.对于8086PC机,在编程的时候,可以根据需要,将一组内存单元定义为一个段
2.可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段
3.如何使得代码段中的指令被执行呢?
1 | 用CS:IP指过去 |
4.将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当作指令来执行
1 | CPU只认被CS:IP指向的内存单元中的内容为指令 |
5.所以要将CS:IP指向对应的地址
2.9~2.12节的小结
1.段地址在8086CPU的寄存器中存放。当8086CPU要访问内存的时候,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址
2.CS存放指令的段地址,IP存放指令的偏移地址。
3.8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
4.8086CPU的互作过程:
1 | 1.从CS:IP指向内存单元读取指令,读取的指令进入缓冲区 |
5.8086CPU提供转移指令修改CS,IP的内容
1 | jmp |
实验【完成就结束第二章】
1.查看CPU和内存,用机器指令和汇编指令编程
1 | 用到DEBUG |
什么是debug?
1 | Debug是DOS,Windows都提供的实模式(8086方式)程序的调试工具,使用它可以查看CPU各种寄存器中的内容,内存的情况和在机器码级跟踪程序的运行 |
1 | 指令: |
这里还是去看视频吧P12