第一章 微处理器
1.1 微处理器的基本功能和基本组成
1.1.1 微处理器的基本功能
微处理器是微机运算和控制处理部件,也是指挥微机各部件协调工作的控制中心。主要
的基本功能包括:
-
指令控制功能,即控制程序 顺序执行 的功能
-
操作控制功能,程序是由有序指令的集合而成,CPU执行程序就是要逐条执行程序中
的指令,一条指令的执行往往由若干操作信号的组成来实现,CPU根据指令操作码和
时序信号,产生各种操作控制信号,以便正确的选择数据通路,从而完成取指令和执行
指令的控制。
操作控制器的组成类型分为两类:
- 硬布线控制器,它是采用时序逻辑技术来实现的。
- 微程序控制器,它是采用存储逻辑来实现的。
1.1.2 微处理器的基本组成
从早期的微处理器看,它主要包括运算器和控制器两大部分。随着大规模集成电路技术的快速发展,
目前CPU内部最基本的组成部分为三大部分,即运算器、控制器和高速缓冲存储器。
1. 运算器:
AX,BX,CX,DX CPU中的寄存器
ALU:算数逻辑部件
C1,C2 :操作信号,相当于开关
标志寄存器:算完以后的状态,大于0,小于0?越界问题
!!! 数据不能两个都来自内存中。
2. 高速缓冲存储器
由于CPU的速度远大于内存的速度,所以使用cache,将CPU所需要的数据提前从内存读入cache中,
使得CPU在近期一段时间片段不需要访问内存,而是只需访问CPU内部的高速缓冲存储器,称其为
访问CPU内部cache的 命中率 很高
3. 控制器
控制器最基本的部件由指令指针,指令寄存器,指令译码器及操作控制器组成。
为什么会CPU会顺序执行:
指令指针中存放存储器地址,为了保证程序顺序执行,CPU必须自动记忆下一条指令存放在内存中
的地址,所以指令指针又称为指令计数器,他有 自动加一 功能
选择,循环结构时,操作系统会给指令指针赋值 (我们写代码过程中不能操作指令指针)
1.1.3 冯·诺依曼思想
- 五大模块:运算器,控制器,存储器,输入 /出设备
- 计算机采用二进制
- 在程序运行过程中,代码和数据存放在 内存 中
存储器包括内存跟硬盘,一般说存储器单指内存
为什么:cpu不能直接访问硬盘
1.2 微处理器内部的寄存器
1.2.1 8086 CPU 内部的寄存器组
8086CPU包含
数据线:16
地址线:20
最大存储空间:64KB
2^16 byte =2^6KB 1个二进制位表示1位,即 1bit,8bit=1byte(字节)
最多可接内存:1M
2^20byte
4个16位 段寄存器
CS,代码段寄存器
DS,数据段寄存器 冯诺依曼思想第三句,主要是操作数据 important
SS,堆栈段寄存器
ES,附加段寄存器
代码在3楼:CS
数据在6楼:DS
数据寄存器
- AX:累加器,用于算数运算、逻辑运算以及在输入/输出指令中做数据寄存器使用等。
- BX:基址寄存器,在间接寻址中做基址寄存器,常用作偏移地址访问数据段。
- CX:计数寄存器,作为循环和串行操作等指令中的隐含计数器。
- DX:数据寄存器,常用来存放双字节长数据的高16位或存放 外设端口 的地址。
4个16位寄存器,分别可拆分为8个8位寄存器
AH,AL
BH,BL
CH,CL
DH,DL
在写代码过程中,要灵活运用这些寄存器
0~255 用8位
通用寄存器
SP,堆栈指针,SP用于指示栈底或栈顶的偏移地址
BP,基址指针,常用作偏移地址访问堆栈段 访问堆栈段-----SS
SI,源变址寄存器
DI,目的变址寄存器
SI和DI通常与 DS数据段寄存器一起使用,用来确定数据段中某一存储单元的地址。在进行
字符串操作时,SI用来存放源操作数的偏移地址,DI用来存放目的操作数的偏移地址,SI与
DI联用,DI与ES连用,分别寻址数据段和附加数据段。
标志寄存器
ZF:零标志,当前运算后,运算结果为0时,ZF=1,表示0成立,否则ZF=0.
DF:方向标志,该标志用于控制串操作指令中地址指针的变化方向
DF=0:每执行一次串操作,存储器地址自动增加
DF=1:没执行一次串操作,存储器地址自动减少
IF:中断允许标志,该标志用于控制8086CPU是否响应外部可屏蔽中断请求
TF:陷阱标志,常称为单步标志。
汇编语言采用减法计数
INC AL INC:increase
DEC BH DEC:decrease
1.3 用汇编语言实现 3 + 4
打开桌面快捷方式 输入命令
DEBUG ;(输完回车)
R ;(输完回车)
a ;(输完回车)
MOV AX,3 ;(输完回车)
MOV BX,4 ;(输完回车)
ADD AX,BX ;(输完回车)
最后直接回车
三次连续输入T 回车 单步执行
测试完成
1.3 微处理器对存储器的管理
1.3.1 实模式存储器地址空间的划分
从00000H~003FFH是中断向量表去,共计有1024字节,1024/4=256 ,用于存放
256个中断向量(中断服务程序的入口地址)----->CS:IP,即每个中断向量包含4字节:
2字节的代码段值,2字节的偏移地址
1.3.2 实模式物理地址的产生
数据线小于地址线,所以CPU内部的地址加法器,能将16位的逻辑地址装换成
20位的物理地址
段基地址:偏移地址
物理地址的计算公式:
物理地址=段基地址x16+偏移地址
1.3.2 段寄存器与偏移地址寄存器的固定搭配
总结:除了SP,BP,CS 其余的都跟数据段搭配
1.4 8086系统中的存储器组织
在8086系统中,把1MB的存储器分为两个存储体,偶地址存储体和奇地址存储体,其存储容量
各位512KB,在每个存储体内的字节地址是不连续的,而在两个存储体之间的字节地址是连续
的,构成了两个存储体之间的地址交叉,如图:
BHE 和A0的组合操作
BHE A0 | 操 作 | 指 令 列 |
---|---|---|
0 0 | 从偶地址读/写一个字 | MOV BX,[9900H] |
0 1 | 从奇地址读/写一个字节 | MOV AL,[8801H] |
1 0 | 从偶地址读/写一个字节 | MOV CH,[7700H] |
1 1 | 无存储器操作 | 无 |
第二章 指令系统与汇编语言程序设计
1.1 8086CPU的寻址方式
2.1.1 指令一般格式
1. 8086CPU指令的格式
操作码 操作数
例如:指令 MOV AL,29H
8086CPU指令的格式可以细分为以下几种:
-
零地址指令
格式:操作码
零地址指令中不提供操作数,也不提供操作数的地址,只有操作码,例如 空操作指令
NOP
-
单地址指令
格式:操作码 操作数
单地址指令也成为一般地址指令,指令中之提供一个操作数(或一个操作数的地址),例如:
INC AH
INC BYTE PTR[1100H]
-
两地址指令
格式:操作码 目的操作数,源操作数
指令中包含两个操作数,由操作码确定这两个操作数所进行的操作后,结果存入目的操作数中。例如:
MOV AH,BL ;AH<------(BL)
MOV BH,[1100H] ;BH<------(1100H)
说明:
-
目的操作数和源操作数应具有相同的数据类型,即必须同时是8位或者16位。
-
目的操作数不能是立即数。
-
操作结束后,其操作结果送入目的操作数中,而源操作数并不会改变。
-
源操作数和目的操作数不能同时为存储器操作数,例如:
ADD [BX],[2000H]
-
立即数不能作为目的操作数。
-
2. 操作数的类型
-
数据操作数
-
立即操作数
imm,代表8 、16位立即数immn:n(n为8或16)位立即操作数
-
寄存器操作数
reg:寄存器,代表8和16位
regn:n(n为8或16)位寄存器
-
存储器操作数
mem:存储器操作数,
memn:n(n为8或16)位存储器操作数
-
输入/输出操作数
-
-
转移地址操作数
转移地址操作数来自具体的指令,且指令中转移地址只有一个,他就是指令的目的操作数
2.2.2 8086 CPU寻址方式
1.立即寻址
操作数位置:内存代码段
立即寻址所提供的操作数直接放在指令中,它是紧跟在指令操作码后面的一个可用的8位或16位 补码 表示的由有符号数,也就是说,操作数的存放地址就是指令操作码的下一单元地址。
例: 立即数传送到寄存器中
MOV BH,10H ;将立即数10H传送到BH中
MOV BX,2345H ;将立即数2345H传送给BX
说明:立即数在所有指令中都不可能用作目的操作数。
2. 寄存器寻址
操作数位置:在CPU的某个寄存器中。
寄存器中寄存的内容就是要寻找的操作数。
例:增1指令
INC CX ;CX<------(CX)+1
例:寄存器之间的传送指令
MOV CX,AX ;CX<--------AX
3. 存储器寻址
在8086、80286微处理器中,默认的段寄存器与16位寄存器的固定搭配如表4-2所示
-
直接寻址
MOV BL,[3330H]
PA=DS x 16 + 3330H
-
基址寻址
MOV AL,[BX]
PA=DS x 16 + BX
-
相对基址寻址
MOV AL,[BX+30H]
PA=DS x 16 + BX + 30H
-
变址寻址
MOV BL,[SI]
PA=DS x 16 + SI
-
相对变址寻址
MOV AL,[SI-56H]
PA=DS x 16 + SI - 56H
-
基址加变址寻址
MOV AL,[BX+SI]
PA=DS x 16 + BX + SI
-
相对基址加变址寻址
MOV AL,[BX+DI+90H]
PA=DS x 16 + BX + DI + 90H
1.2 16位微处理器指令系统
为了方便介绍,对几个符号的规定如下:
OPS:源操作数,代表8位和16位二进制数据
OPSn:n(n为8或16)位源操作数
OPD:目的操作数,代表8和16位二进制数据
OPDn:n(n为8或16)位目的操作数
seg:段寄存器 (segment)
(reg):表示寄存器中寄存的数值
1.2.1 数据传送指令
1.一般数据传送指令
数据传送指令是将数据、地址或立即数传送到寄存器或存储器中,可以分为一般数据传送指令、堆栈操作指令、地址传送指令和输入 /输出指令
-
传送指令
指令格式: MOV OPD,OPS
MOV有如下五中具体形式:
-
MOV reg,reg ; 两个寄存器之间的数据传送,如 MOV AL,BH
-
MOV reg,mem ; 内存单元数据传送给寄存器,读内存,如 MOV BX,[SI]
-
MOV mem,reg ; 寄存器的数据传送给内存单元,写内存,如 MOV [DI],BX
-
MOV reg,imm ; 立即数传送给寄存器,如 MOV AX,3
-
MOV mem,imm ; 立即数传送给内存单元,如 MOV WORD PTR[SI],1122H
特别说明:WORD是指明两个字节,BYTE 指明一个字节
用于段寄存器的传送指令有三种形式:
- MOV seg,reg ; 寄存器数据传送给数据段寄存器,如 MOV DS,AX
- MOV reg,seg ; 段寄存器数据传送给寄存器,如 MOV AX,DS
- MOV mem,seg ; 段寄存器数据传送给内存单元,如 MOV [DI],DS
说明:当段寄存器作为目的操作数时,不允许是CS和SS段寄存器,但所有段寄存器都可以作为源操作数
-
-
数据交换指令
指令格式:XCHG OPD,OPS
XCHG一般有如下三种格式:
XCHG reg,reg XCHG AL,AH
XCHG reg,mem XCHG AL,[BX]
XCHG mem,reg XCHG [1000H],BX
2.堆栈操作指令
堆栈是在内存RAM这种开辟的一段特殊的存储空间。它的主要功能包括:
- 用来暂时存放程序的(断电)地址(CS和IP的值)。
- 用以临时存放CPU寄存器和存储器中暂时不用的数据 (寄存器不够用)
堆栈操作指令:
-
数据入栈指令
指令格式:PUSH OPS16
将OPS中的16位数据压入堆栈中,且堆栈指针SP中的值减2,PUSH一般有两种形式:
- PUSH reg16
- PUSH mem16
-
数据出栈指令
指令格式: POP OPD16
将SS:IP所指定的一个字弹出给某一16位通用寄存器、数据段寄存器或某一字存储单元中。OPS一定是16位,弹出栈的数据也是16位,POP OPD16指令执行后,SP加2。
POP一般有三种形式:
- POP reg16
- POP seg
- POP mem16
注:高字节存放高地址、低字节存放低地址
-
地址传送指令
-
传送偏移地址
指令格式: LEA reg16,OPS
说明:(1)目的操作数一定是一个16通用寄存器。
(2)OPS 所提供的一定要是内存的一个偏移地址,可以是存储器的各种寻址方式。例如:
LEA BX,[SI+2]
(3)OPS通常是变量名,取其偏移地址到reg16中。例如:
LEA SI,VAR
-
-
输入/输出指令
输入 /输出设备接口电路中有三种类型的寄存器 此处寄存器跟前面所指寄存器并不同 每一个设备寄存器都在I/O空间中被指定一个固定地址
-
基本输入指令
IN AL,DX
通常用作查询状态,数据采集
-
基本输出指令
OUT DX,AL
给300H发数据80H
MOV AL,80H
MOV DX,300H
OUT DX,AL
-
1.2.2 算数运算指令
1.加法指令
-
不带进位的加法指令
指令格式: ADD OPD,OPS
ADD有以下5种形式:
ADD reg,reg
ADD reg,mem
ADD mem,reg
ADD reg,imm
ADD imm,reg 例:ADD WORD PTR[1000H],2233H
-
带进位的加法指令
指令格式:ADC OPD,OPS
2.减法指令
-
不带借位减法指令
指令格式:SUB OPD,OPS
-
带借位减法指令
指令格式: SBB OPD,OPS
-
减1指令
指令格式:DEC OPD
DEC有两种形式:
DEC reg
DEC mem DEC WORD PTR[DI]
例:求1-100的累加和
MOV AX,0
MOV CX=64
ABC:ADD AX,CX
DEC CX
JNZ ABC
-
比较指令
指令格式:CMP OPD,OPS; (OPD)-(OPS)
3.乘法指令
-
无符号的乘法指令
指令格式:MUL OPS
字节乘法: AX<----(AL)*(OPS8)
字乘法: DX:AX<----(AX)*(OPS16)
-
带符号数乘法指令
指令格式:IMUL OPS
字节乘法: AX<----(AL)*(OPS8)
字乘法: DX:AX<----(AX)*(OPS16)
4.除法指令
-
无符号的除法法指令
指令格式:DIV OPS
字节除法: (AX)/(OPS8) 商---->AL,余数---->AH
字除法: DX:AX/(OPS16)
-
带符号数除法指令
指令格式:IDIV OPS
字节除法: (AX)/(OPS8) 商---->AL,余数---->AH
字除法: DX:AX/(OPS16)
1.2.3逻辑运算
1.求补指令
指令格式:NEG OPD
将OPD中的内容逐位取反,且末尾加一后送入OPD中
2.求反指令
指令格式:NOT OPD
将OPD中的内容逐位取反后,送入OPD中
3.逻辑与指令
指令格式:AND OPD,OPS OPD<----OPD^OPS
4.逻辑测试指令
指令格式: TEST OPD,OPS OPS^OPD
注:用来查询状态
5.逻辑或指令
指令格式:OR OPD,OPS OPD<----OPDvOPS
6.逻辑异或指令
指令格式: XOR OPD,OPS
1⊕1=0,0⊕0=0,0⊕1=1
1.2.4 移位指令
1. 算术移位指令
-
算数左移
SAL OPD,1
SAL OPD,CL
这两条指令的差别是当移位次数为1时,可以直接使用SAL OPD,1指令,当移位次数大于1时,必须先将移位次数送入CL中,然后使用SAL OPD,CL指令。
-
算数右移
SAR OPD,1
SAR OPD,CL
2.逻辑移位指令
-
逻辑左移指令
SHL OPD,1
SHL OPD,CL
-
逻辑右移指令
SHR OPD,1
SHR OPD,CL
3.循环移位
-
不带进位的循环左移指令
ROL OPD,1
ROL OPD,CL
ROL WORD PTR[BX],1 ;内存中临近的两个字节组成一个字循环左移一位
-
不带进位的循环右移指令
ROR OPD,1
ROR OPD,CL