微型计算机系统
一、系统总线
- 地址总线AB
- 决定系统直接寻址存储器的范围
- 数据总线DB
- 决定一次能够传送数据的位数
- 控制总线CB
- 决定系统总线特点
二、微处理器
- ALU 逻辑运算单元
- 累加器A 与 总线提供数
- 寄存器组
- PC——程序计数器
- AR——地址寄存器
- DR——数据寄存器
- ID——指令译码器
- IR——指令寄存器
- 标志寄存器
三、存储器
- 内存单元的地址和内容
- 每个内存单元包含8bit
- 以字节为单位进行编制,1Byte=8bit
- 内存单元也成地址单元
- 数据在内存中的存放规则
- 数据在内存中从低地址到高地址顺序存放
- 数据大于8bit,高字节放高地址,低字节放低地址
- 1234H 放入为 100H:34H 101H:12H
- 高位数据存放地址定义为为低地址存放地址
- 数据单位概念
- 位(bit):计算机所能表示的最小最基本的数据单位
- 字节(Byte):8个二进制位组成。
- 1K=1024,1M=1024K,1G=1024M,1T=1024G,1P=1024T
- 字(word):作为整体的一组二进制数,为字节的整数倍。
- 字长:字的位数,一般一个字为16位,双字为32位。
- 内存容量:内存单元的个数,字节为单位,与CPU地址总线宽度有关:若地址总线宽度为n,则存储空间为2^n
- 内存操作
四、I/O接口
- 主机cpu与外部设备之间进行数据传输的桥梁
五、指令执行过程
- 取指、译码、(取操作数)、执行、(存结果)
- 指令在PC中,由操作系统装入
- 程序计数器PC,会在指令结束后自动+1
- 操作数来自存储器/寄存器
读指令过程
- 指令地址给PC
- PC给AR,PC+1
- AR内容送内存,地址译码后选择相应单元
- CPU控制器发读命令
- 把选中单元内容读到DB
- 把内容给数据寄存器DR
- 指令译码:DR内容送指令寄存器IR,再送指令译码器ID
tips:
- 冯诺依曼计算机结构包括五个部分,分别是输入设备、运算器、控制器、存储器和输出设备。其核心原理即存储程序的工作原理。
计算机数制与运算
计算机中的数的性质
- 计算机中的数也称为机器数,分为有符号数和无符号数,其中有符号数最高位为符号位,0代表正数,1代表负数。
- B代表2进制数,D代表10进制数,H代表16进制数。
- 进制转换--略
- 二进制数逻辑运算
- 与 AND
- 或 OR
- 非 NOT
- 异或 XOR
- 机器数与真值
- 机器数所表示的值为真值(带符号)
- 机器数:把一个数及其符号位在机器中用一组二进制数表示形式(在机器中默认为一个字节8位二进制数)
- 机器数常用的表示方法有原码、反码、补码。
- 进位与溢出
- CF符号位进位状态,若有进位则为1,否则为0
- DF数值最高位进位状态,若有为1,否则为0
- OF=CF XOR DF,若为1,则溢出,否则未溢出
- 编码
- BCD码:将1位十进制的0~9分别用4位二进制码表示
- 8421 BCD码:用0000
1001来表示09
- 压缩型BCD码:用一个字节表示两位十进制数
- 非压缩型BCD码:用一个字节表示一位十进制数
- ASCII字符编码
- 用7位二进制进行编码
- 数字0
9的编码是01100000111001,它们的高3位均是011,后4位正好与其对应的二进制代码(BCD码)相符 - 英文字母A
Z的ASCII码从1000001(41H)开始顺序递增,字母az的ASCII码从1100001(61H)开始顺序递增
80X86微处理器
- 集成度:晶体管数
- 主频:主时钟频率
- 数据总线:数据传送的公共通道
- 地址总线:传送存储器或I/O端口的地址信息
- 8086CPU有16根数据线和20根地址线
- 8088片外数据线8根,而8086有16根
8086的内部结构
寄存器结构
- 功能:存放操作数地址、操作数、中间结果
- 分类:通用寄存器、段寄存器、指令和变址寄存器、指令指针和标志寄存器
通用寄存器 X I P
- 数据寄存器 X
- AX累加器:多用于存放中间运算结果
- BX基数寄存器:存放内存单元的偏移地址
- CX计数寄存器:存放循环次数或重复次数
- DX数据寄存器:存放一般数据
- 它们既是16位寄存器,每个寄存器又可以分开当作两个8位寄存器使用
- 变址寄存器 I
- SI源变址寄存器:存放源操作数的偏移地址
- DI目的变址寄存器:存放目标操作数的偏移地址
- 指针寄存器 P
- BP基址指针寄存器:存放内存单元的偏移地址
- SP堆栈指针寄存器:堆栈栈顶单元的偏移地址
- 这两个寄存器都默认与堆栈段寄存器(SS)联合使用
段寄存器 S
- DS数据段寄存器
- ES附加段寄存器
- SS堆栈段寄存器
- CS代码段寄存器
控制寄存器
标志寄存器
- CF:进位标志位,最高位的进位借位,有则1
- PF:奇偶校验标志位,运算结果的低8位中有偶数个1时,为1
- AF:辅助进位标志位,低字节的低4位向高4位进位借位,为1
- ZF:全零标志位,结果为0时为1
- SF:符号标志位,结果为负时为1
- OF:溢出标志位,为1 则溢出
- TF:单步标志位,为1时,每执行完一条指令,自动产生一次内部中断,用于用户调试
- IF:中断标志位,为1时,运存CPU响应可屏蔽中断,为0时,即使外部设备有中断申请,CPU也不响应
- DF:方向标志位
最小组态引脚
- 数据和地址引脚 A19/S6~A16/S3(Address/Status)
- 数据和读写控制引脚
- ALE(Address Latch Enable)
- IO/M*(Input and Output/Memory) 引脚输出高电平时,表示CPU将访问I/O端口, 引脚输出低电平时,表示CPU将访问存储器
- WR*(Write)写控制
- RD*(Read) 读控制
- READY 存储器或I/O口就绪。 在总线操作周期中,8086 CPU会在第3个时钟周期的前沿测试该引脚
- 如果测到高有效,CPU直接进入第4个时钟周期
- 如果测到无效,CPU将插入等待周期Tw
- DEN*(Data Enable) 数据允许 有效时,表示当前数据总线上正在传送数据,
可利用他来控制对数据总线的驱动 - DT/R* 数据发送/接收 高电平时数据自CPU输出(发送) 低电平时数据输入CPU(接收)
- BHE*/S7(Bus High Enable/Status)
- 中断请求和响应引脚
- INTR(Interrupt Request) 可屏蔽中断请求 有效时,表示请求设备向CPU申请可屏蔽中断
- INTA*(Interrupt Acknowledge) 可屏蔽中断响应 有效时,表示来自INTR引脚的中断请求已被CPU响应,CPU进入中断响应周期
- NMI(Non-Maskable Interrupt) 不可屏蔽中断请求 有效时,表示外界向CPU申请不可屏蔽中断
- 总线请求和响应引脚
- HOLD 总线保持(即总线请求),有效时,表示总线请求设备向CPU申请占有总线
- HLDA(HOLD Acknowledge) 总线保持响应(即总线响应),有效时,表示CPU已响应总线请求并已将总线释放
- 其他引脚
- RESET 复位请求 该信号有效,将使CPU回到其初始状态;当他再度返回无效时,CPU将重新开始工作
- CLK(Clock) 时钟输入
- Vcc
- GND
- MN/MX*(Minimum/Maximum)组态选择 接高电平时,8088引脚工作在最小组态;反之,8088工作在最大组态
- TEST* 测试
- CPU引脚是如何与外部连接的呢?
- 总线形成
最大组态引脚
- LOCK*(Lock):引脚29,总线封锁信号,输出
- QS1、QS0(Instruction Queue Status):引脚24、25,指令队列状态信号
- RQ/GT1、RQ/GT0(Request/Grant):引脚30、31,总线请求信号(输入)/总线请求允许信号(输出)
8086微处理器时序
- 时序(Timing)描述各信号随时间变化的规律及信号间相互关系
- 总线时序描述总线操作中相关信号的时序;它由总线主控设备产生
- 总线操作是指CPU通过总线对外进行的各种操作
- 时钟周期:由时钟发生器产生。是计算机内部的最小时间单位,用Ti表示。时钟周期等于主频的倒数。
- 总线周期(Bus Cycle)是指CPU通过总线与外部(存储器或I/O端口)进行一次数据交换的过程,即完成一次总线操作的时间
- 指令周期:通常需要一个或多个总线周期
- T1、T2进行准备,T3、T4进行读写操作,Tw在ready为0时被插入一个或多个
- CPU 访问存储器进行读写操作时,通常在T3状态去检测 READY
8086存储空间
- 最低有效位LSB(Least Significant Bit):指数据的最低位,即D0位
- 最高有效位MSB(Most Significant Bit):指数据的最高位,对应字节、字、双字分别指D7、D15、D31位
存储单元的地址属性
- 物理地址
- 8088/8086:20根地址线,可寻址220(1MB)个存储单元
- CPU送到AB上的20位地址称为物理地址
- 8088/8086的地址总线宽度为20位,所以访问内存时必须指定一个20位的地址。
- 逻辑地址 = 段地址(段基地址): 偏移地址(段内偏移)
物理地址=段地址 × 10H + 偏移地址
- 取指令时,段地址由CS寄存器提供,偏移地址由IP寄存器提供。
8086存储器分体结构
- 偶地址存储体+奇地址存储体,各为512KB,共1MB
- 偶地址存储体与数据总线低8位相连,当A0=0时,被访问
- 奇地址存储体与数据总线高8位相连,当A0=1时,被访问
堆栈操作
- 堆栈段由段定义语句在存储器中定义。可在存储器1MB空间内浮动,容量小于64KB。
- 段基地址由堆栈寄存器SS指定,栈顶由堆栈指针SP指定。
- 栈底为高地址,由段定义大小决定地址
- 8086CPU数据总线的作用:传送指令机器码、立即数、偏移地址量
- 指令队列作用:暂存预取指令
8086指令
80X86 指令格式
- 指令由 操作码 和 操作数 两部分组成
- eg: 操作码 操作数1 操作数2;
- 操作数2,常被称为源操作数src
- 操作数1,常被称为目的操作数dest
- 操作数分类
- 立即数:只能用于源操作数(取值范围同补码)
- 寄存器操作数:8个通用寄存器和4个段寄存器的内容
- 存储器操作数:分为字节、字、双字
80X86 寻址方式
- 立即数寻址
- 只能作为源操作数src
- 立即数为指令的一部分,紧跟在操作码之后放在代码段内
- 数字以A~F开头,前边必须加0
- 寄存器寻址
- 源操作数与目的操作数字长要相同
- 寄存器寻址与段地址无关
- ps:寄存器外不需方括号,与存储器寻址区分
- 存储器寻址
- 指令中只需给出操作数的偏移地址(有效地址EA)
- 段地址一般在默认的段寄存器中
存储器寻址
- 直接寻址
- 存储单元的有效地址EA直接由指令给出,一般存放在代码段中指令的操作码后。故需先求出操作数的物理地址,在从存储器中出的操作数。
- 操作数物理地址=10H×DS+EA
- DS为默认的段寄存器
- 指令中的有效地址表示为 [立即数]
- 寄存器间接寻址
- 操作数的有效地址放在寄存器中
- 使用的寄存器为BX、BP、SI、DI
- 因此代码中源操作数src不能出现[AX][CX][DX]
- ps:寄存器名称外必须加方括号
- 段超越前缀是用来从默认段以外的段中取得数据
-
默认段
-
- 指定寄存器BX、SI、DI,默认操作数放在DS中
-
- 指令寄存器BP,默认操作数放在SS中
- 寄存器相对寻址
- 操作数的有效地址是基址或变址寄存器的内容与8位或16位位移量之和
- EA=[BX]/[BP]/[SI]/[DI]+偏移量
- 寄存器外必须加方括号,偏移量可在括号内也可括号外
- 基址变址寻址
- 操作数有效地址是一个基址寄存器(BX、BP)的内容与一个变址寄存器(SI、DI)的内容之和
- 注意两组寄存器的对应关系
- 基址变址相对寻址
- 操作数有效地址是一个基址寄存器和一个变址寄存器的内容之和,再加上8位或16位偏移量
- I/O端口寻址
- 端口直接寻址方式:端口地址用8位立即数表示
- 端口间接寻址方式:当端口地址大于FFH时,必须事先将端口地址放在DX寄存器中
- 地址寻址
- 找出程序转移的地址
- 分为:段内直接/间接寻址、段间直接/间接寻址
地址寻址
- 段内直接寻址
- 转移的目标地址由指令直接给出,实际上是一个相对于IP的位移量
- 段内间接寻址
- 转移的目标地址由寄存器或存储单元的内容给出
- 段间直接寻址
- 指令中直接给出要转移的目的段地址和偏移地址
- 若为符号地址,其前方要加操作符FAR PTR
- 段间间接寻址
80X86指令系统
- 操作数不能是CS和IP
- 除串操作指令外,其他指令的源和目的操作数不能都是存储器操作数
- src和dest不能都是段寄存器
- src与dest至少有一个类型要能确定,二者类型确定时必须一致
数据传送指令
1. 通用数据传送
- mov dest,src
- 如果两个操作数都不是寄存器,则要表明dest的类型
- mov不能再两个存储单元之间直接传送数据,也不能在段寄存器之间直接传送数据,还不能再立即数和段寄存器之间传送
- 堆栈操作指令
- 堆栈以字为单位进行压入弹出
- SS指示段基址,SP指示栈顶、其初值决定堆栈大小
- 压栈 push src:将src压入
- 出栈 pop dest:取出栈顶给dest
- SP自动进行增减+—2
- 交换指令XCHG
- XCHG dest,src 将两个操作数内容互换
- 两操作数中必须有一个寄存器
- 操作数不能为段寄存器或立即数
- 查表转换指令XLAT
- XLAT ;AL<-[(BX)+(AL)]
- 使用前建立表格
- 将转换表起始地址装入BX寄存器
- 将要查的某项与表头地址的偏移量给AL
- 执行后,从AL中查到转换后的代码值
2.输入输出指令
- I/O指令用于数据的输入输出
- 输入输出操作必须以累加器AX为中建桥梁
- 指令中必须指出I/O端口地址,地址放在DX中
- 输入指令IN
- IN acc,port/DX
- acc为累加器AX,port为0~255端口地址
- 输出指令OUT
- OUt port/DX,acc
- 输入输出指令不影响标志位
3.地址目标传送指令
- LEA取有效地址指令
- LEA dest,src
- src必须为存储单元,dest是除段寄存器外的16位寄存器
- LDS将双字指针送到寄存器和DS指令
- LDS dest,src
- src的存储单元中,取双字的前两个字节(高地址,表示变量的偏移地址)送入dest,后两个字节(低地址,表示变量的段地址)送入DS寄存器
- dest常用SI寄存器,不能是段寄存器
- LES 将双字指针送到寄存器和ES指令
- LES dest,src
- 同上
- dest常用DI寄存器
4,标志传送指令
- 读标志指令LAHF
- 设置标志指令SAHF
- 与LAHF功能相反
- PUSHF标志入栈指令
- 将标志寄存器PSW中的内容压入堆栈,并修改指针
- POPF标志出栈指令
- 将堆栈指针SP所指的一个字弹入标志寄存器PSW,并修改指针
算术运算指令
1.加法指令
- 不带进位的加法指令ADD
- ADD dest,src
- 影响全部状态标志位
- 带进位的加法指令ADC
- ADC dest,src
- 运算时要加上CF的内容,即dest<-dest+src+CF
- 加1指令INC
- INC reg/mem
- 对指定操作数加1
- 除CF外,其他状态标志都会影响
2.减法指令
- 不带借位的减法指令SUB
- SUB dest,src
- 影响全部6个状态标志位
- 带借位的建发指定SBB
- SBB dest,src
- dest<-dest-src-CF
- 影响全部转台标志位
- 减1指令DEC
- DEC reg/mem
- 除CF外,其他状态标志位均受到影响
- 求补指令NEG
- NEG reg/mem
- 对指定的操作数求补码,原理是拿0减操作数
- 若操作数为正数,则结果为该数负数的补码
- 若操作数为负数,则结果为该数的绝对值
- 比较指令CMP
- CMP dest,src ; dest-src
- CMP操作将两数相减,但不送结果,只是将状态反映在标志位上。
- CMP判断结果,根据ZF判断相等,若为1则相等。
-
- 比较无符号数,若CF=0,则dest>src,反之
-
- 比较有符号数,若OF XOR SF =0,则dest>src,反之
3.乘法指令
- AL(AX)为隐含的被乘数寄存器
- AX(DX:AX)为隐含的乘积寄存器
- src不能是立即数
- 执行后,除CF和OF外,其他标志位无定义
- 8位×8位->16位乘积
- 无符号数乘法指令MUL
- MUL reg/mem (src)
- 只影响CF和OF
- 若结果的高半部分不为零,则CF和OF均为1,否则为0
- 有符号数乘法指令IMUL
- IMUL reg/mem (src)
- 乘积的高半部分不是低半部分的符号拓展(不全为0或1),则CF和OF均为1,否则为0
4.除法指令
- 16位/8位->8位商,8位余数
- AX(DX:AX)被除数隐含
- AL(AX)商隐含
- AH(DX)余数隐含
- 执行后,所有状态标志位均无定义
- 无符号数触发指令DIV
- DIV reg/mem (src)
- 若除数为0或AL中的商大于FFH,则CPU产生一个0号中断
- 有符号数除法指令IDIV
- IDIV reg/mem (src)
- 余数符号总是与被除数符号相同
- CBW把字节转换为字
- CBW
- 把AL中的字节的符号位扩充到AH的所有位
- CWD把字转换为双字
- CWD
- 把AX中字的符号值扩充到DX寄存器的所有位
逻辑运算和移位指令
1.逻辑运算
- 按bit操作,没有进位借位
- 逻辑 与 AND
-AND dest,src - 逻辑 或 OR
- OR dest,src
- 逻辑 非 NOT
- NOT mem/reg
- 逻辑 异或 XOR
- XOR dest,src
- 测试指令TEST
- TEST dest,src
- 与AND指令做相同与操作,但不将结果送入dest,只影响标志位
2.移位指令
- 非循环移位指令
- 算术/逻辑左移 SAL/SHL dest,计数值; LSB补0,最高有效位MSB进CF
- 若移位1次,则计数值为1,大于一次,要将移位次数送进CL
- 移位1次,最高位改变则OF置1,多次时不确定
- CF总等于最后被移出的值
- 每移一次相当于乘2
- 逻辑右移 SHR dest,计数值
- 每移一次,低位进CF,高位补0
- 相当于除以2 但丢掉余数
- 算术右移 SAR dest,计数值
- 每移一次,低位进CF,高位不变
- 相当于除以2
- 循环移位指令
字符串处理指令
- 隐含约定:
- 源串:起始地址为DS:SI
- 目的串:起始地址ES:DI,不允许使用段超越前缀修改
- 指针:每执行一次指令,SI和DI会自动修改
- DF标志:控制字符串处理方向。DF=0递增,DF=1递减。STD使DF置1,CLD将DF清0
- 串长度:要处理的字符串长度放在CX寄存器
- 重复前缀:
- 每重复一次,CX的值自动减1
- REP:无条件重复(Repeat),常与(MOVS)连用,连续传送字符串。直到传送完毕,即CX=0为止
- REPE/REPZ:相等/结果为零则重复(Repeat while Equal/Zero),连续比较字符串。当两个字符串对应字符相等(ZF=1)和CX≠0时,则重复进行比较,直到ZF=0或CX=0为止
- REPNE/REPNZ :不相等/结果非零则重复Repeat while Not Equal/NotZero),常与(SCAS)连用,当结果非0(ZF=0)和CX≠0时,重复进行扫描,直到ZF=1或CX=0为止
- 串传送指令MOVS
- MOVS dest,src
- dest用DS:SI, src用ES:DI
- 串比较指令CMPS
- CMPS dest,src
- CMPSB; SI+-1,DI+-1
- CMPSW; SI+-2.DI+-2
- 串扫描指令SCAS
- 将AL/AX的内容与目的串中的字符逐个进行比较,结果只影响标志位
- 串装入指令LODS
- 从串中取一个元素送到累加器
- 通常不加重复前缀
- 串存储指令STOS
- 用于把一块存储区域填充成某一相同值
- 允许前缀REP
控制转移类指令
- 改变CS和IP的值,从而改变指令的执行顺序
1.转移指令
- 无条件转移指令 JMP
- 段内直接:JMP disp,指令中的位移量加到IP,CS不变
- 段内间接:JMP reg/mem, 16位偏移地址送IP,CS不变
- 段间直接:JMP segment:offset。将16位的段和16位的偏移地址送CS和IP
- 段间间接:JMP mem32。将16位段和16位偏移地址送到CS和IP
- 条件转移指令
2.循环控制指令
- 增强型的条件转移指令,重复次数存于CX寄存器中
- 指令字节数均为2,第一字节为操作码,第二字节是8位偏移量
- 偏移量都是负值
- 不影响任何标志位
- loop循环指令
- 控制执行一系列指令,每执行一次,CX自动减1
- LOOP 短标号
- LOOPE/LOOPZ相等或结果为0时循环
- LOOPE label或LOOPZ label
- LOOPNE/LOONZ不相等或结果不为零时循环
- 同上
3.过程调用和返回指令
- 过程:程序中能完成特定功能而又独立的模块,也称子程序
- 过程嵌套:在过程中又去调用另一个过程
- 过程调用和返回指令的格式: CALL 过程名; RET
- 调用指令CALL
- CALL sub;
- sub为子程序入口,根据子程序入口寻址方式,子程序调用四类
- 段内直接调用、段内间接调用、段间直接调用、段间间接调用
- 返回指令RET
- 从栈中弹出返回地址,使程序返回主程序继续执行。
4. 中断指令
- 中断调用INT n
- 中断返回IRET
处理器控制指令
1.标志操作指令
- CF设置指令
- CLC;CF为0
- STC;CF为1
- CMC;CF变反
- DF设置指令
- CLD;DF为0(串操作指针移动方向,从低到高)
- STD;DF取1
- IF设置指令
- CLI; IF取0(进制INTR中断)
- STI;IF取1
2.外部同步指令
- ESC换码指令
- 用来实现8086对8087协处理器的控制
- WAIT等待指令
- LOCK封锁总线指令
- 一种前缀,加在指令前端,用来维持8086的总线封锁信号有效,禁止其他协处理器使用总线。
3.停机指令和空操作指令
- HLT停机指令(halt)
- CPU进入暂停状态,不进行任何操作。
- 在RESET线上加复位信号、在NMI引脚出现中断请求信号、在允许中断的情况下在INTR引脚上出现中断请求信号,出现如上情况,才会脱离暂停状态
- NOP空操作或无操作指令
- 单字节指令,执行需耗费3个时钟周期 ,但不进行任何操作。
by RolinShmily 转载请注明出处