汇编语言(二)--80X86CPU基础
本文最后更新于:2019年6月5日 晚上
概览:80X86CPU寄存器,内存地址与存储器分段的概念。
微处理器
个人计算机也叫做微型计算机。其核心是中央处理器(CPU)**,也称为微处理器**。
微处理器是微型计算机的核心,由运算器和控制器两部分组成。
底下是Intel 8086/8088的微处器结构。
微处理器结构上进行划分的话分为执行部件(EU)**和总线接口部件(BIU)**。
8086寄存器组
字长
微型计算机的字长与微处理器寄存器位数有关。
Intel 80X86系列微处理器中,8086/8088、80286这些微机的字长是16位的,所以其寄存器都是16位的。
现如今(2019.06.04)我们使用的电脑基本都是64位的了。
整个博客围绕的都是8086CPU来学习的,8086寄存器都是16位的寄存器。
对于8086CPU来说,一个字节(Byte)为8位,即8位二进制数。一个字(Word)为16位,即两个字节。
数据寄存器
包括AX、BX、CX、DX四个通用寄存器,都是16位。主要用于存放计算过程中的信息和数据。
这四个的首要功能是存放数据,其次才是如下的具体功能。
AX(Accumulator)作为累加器用,算术运算的主要寄存器
BX (Base)基址寄存器
CX (Count )计数器
DX (Data )双精度运算时与AX一起存放双操作数(32位)。这时DX放高的16位,AX放低的16位。
此外每一个数据寄存器又可分为两个8位寄存器,AH、AL、BH、BL……
H(High)表示高8位(8-15),L(Low)表示低8位(0-7)。
例:AX寄存器存放一个字1234H。符号表示为 (AX)=1234H.高字节放在AH,低字节放在AL。
例:使用DX、AX保存双精度数(32位) 23456789H。表示形式: (DX)=2345H,(AX)=6789H.
地址寄存器
包括SI、DI、SP、BP四个16为寄存器。主要用于存放存储器操作数的偏移地址。
SI (Source Index) 源变址寄存器,可用于存放源缓冲区的偏移地址。
DI (Destination Index) 目的变址寄存器,可用于存放目的缓冲区的偏移地址。
SP (Stack Pointer) 堆栈指针寄存器,用于指出堆栈区的栈顶的偏移地址。
**BP **(Base Pointer) 基址指针寄存器,用于指出堆栈区的某个单元的偏移地址。
段寄存器
包括CS、DS、ES、SS四个16位段寄存器。指明数据的类型,位于哪个段就是什么类型的数据。
- CS (Code Segment) 代码段寄存器,用于指出存放程序的代码段的段地址。
- DS (Data Segment) 数据段寄存器,用于指出存放数据的数据段的段地址。
- ES (Extra Segment) 附加段寄存器,用于指出存放附加数据的附加段的段地址。
- SS (Stack Segment) 堆栈段寄存器,用于指出堆栈区的堆栈段的段地址。
控制寄存器
包括IP和FLAGS两个16位寄存器,用于控制程序的执行。
- IP 指令指针寄存器:用来存放代码段(CS)中的偏移地址,指出当前正在执行指令的下一条指令所在单元的偏移地址。
- FLAGS标志寄存器:其中的某位代表CPU的一个标志。8086CPU的标志寄存器共有9个标志,分别为6条件码标志和3控制标志。
比较重要的几个:
CF 进位标志,当指令执行结果的最高位向前有进位时,CF=1,否则CF=0。
ZF 零标志,执行结果为零时,ZF=1,否则ZF=0。
SF 符号标志,当指令的结果为负时,SF=1,否则SF=0。
OF 溢出标志,结果溢出时OF=1,否则OF=0。
IF (Interrupt Flag)中断标志,IF=1,为CPU允许响应可屏蔽中断。
在debug状态下可以查看到除了陷阱标志TF之外的其他标志,他们会用字母缩写的形式表示自己的状态。
debug状态下,使用R指令查看。
例:10011010B+01001011B = 11100101B
根据计算结果,CPU会把标致位设置为:CF = 0,SF = 1,ZF = 0,OF = 0。即无进位,结果为负,结果不为零,无溢出。
内存地址与存储单元
内存储器即内存,也称为主存。在汇编语言中,用于存储计算机当前正在运行的程序,正在处理的原始数据、中间数据以及最终结果,故我们与内存的交互是非常频繁的。
内存是使用字节为单位编址的,即80X86实际的存储单元为8位二进制数的大小。
CPU如何对内存进行读写?
通过系统总线来进行读写。系统总线包括地址总线、数据总线、控制总线三大类。
CPU要想进行数据读或者写的操作,需要知道三大类信息:
- 地址信息:存储单元的地址
- 控制信息:器件的选择以及读或者写的命令
- 数据信息:要读或者写的数据
地址总线
8086CPU的地址总线为20位。
CPU对内存的访问是通过地址总线进行的,地址总线的二进制组态对应着一个内存单元,而这个二进制组态就可以作为该内存单元的地址。
比如有两根总线 A0、A1,二进制组态就有00、01、10、11四种,表示地址为0 - 3的存储单元。
也就是说地址总线能传达多少个不同的信息(即二进制组态有多少种),CPU就可以对多少个存储单元进行寻址。
地址总线位数为n位,即地址总线的宽度为n,CPU就可以寻找2的N次方个内存单元。
8086CPU有20跟地址总线,故存储空间就是2的20次方 = 1MB。
控制总线
CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。
有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。
数据总线
CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。
数据总线的宽度决定了CPU和外界的数据传送速度。
8086CPU的数据总线为16位,即一次性可以传送16位数据。
地址
在内存之中,每一个存储单元都有一个编号用来标识这个存储单元,这就是地址。地址是从0开始编号的。(看地址总线那一部分)
地址有两种表示方式,物理地址和逻辑地址。
物理地址
物理地址是内存单元的真实地址,且每一个存储单元的物理地址都是唯一的。CPU访问内存必须使用物理地址。
8086CPU有20跟地址总线,故存储空间就是2的20次方 = 1MB。物理地址的范围是 00000H - FFFFFH。
逻辑地址
逻辑地址是方便用户编程而使用的地址。它由段地址和偏移地址两部分构成。
形式: 逻辑地址 = 段地址 : 偏移地址
因为我们将内存地址划分为多个逻辑段每段都由一部分存储单元构成。
段地址指出是哪一段,偏移地址标明是哪段中的哪个单元。且段地址和偏移地址都是16位的二进制数。
逻辑地址转换物理地址
因为逻辑地址是编程人员使用的,而物理地址是CPU访问内存必须使用的。程序猿写的程序采用的逻辑地址在CPU执行时要转换成为物理地址。这个操作由CPU中的地址加法器来实现。
实现:段地址左移四位(相当于乘以10H),加上偏移地址。
*物理地址 = 段地址 * 10H + 偏移地址*
例:逻辑地址为: 3020:055AH。则其物理地址 = 3020H * 10H + 055AH = 3075AH。
存储单元
存储器分段
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!