Skip to content

Instantly share code, notes, and snippets.

@simonid
Last active April 28, 2023 08:28
Show Gist options
  • Save simonid/005e20c1ae60c8fba92b30b09b7bf201 to your computer and use it in GitHub Desktop.
Save simonid/005e20c1ae60c8fba92b30b09b7bf201 to your computer and use it in GitHub Desktop.
微机课程

微机程序解读

乘除法指令

乘法

将AX中的3位BCD数转换位二进制数存入字节变量SB

MOV CH,10
MOV CL,4
MOV SB,AL   ;暂存十位和个位
MOV AL,AH   ;百位存入AL中
MUL CH      ;百位*10 -> AX
MOV AH,SB
SHR AH,CL   ;取十位
ADD AL,AH   ;百位*10 + 十位 -> AL
MUL CH      ;(百位*10 + 十位) * 10 -> AX
AND SB,0FH  ;取个位
ADD SB,AL   ;(百位*10 + 十位) * 10 + 个位 -> SB

除法

将AL中的的8位无符号二进制数转换位BCD数放入AX(除10取余)

MOV AL,7DH
MOV CL,4
MOV BL,10
MOV AH,0  ;将8位二进制数扩展位16位
DIV BL    ;商->AL,余数->AH(个位数)
MOV BH,AH   ;个位暂存
MOV AH,0
DIV BL      ;商->AL,余数->AH(十位数)
SHL AH,CL
OR BH,AH    ;BCD数十位和个位合并
MOV AH,0
DIV BL      ;AH中余数位BCD数百位
MOV AL,BH   ;BCD数十位和个位送AL

BCD调整算法

BCD加法调整指令DAA和AAA

DAA:
将AL中的和调整位正确的压缩BCD数
调整规则:(AL&0FH) > 9或AF=1,则AL=AL+6;(AL&0F0H) > 90H或CF>1,则AL=AL+60H
注意:
1)该指令操作数只能是AL
2)对结果调整时要用到CF和AF两个标志位,所以调整指令应该紧跟BCD数加法指令
3)会影响标志

AAA:
将AL中的和调整位正确的非压缩BCD数送至AX
调整规则:(AL&0FH) > 9或AF=1,则(AL+6)&0FH -> AL,AH+1->AH;否则AL&0FH -> AL,AH不变

注意:
1)和DAA一样,也是只能用于AL
2)执行该指令前应该注意AH是否清0

MOV AL,35H ;'5'
ADD AL,39H ;'9',AL=6EH
MOV AH,0
AAA         ;AX=0104H
OR AX,3030H ;AX=3134H,即'14'

减法

DAS:
将AL中的差调整位正确的压缩BCD数
调整规则:(AL&0FH) > 9 或 AF=1,则AL-6;(AL&0F0H) > 90H 或 CF=1,则AL-60H
如:

MOV AX,5643H
SUB AL,AH ;AL=DEH,有借位
DASAL=78H,保持借位,即134-56

微机课程笔记

8086内部有哪些寄存器?主要作用

内部有14和16位寄存器,其中8个通用寄存器(4个数据寄存器AX、BX、CX、DX,4个变址寄存器SI、DI、SP、BP),4个段寄存器(CS、DS、ES、SS),2个控制寄存器(指令指针IP、微处理器状态字PSW)

DUP命令是什么?

10 DUP(1) 重复定义了10个字元素,初始值为1,占用10*2=20个字节。
5 DUP(?) 重复定义了5个字元素(其初始值实际为0),占用5*2=10个字节
因此总共占用30个字节

微型计算机包括哪几个组成部分

CPU、存储器、IO口以及系统总线

微处理器的地址总线为20位,它最大寻址空间?

2^20 = 1Mb

8086/8088的功能结构由哪两部分组成

总线接口单元BIU(负责与存储器、I/O端口进行数据传送)、执行部件EU(负责指令执行)

什么是总线周期?8086/8088的基本总线周期由几个时钟周期组成?

总线周期:BIU通过系统总线对存储器或IO端口进行一次读写操作的过程。一个基本总线周期由4个时钟周期(T1~T4)组成,当无法完成数据传输时需要插入Tw,插入Tw的多少取决于数据传输的快慢

复位信号RESET到来后,8086/8088 CPU内部状态有什么特征?系统从何处开始执行命令?

CS:FFFFH DS:0000H SS:0000H ES:0000H IP:0000H 指令队列空 FR:0000H 禁止中断。并且从地址FFFF0H开始执行指令(启动地址)

什么指令、机器、时钟周期

指令周期:取出并执行一条指令的时间
机器周期:又称CPU周期,从内存读取一条指令字的最短时间
时钟周期:通常成为节拍脉冲或T周期,处理操作最基本单位,即CPU主频

什么是总线和总线的分类

总线是计算机各设备间进行信息传输的通道。由数据总线、地址总线、控制总线组成

