微型计算机系统

  1. 硬件系统
      1. 微型计算机(主机)
        1. 微处理器
          1. ALU(运算器)
          1. 寄存器
          1. 控制器
        1. 存储器
        1. I/O接口
        1. 总线
      1. 外设
        1. 输入设备
        1. 输出设备
        1. 存储设备
  2. 软件系统
    • 系统软件
    • 应用软件
      微型计算机系统

一、系统总线

  1. 地址总线AB
  1. 数据总线DB
  1. 控制总线CB

二、微处理器

  1. ALU 逻辑运算单元
  1. 寄存器组
  1. 可编程逻辑阵列(控制器)
    CPU

三、存储器

  1. 内存单元的地址和内容
  1. 数据在内存中的存放规则
  1. 数据单位概念
  1. 内存操作

四、I/O接口

  1. 具有缓冲数据的传送功能,实现数据同步
  2. 转换数据格式,串行与并行数据转换
  3. 信号量转换,数字量与模拟量转换
    IO接口

五、指令执行过程

  1. 指令在PC中,由操作系统装入
  2. 程序计数器PC,会在指令结束后自动+1
  3. 操作数来自存储器/寄存器

读指令过程

  1. 指令地址给PC
  2. PC给AR,PC+1
  3. AR内容送内存,地址译码后选择相应单元
  4. CPU控制器发读命令
  5. 把选中单元内容读到DB
  6. 把内容给数据寄存器DR
  7. 指令译码:DR内容送指令寄存器IR,再送指令译码器ID

tips:

计算机数制与运算

计算机中的数的性质

  1. 二进制数逻辑运算
    • 与 AND
    • 或 OR
    • 非 NOT
    • 异或 XOR
  2. 机器数与真值
    • 机器数所表示的值为真值(带符号)
    • 机器数:把一个数及其符号位在机器中用一组二进制数表示形式(在机器中默认为一个字节8位二进制数)
    • 机器数常用的表示方法有原码、反码、补码。

  1. 进位与溢出
    • CF符号位进位状态,若有进位则为1,否则为0
    • DF数值最高位进位状态,若有为1,否则为0
    • OF=CF XOR DF,若为1,则溢出,否则未溢出
  2. 编码
    • BCD码:将1位十进制的0~9分别用4位二进制码表示
    • 8421 BCD码:用00001001来表示09

80X86微处理器

8086的内部结构

寄存器结构

  1. 功能:存放操作数地址、操作数、中间结果
  2. 分类:通用寄存器、段寄存器、指令和变址寄存器、指令指针和标志寄存器

通用寄存器 X I P

  1. 数据寄存器 X
    • AX累加器:多用于存放中间运算结果
    • BX基数寄存器:存放内存单元的偏移地址
    • CX计数寄存器:存放循环次数或重复次数
    • DX数据寄存器:存放一般数据
  1. 变址寄存器 I
    • SI源变址寄存器:存放源操作数的偏移地址
    • DI目的变址寄存器:存放目标操作数的偏移地址
  2. 指针寄存器 P
    • BP基址指针寄存器:存放内存单元的偏移地址
    • SP堆栈指针寄存器:堆栈栈顶单元的偏移地址

段寄存器 S

控制寄存器

标志寄存器
  1. CF:进位标志位,最高位的进位借位,有则1
  2. PF:奇偶校验标志位,运算结果的低8位中有偶数个1时,为1
  3. AF:辅助进位标志位,低字节的低4位向高4位进位借位,为1
  4. ZF:全零标志位,结果为0时为1
  5. SF:符号标志位,结果为负时为1
  6. OF:溢出标志位,为1 则溢出

  1. TF:单步标志位,为1时,每执行完一条指令,自动产生一次内部中断,用于用户调试
  2. IF:中断标志位,为1时,运存CPU响应可屏蔽中断,为0时,即使外部设备有中断申请,CPU也不响应
  3. DF:方向标志位
    • DF=0,地址指针自动增量,即由低地址向高地址进行串操作
    • DF=1,地址指针自动减量,即由高地址向低地址进行串操作
      寄存器内部结构

最小组态引脚

  1. 数据和地址引脚 A19/S6~A16/S3(Address/Status)
  2. 数据和读写控制引脚
    • 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)
  3. 中断请求和响应引脚
    • INTR(Interrupt Request) 可屏蔽中断请求 有效时,表示请求设备向CPU申请可屏蔽中断
    • INTA*(Interrupt Acknowledge) 可屏蔽中断响应 有效时,表示来自INTR引脚的中断请求已被CPU响应,CPU进入中断响应周期
    • NMI(Non-Maskable Interrupt) 不可屏蔽中断请求 有效时,表示外界向CPU申请不可屏蔽中断
  4. 总线请求和响应引脚
    • HOLD 总线保持(即总线请求),有效时,表示总线请求设备向CPU申请占有总线
    • HLDA(HOLD Acknowledge) 总线保持响应(即总线响应),有效时,表示CPU已响应总线请求并已将总线释放
  5. 其他引脚
    • RESET 复位请求 该信号有效,将使CPU回到其初始状态;当他再度返回无效时,CPU将重新开始工作
    • CLK(Clock) 时钟输入
    • Vcc
    • GND
    • MN/MX*(Minimum/Maximum)组态选择 接高电平时,8088引脚工作在最小组态;反之,8088工作在最大组态
    • TEST* 测试

