原码:二进制数 = 1 101
反码=原码的每一位(除符号位)都取反 = 1 010
补码=反码+1 = 1 011
补码的补码=原码
[x+y]补=[x]补+[y]补
[x-y]补=[x]补+[-y]补
补码运算的符号位进位丢失 ≠ 溢出 (若结果未超出-128~127)
双高位法判断是否溢出
最高位进位 xor 次高位进位 = 1 溢出
= 0 无溢出
0110
0110
1100
定点数:
定点纯小数:符号位后面都是小数部分,定点纯整数:符号位后面都是整数部分。
十进制小数转二进制:
乘2取整数部分: : 0.321x2=0.642 – 0
0.642x2=1.284 – 1
0.284x2=0.568 – 0
0.568x2=1.136 – 1
…
0.321=0.0101…
二进制小数转十进制
( 0.1001 ) 2 = 1 ∗ 2 − 1 + 1 ∗ 2 − 4 = 0.5 + 0.0625 = ( 0.5625 ) 10 (0.1001)_2=1*2^{-1}+1*2^{-4}=0.5+0.0625=(0.5625)_{10} (0.1001)2=1∗2−1+1∗2−4=0.5+0.0625=(0.5625)10
浮点数
N = 2 p S N=2^pS N=2pS
阶符 P f P_f Pf | 阶码 P P P | 尾符 S f S_f Sf | 尾数 S S S |
---|
S用带符号的定点小数 原码表示
p为带符号整数,用补码表示
0.5<S<1则称为规格化浮点数
例:将-18.75转换成规格化的二进制数(尾数8 位,阶码四位表示):
( − 18.75 ) 10 = ( − 10010.11 ) 2 = ( − 0.1001011 ) ∗ 2 101 (-18.75)_{10}=(-10010.11)_2=(-0.1001011)*2^{101} (−18.75)10=(−10010.11)2=(−0.1001011)∗2101
先把十进制数转成二进制,再全部移到小数点后,乘上2的 i次方,i为移了的位数
微型计算机基本组成
1.CPU(微处理器) 2.内存储器(RAM,ROM) 3. 总线(地址总线AB,数据总线DB,控制总线CB)
4.接口芯片(I/O接口) 5.输入输出设备(I/O设备)
1.CPU
-
EU:执行部件
8个通用寄存器
ALU 算数逻辑运算部件 16位加法器,用于对寄存器和指令操作数进行算数或逻辑运算
FR 标志寄存器 9个标志位 6个存放指令结果状态
EU控制系统 接收从BIU的指令队列中取出的指令代码 向EU有关部分发出时序命令
功能: 指令的执行,向BIU输出数据,管理Reg和PSW
-
BIU:总线接口部件
4个段寄存器
指令指针寄存器(IP)
指令队列
20位地址加法器
总线控制逻辑
功能:完成所有外部总线操作,提供总线控制
使用指令队列实现流水线操作
在一条指令的执行过程中可以取出下一条(或多条)指令,指 令在指令队列中排队(预取下一条指令的技术称指令流水线);在 一条指令执行完成后,就可以立即执行下一条指令,减少CPU为取 指令而等待的时间,提高CPU的利用率和整个运行速度。
存储器空间:20根地址线 2 20 = 1 M B 2^{20}=1MB 220=1MB
将存储器分成4种段,存放三类信息: 代码、数据、中间结果和断点地址。
8086有20根地址线,但其内部可以表示的地址最多只能是16位。 为了能寻址1MB空间,8086对存储器进行逻辑分段,每个段最大 为64KB,最小为16B(此时最多64K个段)。
寄存器
寄存器是CPU内部用来存放数据的小型存储区域,一般用于存放运算的中间值和结果.下面是常用的寄存器
reg8(8位通用寄存器):
AH AL BH BL CH CL DH DL
其实就是对应的AX BX等16位寄存器的高8位和低8位。比如AH (A High)和AL (A Low)就是AX的高8位和低8位,其他的同理
reg16(16位通用寄存器)
AX BX CX DX
SI , DI 变址寄存器 默认段:DS
IP 指令指针寄存器(指向下一条要取的指令的偏移量),和CS组合使用可以取下一条要执行的指令
BP 指针寄存器,存储偏移量,默认段:SS,BP和SS组合使用可以访问整个堆栈
SP 指向SS的栈顶 ,SP和SS组合使用可以访问栈顶
Sreg(段寄存器)
将内存(主存储器)分段后,段寄存器保存的是每个段的段基址的高16位
DS(数据段寄存器) CS(代码段寄存器) SS(堆栈段寄存器) ES(附加段寄存器):
存放相应段的基地址
PSW(标志寄存器) 用来存放运算结果的特征
所以注意段寄存器存储的是地址。
操作数寻址方式:
1.立即寻址: 操作数在指令中,操作数部分给出操作数
2**.寄存器(Reg)寻址**:操作数在寄存器Reg中,操作数部分给出对应Reg的编码
3.存储器寻址:操作数在主存储器中,操作数部分给出操作数的存储地址(段内偏移地址)
这里的段位偏移地址(仅针对存储器寻址)被称为有效地址EA
EA=基址寄存器+(变址寄存器x比例因子)+ 位移量
其中根据EA给出的方式不同,存储器寻址又可以分为
1) 直接寻址:EA直接在指令中给出,EA=位移量数据。默认为数据段DS的位移量。如MOV AL,[2000H]
,EA=2000H ,物理地址=DS*16+2000H
允许段超越(用指定的段Reg替代默认段)如:MOV AX,ES:[2000H]
☠️ 注意和立即寻址区分:立即寻址中后面的数是数据,而存储器寻址的直接寻址中后面的数是一个地址
2) 寄存器Reg间接寻址: EA在指令指定的Reg中 EA = Reg
☠️ 注意和寄存器寻址区分:寄存器寻址中寄存器里存的是操作数,而寄存器间接寻址里寄存器存的是操作数的有效地址EA(偏移量),可以看作指针
若Reg为DI,SI,BX,则默认操作数在数据段中。即操作数物理地址=DS*16+BX (或SI,DI)
若Reg为BP,则默认操作数在堆栈段内. 操作数物理地址=SS*16+BP
如果要取的操作数不在以上默认段,就必须加段超越前缀:
MOV AX, [SI]
; 将DS段[SI] [SI+1]的内容送到AX,因为AX是16位寄存器所以有两字节(1字节=8位)[SI]送到AL,[SI+1]送到AH
MOV BH,[BP]
; 将SS段[BP]的内容送到BH
3) 基址寻址
EA为指令中给出的基址寄存器与位移量之和。
MOV AX,[BX+24]
物理地址=DS * 16 + BX + 24
4) 基址加变址寻址
EA=(基址Reg)+(变址Reg )
MOV AX,[BX+SI]
MOV AX,[BX][SI]
常用指令
-
MOV
mov data,25H
立即数->存储器mov ds,ax
通用Reg->段Reg
- CS(代码段寄存器) 只能读取不能写入和修改. 因此不能向CS传送数据
- 内存的两个存储单元不能直接传送,需要用Reg做中介
- 段寄存器之间不能直接传送数据,例如
MOV DS ,ES
是错误的 - 立即数不能直接传送到段寄存器,应先传到通用寄存器再传到段寄存器
- 将立即数传送到存储单元时,必须显式说明存储器操作数的 宽度类型。
-
PUSH/POP
push ax
将AX中的内容压入栈,SP=SP-2pop bx
将栈顶数据弹出到BX中,SP=SP+28086的堆栈从上往下增长,堆栈操作一定是16位操作
-
XCHG
XCHG AX,BX
将AX和BX内容互换不能对段寄存器使用
不能两个都为存储器操作数
-
LEA
取存储器操作数在当前段内的有效地址送至通用寄存器
LEA AX,[BP+SI]
LEA DI,TABLE
将TABLE的有效地址送入DI区别于:
MOV DI,TABLE
将TABLE的内容送入DI -
IN/OUT
用于在AL或AX寄存器与I/O端口之间传送信息
x86 CPU中的16条I/O地址线,可形成: 64K个传送8位数据的端口地址;
①当端口地址<256(使用8根地址线): 采用直接寻址方式,在指令中直接指定端口地址。
②当端口地址≥256(使用8~16根地址线): 采用间接寻址方式,端口地址放在DX中。
IN AX,20H
从端口20H和21H输入16位数据到AXOUT 27H,AL
将8位数据从AL输出到端口27H -
MUL/IMUL
将8位操作数与AL相乘结果放在AX中,或者将16位操作数与AX相乘结果放在(DX,AX)中。DX为高位,AX为低位
MUL BL
-
CMP
比较两个操作数并改变相应标志位,一般后跟条件转移指令,根据比较结果产生不同的转移
CMP AX,BX
无符号数比较结果:
指令 转移条件 含义 英文表述 JA/JNBE DEST CF=0 AND ZF=0 无符号数A>B JMP above (not below or equal) JAE/JNB DEST CF=0 无符号数A≥B JMP above or equal (not below ) JB/JNAE DEST CF=1 无符号数A JMP blow (not above or equal) JBE/JNA DEST CF=1 OR ZF=1 无符号数A≤B JMP blow or equal (not above) 有符号数比较结果:
指令 转移条件 含义 英文表述 JG/JNLE DEST SF=OF AND ZF=0 有符号数A>B JMP greater (not less or equal) JGE/JNL DEST SF=OF OR ZF=1 有符号数A≥B JMP greater or equal (not less) JL/JNGE DEST SF≠OF AND ZF=0 有符号数A JMP less (not greater or equal) JLE/JNG DEST SF≠OF OR ZF=1 有符号数A≤B JMP less or equal (not greater)
SAL算术左移 最低位用0填充,最高位移入进位标志位CF
SAR算术右移 最低位抛弃,符号位复制到最高位
SHL 循环左移 最低位用0填充,最高位移入进位标志位CF
ROR 循环右移 最低位移入进位标志位和最高位
RCL 带进位循环左移
RCR 带进位循环右移
I/O 端口独立寻址(也称直接I/O映射编址)
存储器地址空间和I/O端口地址空间为两个不同的 独立地址空间(80X86系统该编址方式),即计算机单独 给外设端口编址。计算机要有控制信号区分存储器空间 和I/O口空间。
(a)优点: ◼ 1. I/O空间较存储器空间小,地址线少,译码电路 简单 ◼ 2、不占用存储器空间; (b)缺点: ◼ 要有专门输入输出指令,寻址方式少,不灵活。
I/O 与存储器统一编址(存储器映射的I/O编址)
把一个外设端口看成存储器的一个单元,占用存储器的 地址空间,利用对存储器的读写操作完成数据的输入和输出。 (a)优点: ◼ 1、不需要专门的输入输出指令; ◼ 2、可使用全部对存储器操作指令,指令多,方便; ◼ 3、端口数量多。 (b)缺点: ◼ 1、占用存储器空间;在程序中不易分清存储器外设的 访问 ◼ 2、 寻址地址线数多,译码复杂
8086CPU中I/O译码电路使用A9来区别端口位置
A9=0 寻址主板上的512个I/O端口
A9=1 寻址I/O卡上的512个I/O端口
输入输出方式
1.无条件传送 默认外设已准备就绪,程序不检查外设状态直接执行输入输出指令
2.查询方式(条件传送)
CPU从接口读取状态字,满足条件就从数据口输入输出,不满足则重新读取状态字
3.中断传送
4.直接数据通道传送:
DMA方式 : 直接存储器存取(Direct Memory Access)方式
DMA控制器: 包含:
- 控制寄存器
-
状态寄存器 设置控制字,指定数据传输方向
-
地址寄存器: 要传送的数据块的首地址
-
字节计数器 要传送的数据长度(字节数)
每个字节传送后地址寄存器+1,字节计数器1
硬件中断:
- 非屏蔽中断
由NMI引脚产生上升沿触发,中断类型码固定为2
- 可屏蔽中断
外部设备发出请求,CPU的INTR引脚引入,高电平触发
软件中断
-
除法出错中断 0型中断
-
单步中断 1型中断
-
溢出中断 4型中断
-
指令中断 n型中断
中断向量表:00000H~003FFH
中断向量:中断服务程序入口地址
IF标志位: IF=1 可响应中断请求,IF=0 不响应中断请求
TF标志位: 追踪标志位 TF=1 CPU进入单步执行方式,每执行一条指令就产生一个单步中断请求