第二章总结
1、8086CPU概述
8086是Intel系列中16位微处理器,地址总线20位。
8086有14个16位寄存器:AX, BX, CX, DX(通用寄存器)SI, DI, BP, SP(基址和变址寄存器)CS, SS, DS, ES(段寄存器)IP,PSW(指令指针和标志寄存器)
( 汇编语言中不区分大小写)
2、通用寄存器(用于存放一般性数据,每个寄存器均为16位)
通用寄存器AX,BX,CX,DX均可拆成两个8位寄存器(以AX为例,低8位寄存器为AL,高8位为AH)单独使用。
3、字在寄存器中的存放
字节:内存划分的基本单位(Byte),一个字节由8个bit位组成。
字:两个字节组成,分别为字的高位字节和低位字节
任何数据到了计算机里都是由二进制数存放的。以AX为例可以存16位二进制数,每四位二进制数对应一个十六位进制数
十进制数据: 20000 → AX
对应的二进制: 100 1110 0010 0000 B
对应的十六进制: 4E20 H(其中AL=4EH,AL=20H)
4、汇编指令
Mov指令中有两个操作数,作用是将后面的操作数赋给前面的操作数。
Add指令中有两个操作数,作用是将前后的操作数相加,赋给前面的操作数。
**注:(1)在mov和add指令中,两个操作对象的位数应一致。
(若是位数不一致会怎样呢?)
(2)运算时超出寄存器表示的位数时,超出的进位值丢失,但这里的丢失并不是真正的丢失,而是记录在一个特殊的寄存器的某一位上。8086CPU就用flag的CF位来记录这个进位值。
(3)AL和AH各自作为独立的寄存器使用
5、内存单元的物理地址(段地址*16+偏移地址=物理地址)
CPU访问内存单元时要给出内存单元的地址。
所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
8086内部的寄存器都是16位的,而外部地址总线宽度为20位。故无法直接用寄存器表示20位的物理地址。
其中,段地址*16可以理解为一个段的起始物理地址。
「段」是8086为解决用16位寄存器表示20位的物理地址而引入的一个逻辑上的概念。
可以根据需要,将地址连续、起始物理地址为16倍数的一组内存单元(不超过64KB)当作一个「段」使用。(不超过64KB是因为寄存器都是16位的,偏移地址只能表示四位十六进制数)
**说明:
(1)8086中,通过段地址: 偏移地址来间接描述内存单元的物理地址。CPU根据如下公式计算得到物理地址:段地址*16+偏移地址=物理地址
(2)「段地址: 偏移地址」 也称「逻辑地址」
(3)「段地址 × 16 」 构成段的起始物理地址,故根据需要划分段使用时,段的起始物理地址必须是16的倍数。
(4)在写法上,地址通常用十六进制表示。表示十六进制的H在「段地址: 偏移地址」中可省略不写。
6、CS和IP
CS: 代码段段寄存器,用于存放代码段的「段地址」
IP: 指令指针寄存器,用于存放CPU将要读取的指令在代码段中的偏移地址。
**计算机工作过程
第1步: CPU基于CS:IP,计算出物理地址,然后到相应的内存单元读取指令,送到指令缓冲区。
第2步: CPU自动修改IP的值,IP = IP + 所读取指令的长度,从而为下一条指令读取做准备;(IP中存的是下一条指令的偏移地址)
第3步: 执行指令。 转第1步,重复此过程。
**注:
CPU从何处执行指令是由CS和IP中的内容决定的。
程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
IP和CS值的修改不能通过mov指令实现,需借助转移指令 (如jmp, call等)。
同时修改CS、IP的内容:
jmp 2AE3:3 ; CS ← 2AE3H
IP ← 3H
只修改IP的内容:
jmp AX ; IP ← AX
7、数据段和代码段
代码段指的是长度为小于64kb的、地址连续、起始地址为16(十进制)的倍数的内存单元当作专门存放代码的,数据段指的是长度小于64kb的、地址连续、起始地址为16(十进制)的倍数的内存单元当作专门存储数据的内存空间。
**为什么代码和数据要分开存放成代码段和数据段?
(因为当cs:ip可以触及到存放数据的内存单元时,CPU会将数据当作代码执行)
来源:https://www.cnblogs.com/xyl744188/p/9821649.html