微机原理×86学习
基础知识点整理
为什么要学习8086汇编语言
- 对硬件控制最彻底、占内存少、运行速度快
- 了解计算机组成结构和工作过程的工具
- 8086指令系统是整个x86系列CPU指令的基本集合,向后兼容
- 应用广泛,资料易于寻找
计算机的组成
- 运算器,控制器(CPU)、存储器、输入输出设备(IO设备)
总线
- 数据和控制总线是双向的,地址总线是单向的!
协处理器
- 协处理器,这是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器。需要说明的是,由于现在的计算机中,整数运算器与浮点运算器已经集成在一起,因此浮点处理器已经不算是辅助处理器。而内建于CPU中的协处理器,同样不算是辅助处理器,除非它是独立存在。
- 专门处理浮点数的处理器叫做浮点数处理器或者协处理器
流水线技术
- 流水线技术指的是并行操作
指令队列
- 指令队列在x86下只有6个字节
内部结构
- 总线接口单元
- 指令预取单元
- 指令译码单元
- 指令执行单元
- 段管理单元
- 页管理单元
- 高速缓存单元
- 浮点运算单元
寄存器必备知识
- 基本寄存器:通用寄存器,指令指针寄存器,标志寄存器,段寄存器。
- 系统级寄存器:控制寄存器,系统地址寄存器
- 调试和测试寄存器
- 调试寄存器
×86系列处理器的位数
-
8086
是8
位的处理器 -
8088
是16
位处理器 -
386
处理器是一个分水岭表示正式进入了32
位处理器的时代
存储相关
- 由于
8086/8088
寄存器是16
位的,能存储的最大值是2的16次方
即是2^16=65536=64K
- 8086/8088存储器1MB地址空间最多可以分为64K个段,每个段均为16个字节;最少可分为16个段,每个段均为64KB。
段相关
-
8086
分为四个段(CS/DS/SS/ES)
,每个段的容量最大64KB
。 - 每个段都是独立寻址的逻辑单元,用于存放程序和数据
- 各逻辑段在存储器中采用浮动方式,既可以邻接、间隔、完全重叠、部分重叠;
- 一个存储单元的物理地址可以属于一个逻辑段,也可以同属于几个逻辑段
- 8086/8088一个程序最多只能访问到四个段
CS SS DS ES
- 段寄存器是
16位的,64K的代码
- 16位段基址移4位加偏移地址是20位的物理地址!
- 每个存储单元只有一个物理地址,但它可由不同段基址和偏移地址组成
处理器三种工作模式
- 实地址模式(
16位1M(2的20次方)
地址) - 保护模式(物理内存
2的32次方64G
,虚拟内存2的46次方
) - 虚拟8086模式
x86实模式下1MB存储器
的存储单元进行分段管理
×86的数据存储方式
- 在×86系统下地址高的是高位数据,地址低的是低位数据(小端模式)
几个常见数据长度记忆
- 2的十次方是1K
- 2的16次方是64K
- 2的20次方是1M
- 2的30次方是1G
- 2的32次方是4G
堆栈相关
- 堆栈就是我们临时存放数据的地方
- 堆栈的操作两个,进栈和出栈!
- **进栈地址是减的,出栈地址是加的!
-
堆栈是以字(2个字节)为单位进行操作**。
同时注意区分:ARM的字是32位!
486的七种
数据类型
- 无符号二进制数
- 有符号二进制数
- 浮点数
- BCD码
- 字符串
- ASCII
- 指针数据
寻址方式
- 立即数寻址
- 立即数只能作源操作数,不能作目的操作数;
- 以A~F打头的数字出现在指令中时,前面必须加数字0。以免与其它符号相混淆(如:0AF22H)
- 寄存器寻址
- 源操作数与目的操作数字长要相同
- 寄存器寻址与段地址无关(
MOV CX, ES: AX
)这样写就是错误的!
- 存储器寻址
- 直接寻址
- 中括号表示的就是偏移地址,BX不加特殊说明是DS段(段基址)通常是隐含
- BP不加特殊说明是SS段
- 寄存器间接寻址
- 操作数的有效地址(偏移地址)放在寄存器中,寄存器名称必须加方括号!
- 使用寄存器:基址寄存器
BX
、基址指针寄存器BP
,变址寄存器SI、DI
- 操作数的物理地址=
10H×DS+BX/SI/DI或= 10H×SS+BP
- eg:
MOV AX,[SI]
- 关于默认段:
BP
是在SS里面,其余三个BX/SI/DI
均是在DS中
- 相对寄存器间接寻址
- 寄存器
SI和DI
、BP和BX
不能同时出现在[ ]
中
- 寄存器
- 基址和变址寻址
- 相对基址加变址寻址
- 直接寻址
立即寻址:我们要找的数在指令里面
直接寻址:我们要找数的地址在指令里面
寄存器寻址:我要找的数就在寄存器里面,
寄存器间接寻址:我要找的数的地址在寄存器里面
寻址方式判断:有寄存器就是寄存器寻址,有括号就是间接,前面再来一个数就是相对
操作数
- 操作数主要有三种:立即数操作数、寄存器操作数和存储器操作数。
- 立即数操作数就是我们常用的常数的形式,另外特别注意立即数只能是用于源操作数。另外注意取值范围:8位的无符号
00H ~ FFH
,有符号80H~7FH
。16位的无符号0000H~FFFFH
,有符号8000H~7FFFH
寄存器操作数,16位操作数:
AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, ES, SS
8位操作数:AH, AL, BH, BL, CH, CL, DH, DL
存储器操作数:字节、字、双字
其他零散知识点
- 所有的地址都是指存储器的地址
- 指令周期就是执行一条指令的时间
- 基址寄存器有BX,BP,变址寄存器有DS SI
-
EA
表示相加后的最终的地址值,表示有效地址的意思 - 有效地址指的是偏移地址
- 立即数是不能直接送段寄存器的,立即数必须先送达一个普通的寄存器,然后再送到段寄存器。
- 地址在×86里面,它的地址空间有两个。一个是放
数据
和指令
的存储器地址,另外一个是作为输入输出的IO地址。IO的地址有16位,即64K个地址。 64K个地址中如果是小于255也就是8位地址可以直接送,但是如果大于8位需要用一个DX来传送! - 标志寄存器是不能直接MOV的
-
XLAT
查表指令得到的结果放入寄存器AL
-
IPV4
是32位地址,IPV6
是128位
地址