最大组态引脚

8086微处理器时序

  1. 存储器写总线周期
    存储器写总线周期1
    存储器写总线周期2
  2. 存储器读总线周期
    存储器读总线周期1
  3. I/O写总线周期
    I/O写总线周期1
    I/O写总线周期2
  4. I/O读总线周期
    I/O读总线周期1
    I/O读总线周期2

8086存储空间

存储单元的地址属性

  1. 物理地址
    • 8088/8086:20根地址线,可寻址220(1MB)个存储单元
    • CPU送到AB上的20位地址称为物理地址
    • 8088/8086的地址总线宽度为20位,所以访问内存时必须指定一个20位的地址。

  1. 逻辑地址 = 段地址(段基地址): 偏移地址(段内偏移)
    物理地址=段地址 × 10H + 偏移地址

8086存储器分体结构

堆栈操作


8086指令

80X86 指令格式

  1. 指令由 操作码操作数 两部分组成
    • eg: 操作码 操作数1 操作数2;
    • 操作数2,常被称为源操作数src
    • 操作数1,常被称为目的操作数dest
  2. 操作数分类
    • 立即数:只能用于源操作数(取值范围同补码)
    • 寄存器操作数:8个通用寄存器和4个段寄存器的内容
    • 存储器操作数:分为字节、字、双字

80X86 寻址方式

  1. 立即数寻址
    • 只能作为源操作数src
    • 立即数为指令的一部分,紧跟在操作码之后放在代码段内
    • 数字以A~F开头,前边必须加0
  2. 寄存器寻址
    • 源操作数与目的操作数字长要相同
    • 寄存器寻址与段地址无关
    • ps:寄存器外不需方括号,与存储器寻址区分
  3. 存储器寻址
    • 指令中只需给出操作数的偏移地址(有效地址EA)
    • 段地址一般在默认的段寄存器中

存储器寻址

  1. 直接寻址
    • 存储单元的有效地址EA直接由指令给出,一般存放在代码段中指令的操作码后。故需先求出操作数的物理地址,在从存储器中出的操作数。
    • 操作数物理地址=10H×DS+EA
    • DS为默认的段寄存器
    • 指令中的有效地址表示为 [立即数]
  2. 寄存器间接寻址
    • 操作数的有效地址放在寄存器中
    • 使用的寄存器为BX、BP、SI、DI
    • 因此代码中源操作数src不能出现[AX][CX][DX]
    • ps:寄存器名称外必须加方括号
    • 段超越前缀是用来从默认段以外的段中取得数据
    • 默认段

      1. 指定寄存器BX、SI、DI,默认操作数放在DS中
      1. 指令寄存器BP,默认操作数放在SS中
  3. 寄存器相对寻址
    • 操作数的有效地址是基址或变址寄存器的内容与8位或16位位移量之和
    • EA=[BX]/[BP]/[SI]/[DI]+偏移量
    • 寄存器外必须加方括号,偏移量可在括号内也可括号外
  4. 基址变址寻址
    • 操作数有效地址是一个基址寄存器(BX、BP)的内容与一个变址寄存器(SI、DI)的内容之和
    • 注意两组寄存器的对应关系
  5. 基址变址相对寻址
    • 操作数有效地址是一个基址寄存器和一个变址寄存器的内容之和,再加上8位或16位偏移量

  1. I/O端口寻址
    • 端口直接寻址方式:端口地址用8位立即数表示
    • 端口间接寻址方式:当端口地址大于FFH时,必须事先将端口地址放在DX寄存器中
  2. 地址寻址
    • 找出程序转移的地址
    • 分为:段内直接/间接寻址、段间直接/间接寻址

地址寻址

  1. 段内直接寻址
    • 转移的目标地址由指令直接给出,实际上是一个相对于IP的位移量
  2. 段内间接寻址
    • 转移的目标地址由寄存器或存储单元的内容给出
  3. 段间直接寻址
    • 指令中直接给出要转移的目的段地址和偏移地址
    • 若为符号地址,其前方要加操作符FAR PTR
  4. 段间间接寻址
    • 转移的目标地址(段和偏移)在两个相邻的字存储单元中
      段间间接寻址

80X86指令系统

数据传送指令

1. 通用数据传送

  1. mov dest,src
    • 如果两个操作数都不是寄存器,则要表明dest的类型
    • mov不能再两个存储单元之间直接传送数据,也不能在段寄存器之间直接传送数据,还不能再立即数和段寄存器之间传送
  2. 堆栈操作指令
    • 堆栈以字为单位进行压入弹出
    • SS指示段基址,SP指示栈顶、其初值决定堆栈大小
  3. 压栈 push src:将src压入
  4. 出栈 pop dest:取出栈顶给dest
  1. 交换指令XCHG
    • XCHG dest,src 将两个操作数内容互换
    • 两操作数中必须有一个寄存器
    • 操作数不能为段寄存器或立即数
  2. 查表转换指令XLAT
    • XLAT ;AL<-[(BX)+(AL)]
    • 使用前建立表格
    • 将转换表起始地址装入BX寄存器
    • 将要查的某项与表头地址的偏移量给AL
    • 执行后,从AL中查到转换后的代码值

2.输入输出指令

  1. 输入指令IN
    • IN acc,port/DX
    • acc为累加器AX,port为0~255端口地址
  2. 输出指令OUT
    • OUt port/DX,acc

3.地址目标传送指令

  1. LEA取有效地址指令
    • LEA dest,src
    • src必须为存储单元,dest是除段寄存器外的16位寄存器
  2. LDS将双字指针送到寄存器和DS指令
    • LDS dest,src
    • src的存储单元中,取双字的前两个字节(高地址,表示变量的偏移地址)送入dest,后两个字节(低地址,表示变量的段地址)送入DS寄存器
    • dest常用SI寄存器,不能是段寄存器
  3. LES 将双字指针送到寄存器和ES指令
    • LES dest,src
    • 同上
    • dest常用DI寄存器

4,标志传送指令

  1. 读标志指令LAHF
    • 把标志寄存器低8位中的5个标志位传送到AH中的指定位
      LAHF
  2. 设置标志指令SAHF
    • 与LAHF功能相反
  3. PUSHF标志入栈指令
    • 将标志寄存器PSW中的内容压入堆栈,并修改指针
  4. POPF标志出栈指令
    • 将堆栈指针SP所指的一个字弹入标志寄存器PSW,并修改指针

算术运算指令

1.加法指令

  1. 不带进位的加法指令ADD
    • ADD dest,src
    • 影响全部状态标志位
  2. 带进位的加法指令ADC
    • ADC dest,src
    • 运算时要加上CF的内容,即dest<-dest+src+CF
  3. 加1指令INC
    • INC reg/mem
    • 对指定操作数加1
    • 除CF外,其他状态标志都会影响

2.减法指令

  1. 不带借位的减法指令SUB
    • SUB dest,src
    • 影响全部6个状态标志位
  2. 带借位的建发指定SBB
    • SBB dest,src
    • dest<-dest-src-CF
    • 影响全部转台标志位
  3. 减1指令DEC
    • DEC reg/mem
    • 除CF外,其他状态标志位均受到影响
  4. 求补指令NEG
    • NEG reg/mem
    • 对指定的操作数求补码,原理是拿0减操作数
    • 若操作数为正数,则结果为该数负数的补码
    • 若操作数为负数,则结果为该数的绝对值
  5. 比较指令CMP
    • CMP dest,src ; dest-src
    • CMP操作将两数相减,但不送结果,只是将状态反映在标志位上。

3.乘法指令

  1. 无符号数乘法指令MUL
    • MUL reg/mem (src)
    • 只影响CF和OF
    • 若结果的高半部分不为零,则CF和OF均为1,否则为0
  2. 有符号数乘法指令IMUL
    • IMUL reg/mem (src)
    • 乘积的高半部分不是低半部分的符号拓展(不全为0或1),则CF和OF均为1,否则为0

4.除法指令

  1. 无符号数触发指令DIV
    • DIV reg/mem (src)
    • 若除数为0或AL中的商大于FFH,则CPU产生一个0号中断
  2. 有符号数除法指令IDIV
    • IDIV reg/mem (src)
    • 余数符号总是与被除数符号相同
  3. CBW把字节转换为字
    • CBW
    • 把AL中的字节的符号位扩充到AH的所有位
  4. CWD把字转换为双字
    • CWD
    • 把AX中字的符号值扩充到DX寄存器的所有位

逻辑运算和移位指令

1.逻辑运算

  1. 逻辑 与 AND
    -AND dest,src
  2. 逻辑 或 OR
    • OR dest,src
  3. 逻辑 非 NOT
    • NOT mem/reg
  4. 逻辑 异或 XOR
    • XOR dest,src
  5. 测试指令TEST
    • TEST dest,src
    • 与AND指令做相同与操作,但不将结果送入dest,只影响标志位

2.移位指令

  1. 非循环移位指令
    • 算术/逻辑左移 SAL/SHL dest,计数值; LSB补0,最高有效位MSB进CF
    • 若移位1次,则计数值为1,大于一次,要将移位次数送进CL
    • 移位1次,最高位改变则OF置1,多次时不确定
    • CF总等于最后被移出的值
    • 每移一次相当于乘2


  1. 循环移位指令
    • 循环左移 ROL dest,计数值
    • 循环右移 ROR dest,计数值
    • 通过进位位循环左移 RCL dest,计数值
    • 通过进位位循环右移 RCR dest,计数值
      循环移位
    • 移位次数由CL寄存器指定,默认为1
    • CF的值总是由最后一次被移出的值决定
    • OF在移位次数为1时有效,最高位发生变化,OF置1,反之

字符串处理指令

  1. 源串:起始地址为DS:SI
  2. 目的串:起始地址ES:DI,不允许使用段超越前缀修改
  3. 指针:每执行一次指令,SI和DI会自动修改
  4. DF标志:控制字符串处理方向。DF=0递增,DF=1递减。STD使DF置1,CLD将DF清0
  5. 串长度:要处理的字符串长度放在CX寄存器
  1. REP:无条件重复(Repeat),常与(MOVS)连用,连续传送字符串。直到传送完毕,即CX=0为止
  2. REPE/REPZ:相等/结果为零则重复(Repeat while Equal/Zero),连续比较字符串。当两个字符串对应字符相等(ZF=1)和CX≠0时,则重复进行比较,直到ZF=0或CX=0为止
  3. REPNE/REPNZ :不相等/结果非零则重复Repeat while Not Equal/NotZero),常与(SCAS)连用,当结果非0(ZF=0)和CX≠0时,重复进行扫描,直到ZF=1或CX=0为止
    串指令使用方法

  1. 串传送指令MOVS
    • MOVS dest,src
    • dest用DS:SI, src用ES:DI
  2. 串比较指令CMPS
    • CMPS dest,src
    • CMPSB; SI+-1,DI+-1
    • CMPSW; SI+-2.DI+-2
  3. 串扫描指令SCAS
    • 将AL/AX的内容与目的串中的字符逐个进行比较,结果只影响标志位
  4. 串装入指令LODS
    • 从串中取一个元素送到累加器
    • 通常不加重复前缀
  5. 串存储指令STOS
    • 用于把一块存储区域填充成某一相同值
    • 允许前缀REP

控制转移类指令

1.转移指令

  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. 条件转移指令
    • 均为段内短转移
    • 目的地址=当前IP值+8位相对位移量
    • 直接标志转移指令
      直接标志转移指令
    • 间接标志转移
    • 指令应用通常放在比较指令CMP之后
    • 根据CX的内容来决定是否转移的转移指令 JCXZ label,若CX=0,则转移到label处执行。
      间接标志转移指令

2.循环控制指令

  1. loop循环指令
    • 控制执行一系列指令,每执行一次,CX自动减1
    • LOOP 短标号
  2. LOOPE/LOOPZ相等或结果为0时循环
    • LOOPE label或LOOPZ label
  3. LOOPNE/LOONZ不相等或结果不为零时循环
    • 同上

3.过程调用和返回指令

  1. 调用指令CALL
    • CALL sub;
    • sub为子程序入口,根据子程序入口寻址方式,子程序调用四类
    • 段内直接调用、段内间接调用、段间直接调用、段间间接调用
  2. 返回指令RET
    • 从栈中弹出返回地址,使程序返回主程序继续执行。

4. 中断指令

处理器控制指令

1.标志操作指令

  1. CF设置指令
    • CLC;CF为0
    • STC;CF为1
    • CMC;CF变反
  2. DF设置指令
    • CLD;DF为0(串操作指针移动方向,从低到高)
    • STD;DF取1
  3. IF设置指令
    • CLI; IF取0(进制INTR中断)
    • STI;IF取1

2.外部同步指令

  1. ESC换码指令
    • 用来实现8086对8087协处理器的控制
  2. WAIT等待指令
  3. LOCK封锁总线指令

3.停机指令和空操作指令

  1. HLT停机指令(halt)
    • CPU进入暂停状态,不进行任何操作。
    • 在RESET线上加复位信号、在NMI引脚出现中断请求信号、在允许中断的情况下在INTR引脚上出现中断请求信号,出现如上情况,才会脱离暂停状态
  2. NOP空操作或无操作指令
    • 单字节指令,执行需耗费3个时钟周期 ,但不进行任何操作。
by RolinShmily 转载请注明出处