设SP=0040H,如果用进栈指令存入5个数据,则SP=?若又用出栈指令取出2个数据,则SP=?

存入5个数据需要占用10个字节,SP-10,所以SP=0040H-0AH=0036H
取出2个数据,让出4个字节,SP+4,所以SP=0036H+04H=003AH.

AX中有一个负数,欲求出其绝对值,若该数位补码,则用指令 NEG AX;若该数位原码,则用指令AND AX,7FFFH

8086/8088 CPU的最小最大模式

最小模式,MN/MX#引线接电平;最大模式,MN/MX#引线接电平

高速缓冲其是由读写时间与CPU同一数量级的双极型RAM组成的

8086/8088 CPU的状态标志寄存器中PF为1表示 指令执行后结果的低8位中1的个数位偶数

并行接口芯片8255A可以工作在方式0、方式1和方式2的端口只有PA

8086/8088微机系统中,CPU响应NMI请求时为非屏蔽中断

汇编语言程序中的变量和标号具有段属性、偏移属性和类型属性

8255A的工作方式

8255A的工作方式可以由CPU写一个工作方式选择控制字到8255A的控制寄存器来选择。其工作方式选择控制字的最高位D7(特征位)应该为1
方式0:基本输入输出方式,即无需联络就可以直接进行8255A与外设之间的数据输入或输出操作。A、B、C口的高4位和低4位均可设置位方式0.
方式1:选通输入输出方式,此时8255A的A口和B口与外设之间进行输入或输出操作时,需要C口的部分IO线提供联络信号,只有A口和B口可工作在方式1
方式2:选通双向输入输出方式,即同一端口的IO线既可以输入也可以输出,只有A口可工作于方式2.这种方式下需要C口的部分IO线提供联络信号

8086/8088 CPU中的指令指示器IP的值时逻辑地址中的偏移地址

微型计算机中应用的现代技术有告诉缓冲寄存器技术、流水线技术、虚拟寄存器技术

程序运行中,IP始终只想下一条所要执行的指令的偏移地址

访问IO端口时,AD0~AD7在第一个时钟周期出现地址信息

8086/8088系统的中断向量表 存放着中断处理程序的入口地址参数

对单片方式使用的8259A进行初始化时,必须放置的初始化命令为 ICW1、ICW2、ICW4

80386工作在实地址方式下,段寄存器中存放的是段基址;工作在保护方式下,段寄存器中存放的是段选择字

设8259A的ICW2被编程为28H,则接IR5的外设的中断类型号是什么?它的中断向量地址是多少?

28H=0010 1000B  取高5位00101  IR5取5=101
二者组合:0010 1101B=2DH
中断类型号:2DH
中断向量地址是:2DH*4=AA
                000AAH
                000ABH  偏移地址
                000ACH  
                000ADH  段地址

8259A使用

单片8259A使用:在IR0~IR7上输入中断请求(单片有8级请求),INT和INTA到CPU

8259A的命令字包括初始设定的初始化命令字ICW和操作过程中给出的操作命令字OCW

初始化命令字ICW包括ICW1~ICW4 4个命令字,用于设定8259A的工作方式、中断类型码等

操作命令字OCW是操作过程中给出的命令,初始设定结束后的 命令字都是OCW。

8086微处理器均有两条中断请求线:
NMI非屏蔽中断,INTR可屏蔽中断

可屏蔽中断

出现在INTR线上的中断请求,CPU是否响应要取决于标志位IF的状态:
若IF=1,则CPU响应,此时CPU处在开中断状态
而IF标志位的状态,可以用指令STI使其置位,即开中断;也可以用CLI指令使其复位,即关中断
注意:在系统复位后,标志位IF=0
另外,任一种中断被响应后,IF=0。所以,若允许中断嵌套,就必须在中断服务程序中用STI开中断

非屏蔽中断

优先级高于可屏蔽中断
出现在NMI线上的中断请求,不受标志位IF影响,在当前指令执行完以后,CPU就响应。NMI线上的中断请求信号是边沿触发的,它的出现是异步的,由内部把它锁存。要求NMI上的中断请求脉冲的有效宽度要大于2个时钟周期

中断简要概述

中断.PNG

以下是试卷高频题

简要概述8255A三种工作方式的区别

方式0:基本输入/输出方式
CPU与端口之间交换数据仅通过输入指令IN与输出指令OUT完成;没有固定的用于应答的联络信号;不提供任何“握手”信息;适合用于无条件传送和查询方式的接口电路中;适用于各种同步并行传送系统
端口A和端口B可自定义为输入端口或输出端口,端口C分成两个4位端口,它们可分别定义为输入或输出端口。CPU与3个端口交换数据可以直接由CPU执行IN和OUT指令完成。适用于各种同步并行传送系统中,如用于来连接简单的外设;如果3个端口均处于工作方式0,则有16种工作方式的组合

这种方式不需要任何选通信号,A口、B口以及C口的高4位和低4位都可以设定为输入或输出,作为输出口时,输出的数据均被锁存;作为输入口时,A口的数据能锁存,B口与C口的数据不能锁存

方式1:选通输入/输出方式
端口A或端口B仍作为数据的输入/输出口,但规定端口C的某些位作为控制或状态信息
适用于查询和中断方式的接口电路
方式1特点:
端口A、B可分别工作在方式1.端口C配合方式1工作

这种方式下,A口可由编程设定为输入口或输出口,C口的3为用来作为输入/输出操作的控制和同步信号;B口同样可由编程设定为输入口或输出口,C口的另外3位用来作为输入/输出操作的控制和同步信号。在方式1下A口和B口的输入数据或输出数据都能被锁存

方式2:带选通双相传送方式
方式2只适用于端口A,既能发送数据也能接收数据(双向总线IO),适用于与双向传输数据的外设,适用于查询和中断方式的接口电路

8086/8088对外部可屏蔽的中断的响应过程及中断过程

1.关中断
2.保留断点
3.给出中断处理程序入口地址,转入相应中断服务程序
4.保护现场
5.中断服务
6.恢复现场
7.中断返回

微处理器、微型计算机、微型计算机系统有什么联系与区别

微处理器只是一个中央处理器,由算术逻辑部件(ALU),累加器和通用寄存器组,程序计数器,时序和控制逻辑部件,内部总线等组成,微处理器不能构成独立工作的系统,也不能独立执行程序
微型计算机由CPU、存储器、IO接口电路和系统总线组成,具有计算功能,能独立执行程序,但不能显示或输出,仍然不能正常工作
以微型计算机位主体,配上外部输入/输出设备及系统软件就构成了微型计算机系统,可以正常工作

状态标志位

AF:辅助进位标志位。低4位向高4位有进位时为1
CF:进/借位标志位。最高位有进/借位时为1
OF:溢出标志位
ZF:零标志位。语段结果为0时ZF=1
PF:奇偶标志位。低8位中有偶数个1时为1
SF:符号标志位,运算结果最高位为1时,SF=1

在转移指令中用的最多的是CF、ZF。
除了AF外都有指令直接用作转移条件

补充状态标志位的例题

将十六进制数62A0H与下列各数相加,求出其结果及标志位CF、AF、SF、ZF、OF和PF的值:
(1) 1234H;(2) 4321H;(3) CFA0H;(4) 9D60H

题解:

以补码表示有符号数8位表达的整数范围是:+127~-128 16位表达的范围是:+32767~-32768

1) 74D4H CF=0 AF=0 SF=0 ZF=0 OF=0 PF=1
2) A5C1H CF=0 AF=0 SF=1 ZF=0 OF=1 PF=0
3) 3240H CF=1 AF=0 SF=0 ZF=0 OF=0 PF=0
4) 0000H CF=1 AF=0 SF=0 ZF=1 OF=0 PF=1

简单的16进制运算:

16位进制加减运算

3D25H - 05C3H = 3762H
 3D25
-05C3
5-3=2
2-C=2-12 = (16+2-12) = 6 (由于2-12不够减,所以向前借1 即16)
D-5=(13-1-5) = 7(13-1是因为2-12不够而被借走了一位)
3-0=3
结果为:3762H
用十进制时向前借1位就是借10,而在16进制里向前借1就是借16
 
3762H+05C3H =3D25H 
 3762
+05C3
2+3 = 5
6+12 = 18 = (18-16=2) =2(满16进1)
7+5=12+1=13=D
3+0=3
结果:3D25H
逢十六进一

控制标志位

TF:跟踪标志位(测试程序用),TF=1,程序单步工作
IF:中断允许标志位
DF:方向标志位。DF=1时串操作为减地址方式,DF=0为增地址方式

8086/8088微处理器的段寄存器存储的是 段基址的高16位

在寄存器寻址方式中,操作的数据在指令指定的寄存器中

如何判断存储芯片中地址线和数据线的位数

比如2K4的RAM芯片,2K是容量,根据计算规则 容量=2^n,n就是地址线的位数,这里算出来就是11位;4是一个存储单元的位数,也就是数据线的位数。构成16K8位的存储器需要168/(24)=16片相应芯片

如果一个堆栈从地址 2350H:0000H开始,它的最后一个字的偏移地址为 0100H,SP的内容为 0052H。

(1) 栈顶的物理地址是什么? 23552H ;
(2) 栈底的物理地址是什么? 23600H ;
(3) 存入数据 1234H 和5678H 后,SP 的内容是什么? 004EH 。

堆栈的最高地址叫栈顶,堆栈指示器SP总是指向栈顶。
栈顶地址=SS*10 + SP 
栈底地址=SS*10 + 偏移地址
8086CPU中堆栈存取必须以字位单位,存入数据1234H和5678H后,即两个字压入堆栈后,
SP内容:SP – 字数*2  ,SS的内容不变

CPU与外设进行数据交换主要有哪几种方式?

(1)程序直接控制方式:就是由用户进程直接控制内存或CPU和外围设备之间的信息传送。这种方式控制者都是用户进程。
(2)中断控制方式:被用来控制外围设备和内存与CPU之间的数据传送。这种方式要求CPU与设备(或控制器)之间有相应的中断请求线,而且在设备控制器的控制状态寄存器的相应的中断允许位。
(3)DMA方式:又称直接存取方式。其基本思想是在外围设备和内存之间开辟直接的数据交换通道。
(4)通道方式:与DMA方式相类似,也是一种以内存为中心,实现设备和内存直接交换数据的控制方式。与之不同的是,在DMA方式中数据传送方向、存放数据内存始址以及传送的数据块长度等都是由CPU控制,而在通道方式中这些都是由专管输入输出的硬件——通道来进行控制。

BCD数的调整

if(AL低四位>9 || AF=1) then  
    AL=AL+6;  
    AF=1;  
endif  
if(AL高四位>9 || CF=1) then  
    AL=AL+60H;  
    CF=1;  
endif  

汇编程序指令

MOV

注意:

  • 一个指令中,两操作数类型必须一致
  • 至少一个操作数的类型要明确,不能出现二义性
  • 代码段寄存器CS和立即数均不能作为目的操作数
  • 源操作数和目的操作数不能同时作为存储器操作数
  • 存储器操作数的类型由地址表达式的变量名确定
  • 立即数的类型不明确,不含变量名的地址表达式的类型也不明确。在立即数送存储器的指令中,若存储器操作数是不含变量名的地址表达式,则必须使用PTR来明确其中一个操作数类型

XCHG dest,source

数据交换指令

加减运算指令
注意:
两操作数需类型相同,不能同为存储器
加减法指令执行后的结果将影响状态标志

ADD dest,source

source + dest -> dest
结果送入目的地址,源地址内容不变

ADC dest,source

dest + source + CF -> dest

INC dest

dest + 1 -> dest
不影响CF
操作数只能为REG和MEM,类型要明确
demo:

INC CL 对
INC [SI] 错 类型不明确  -> INC BYTE PTR[SI]
INC 2000H 错,立即数没有类型

SUB dest,source

dest - source -> dest

SBB dest,source

dest - source - CF -> dest

DEC dest

dest -1 -> dest

CMP dest,source

dest - source
执行减操作,只影响标志,不影响操作。主要用来判断两数的大小

NEG dest

将操作数中的内容求补后再送入操作数
注意:

  • 单操作数指令,操作数只能是REG,MEM
  • 该指令是求补指令,不是求补码指令
  • 影响标志位,规律同减法

NOT dest

逐位求反送至操作数

AND、OR、XOR均将标志位CF和OF清0,对PF、SF、ZF的影响同加法

移位指令

SHR dest,source

demo:

AL=abcd
SHR AL,1;  AL=0abc CF=d

SAR dest,source

demo:

AL=abcd
SAR AL,1 ;AL=aabc CF=d

注明:
逻辑右移SHR一位,相当于对无符号数除以2运算;算术右移SAR一位,相当于符号数除以2

SHL/SAL是逻辑/算术左移,类似前面的SHR/SAR

ROR dest.source

demo:

AL=abcd
ROR AL,1 ;AL=dabc,CF=d

ROL类似

RCR dest,source

demo:

AL=abcdefg,CF=i,CL=4
RCR AL,CL  ;AL=fghiabcd,CF=e

RCL

demo:

AL=abcdefgh,CF=i
RCL AL,1 ;AL=bcdefghi.CF=a

系统功能调用

系统功能调用.PNG

1号功能调用 - 键入并显示一个字符

格式:

MOV AH,1
INT 21H

入口:无入口参数
出口:键入字符ASCII码值在AL

2号 - 显示器显示一个字符

demo:显示字符'B':

MOV AH,2
MOV DL,'B'
INT 21H

入口:输入字符的ASCII送DL
出口:无出口参数

9号 - 显示器显示字符串

格式:

MOV DX,待显示字符串的首偏移地址
MOV AH,9
INT 21H

入口:DS:DX置字符串首地址,字符串以'$'结尾
出口:无出口参数

10号 - 键入并显示字符串

格式:

MOV DX,数据区首偏移地址
MOV AH,10
INT 21H

入口:DS:DX置输入数据区首地址,第一单元置允许键入的字符数(含回车符) 出口:键入的实际字符数在第二单元中,键入的字符从第三单元开始存放

11号功能调用 - 检测键盘有无键入

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment