二进制与十六进制:四个一组直接相互转换
十进制与BCD码:一一对应直接相互转换
(xxxx xxxx)2=(xx)16
(xxxx xxxx)10=(xx)BCD
正数:[X]原=[X]补;[X]反=[X]原码按位取反
负数:最高位(符号位)不变的前提下
[X]反=[X]原码按位取反 ;[X]补=[X]反+1;[X]原=[[X]补]补
-1的补码数:二进制:全为1;十六进制:全为F
-128的补码数:二进制:1后全为0
有符号数(又叫:补码数):-2^(n-1) ~2^(n-1)-1
其中(n-1)的“-1”表示减去的是一位符号位
无符号数:
机器数字长 | 性质 | 范围 |
---|---|---|
字长为 8 位 | 补码数(有符号数) | -128 ~+127 |
8 位字长 | 无符号整数 | 0 ~255 |
16位字长 | 无符号整数 | 0~65535 |
计算:
①先全部转换为加法,[X]原=[[X]补]补
②列竖式进行加法运算
程序员判溢(看O/C ==1?):
③有符号数(补码数)看O标(只要有一个数是负数,整体就是有符号数)
11_0
00_1
④无符号看C标
标志 | 含义 |
---|---|
进位标志 C(Carry Flag) | 当结果的最高位(D15 或 D7)产生一个进位或借位,则 C=1 |
溢出标志 O(Overflow Flag) | 补码计算的符号位 001 或 110 时置为 1(加数与被加数的最高位相同,却与结 果的最高位相异,则将溢出标志置为 1) |
符号标志 S(Sign Flag) | 结果的最高位(D15 或 D7)为 1 |
零标志 Z(Zero Flag) | 若运算的结果为 0,则 Z=1 |
奇偶标志 P/偶标志位(Parity Flag) | 若运算的结果中,最低一个字节(低8位)中‘1’的个数为偶数,则 P=1 |
辅助进位标志 A(Auxitiary Flag) | 在操作时,由低半字节(D3)向高半字节(D4),有进位,则 A=1 |
字符 | ASCII码 |
---|---|
‘0’–‘9’ | 30H–39H |
’A’-‘F’ | 41H–46H |
回车符 | 0DH |
换行符 | 0AH |
计算机系统的硬件组成 | 存储器、运算器、控制器、输入设备和输出设备 |
---|---|
微处理器组成 | 运算器、控制器 |
五大部件之间传输信息的公共通道 | 总线 |
硬件:“三总线三模块”
1B(字节)=8b(位) |
---|
1KB=2^10B |
1MB=2^20B |
1GB=2^30B |
1TB=2^40B |
存储单元的二进制地址码,由CPU通过地址总线送入存储器的地址译码器的输入。
存储器的容量:2^n B
存储器的寻址范围:n个0 B----n个1 B
能知道 RAM ROM SRAM DRAM BIOS CACHE 等
⑴通用寄存器 AX BX CX DX SI DI BP SP
⑵段寄存器 CS DS ES SS
⑶指令指针寄存器 IP
逻辑段: | 段基址存放在…… | 偏移地址存放在…… |
---|---|---|
代码段 | CS(Code) | IP |
堆栈段 | SS(Stack) | SP |
数据段 | DS(Data) |
80X86三种工作模式:实模式、保护模式、虚拟86模式(考题原题,题三个空)
实模式特点:
①加电、复位之后, 486 自动工作在实模式,系统在 DOS 管理下
②在实模式下,486 只能访问第一个 1M 内存(00000H-FFFFH)
③存储管理部件对存储器只进行分段管理,没有分页功能,每一逻辑段的最大容量为 64K
④在实模式下, 段寄存器中存放段基址。
分段:段基址:偏移地址
间址寄存器 | 约定访问的逻辑段 |
---|---|
BP | 堆栈段 SS |
BX,SI,DI | 数据段 DS |
定义:
XXX PROC
…
RET
XXX ENDP
调用:
call XXX
RET
宏指令与子程序都可以简化程序设计,增强程序的可读性
- 子程序调用是由 CPU 完成的,宏指令调用是在汇编过程中由汇编程序完成的
- 子程序调用可以**减小目标程序的体积,**宏指令则不能
NOT:所有位置取反
AND:某些位置 0,其它位不变
OR:某些位置 1, 其它位不变
XOR:某些位置不变,其他取反
对比记忆:传送类指令(MOV)不会影响标志位
常量不会占用内存空间:EQU和==;而变量会:DB DW DD
AND BL,0H
XOR BL,BL
SHR/SHL BL,8
SUB BL,BL
MOV BL,0
即目标操作数不能是 CS 、IP:
MOV CS,AX (错)
MOV AX , [DX] ×
MOV AX , [AX] ×
MOV [BX] ,[BP] (错)
MOV [BP],100H (错)
INC [BX] (错)
BUF DB 12H,-1
MOV AX ,BUF(错)
寄存器寻址和用变量名直接寻址
①MOV
注意:
⑴立即数不能直接送段寄存器 MOV DS, 3000H ×
正确的方法:
MOV AX,3000H
MOV DS,AX
⑵ 源操作数是立即数,并且大小超过了目的操作数的大小
MOV AL,300 (错)(255以内)
⑶ 目标操作数不允许用立即数方式
MOV 2000H, AL ×
⑷ 不允许在两个段寄存器之间传送数据
MOV DS, ES ×
②PUSH / POP
进栈、出栈的操作数只能 16 或 32 位 (PUSH AH ×)
③MUL/ DIV
乘除的源操作数不能是立即数
MUL 12 (X)
④SHL/SAL/SHR/SAR ROL/ROR/RCL/ RCR
移位指令的移位次数只能是立即数或 CL 寄存器
SAL BX,CX(错)
.asm->.obj->.exe或.com
【功能号 01H】 等待键入一个字符(等待键入的 ASCII 码,请事先存在 AL 中)
【功能号 02H】 显示一个字符(待显字符的 ASCII 码,请事先存在 DL 中)
【功能号 09H】 显示字符串
【功能号 0AH】 等待键入字符串
【功能号 4CH】 返回 DOS
【功能号 00H】 读取键入的一个字符
【功能号 01H】 查询键盘缓冲区。
【功能号 00H】 设置屏幕显示方式
【功能号 0EH】显示一个字符。(等待显示的 ASCII 码,请事先存在 AL 中)
MOV AH,功能号
INT n
LOOP指令
CX寄存器值表示循环次数
.586 ;方式定义
DATA SEGMENT USE16 ;用段定义语句定义逻辑段,这里是定义数据段
…
MESG DB HELLO’,0DH,0AH,’$’ ;用伪指令定义数据
…
DATA ENDS
CODE SEGMENT USE16 ;用段定义语句定义逻辑段,这里是定义代码段
ASSUME CS:CODE,DS:DATA;说明段约定
MOV AX,DATA
MOV DS,AX
…
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END BEG ;汇编结束
地址总线,数据总线,控制总线
D(Data):数据
C(Code):指令
IOR非:I/O读命令
IN AL,80H
IOW非:I/O写命令
OUT 40H,AL
①储存芯片容量可表示为2^n *m位/片
例如:
4K*4=2^12 * 4
2K * 8位=2^11*8
8M*4bit=2^23 * 4
4KB=4K*8=2^12 *8
②多个小芯片扩展成大容量存储器问题:
2^n *m左边和左边约分,右边和右边约分
a>1且b>1 | 字位同时扩展 |
---|---|
a>1 | 字扩展 |
b>1 | 位扩展 |
存储器的容量:2^n B
存储器的寻址范围:n个0 B----n个1 B
作用:CPU与外设交换信息的中转站
功能:
IN AL,42H;进入AL寄存器的数据来自I/O端口
概念(重要):在接口电路中,能与CPU交换信息(使用IN,OUT)的寄存器。
分类(DSC):数据端口、状态端口、控制端口。
数据口:存放CPU向外设输出或外设输入的数据。
控制口:存放控制信息–控制接口电路、外设的工作。
状态口:存放状态信息–反映外设的状态。
注意:接口电路必须具有数据口。
查询方式:必须设置数据端口和状态端口
①I/O端口和存储单元统一编址(存储器映像方式)
②I/O端口和存储器分别使用两个地址空间,单独编址(I/O独立编址)
注意:PC系列机中采用独立编址;PC系列机I/O端口地址最多为2^10=1024个(A0~A9)
读-IN-关注从XXXH来
IN AL,端口地址
写-OUT-关注向XXXH去
OUT 端口地址,AL
读:
MOV DX,端口地址
IN AL,DX
写:
;MOV AL,'A'
MOV DX,端口地址
OUT DX,AL
注意:
× IN AL,[DX]
4种:无条件传送方式、查询方式、中断控制方式、DMA方式
DMA(Direct Memory Access)直接存储器存取
编程步骤:
①读状态端口
②读/写数据端口
RSCAN:MOV DX,200H
IN AL,DX
TEST AL,1000 0000H
JZ RSCAN
MOV DX,201H
IN AL,DX
D7=0,结果为0,Z=1,跳转
D7=1,结果!=0,Z=0,继续
I/O指令只能在端口和AL,AX,EAX之间交换信息
与操作,同时为1结果!=0
AND会改变寄存器的值,顾不适用
'x’或写其ASCII码形式XXH
DMA:利用硬件完成高速外设与系统 RAM 之间的信息交换
关键器件: DMA 控制器
优点 | 缺点 | |
---|---|---|
无条件传送方式 | 可以直接使用输入缓冲器或锁存器(可做简单的输出接口)与数据线相连,程序设计简单,硬件电路最简单 | 传送不能太频繁 (保证每次传送设备都处在就绪状态) |
查询方式 | 比无条件传送方式可靠 | 降低了CPU的工作效率,不具有实时性 |
中断控制方式 | 提高了CPU的工作效率,具备实时性, 可并行工作,不用反复查询外设的工作。 | 每次进行数据传输,都要 保存现场状态 (所以需要检测状态端口) |
DMA方式 | 完全用硬件实现在外设与内存间直接进 行数据交换,而不通过CPU间接交换(不需要软件)。响应时间快,数据传送速度快 | 硬件更复杂(DMA控制器) |
主程序被中止的地方,称为断点,也就是下一条指令所在的内存的地址
中断源:能够引发CPU中断的信息源。
可屏蔽中断类型 | 中断类型码 | 中断源 |
---|---|---|
日时钟中断 | 08H(改向/会调用一次INT 1CH) | 系统 8254 0#计数器,每 55ms 有一次中断请求 |
键盘中断 | 09H | |
用户中断 | 71H(改向/会调用一次INT 0AH) | 系统的 ISA 总线 B4 端子引入的中断请求信号 |
CPU有两个引脚(INTR和NMI)可以接收外部的中断请求信号:
INTR:interrupt
- 主8259A连接INTR管理可屏蔽中断
NMI:Non Maskable Interrupt
由输入到 INTR 引脚的中断请求信号引发的中断称为可屏蔽中断。
由输入到NMI引脚的中断请求信号引发的中断称为非屏蔽中断。
对于非屏蔽硬件中断请求,CPU内部会自动产生中断类型码;
对于可屏蔽硬件中断请求,当CPU处于开中断状态时,由8259A将相应的中断类型码送给CPU;
对于异常,中断类型码也是自动形成的;
对于INT n指令,中断类型码即为指令中给的n.
①服务程序所在代码段的段基址 (2字节)
②服务程序入口的偏移地址(2字节)
地址 | 该地址保存的内容 |
---|---|
4n | n 型服务程序入口地址的偏移地址 |
4n+1 | |
4n+2 | n 型服务程序入口地址的段基址 |
4n+3 |
解题图示:
中断向量表
段基址:偏移地址
- 中断类型码 * 4------>n*4
- 转化为2进制
中断类型码 转 逻辑地址 二进制左移两位 逻辑地址 转 中断类型码 二进制右移两位
- 开中断指令: STI(settle)------I标置1
- 功能:使F寄存器中的I标志置1,CPU处于开中断状态。即允许CPU响应来自引脚INTR的请求。
- 关中断指令: CLI(clear)------I标置0
- 使F寄存器中I标志置0,CPU处于关中断状态。
- 注意:STI,CLI只对可蔽中断(INTR)请求有效
- 软件中断指令INT n
- 无条件转向n型中断服务子程序.
- 中断返回指令IRET
依次从栈顶弹出 6 个字节的数据(元素:断口偏移地址,断口段基址,F寄存器的内容–>IP,CS,F), 分别赋给 IP 、CS 和 F 寄存器。
INT n和IRET(I return)这两条指令常常成对出现.
中断指令在中断程序设计中如何使用
主程序: ... BEG:MOV AX,DATA MOV DS,AX CLI ;关中断 CALL WRITE0A CALL I8259A SIT ;开中断 SCAN: MOV AH,1 INT 16H ;*4倍,移动到中断服务子程序所在代码段的段基址和偏移地址 JZ SCAN;把下面的信息为了继续执行保存在堆栈 MOV AH,4CH INT 21H ... 中断服务子程序: SERVICE PROC PUSH PUSH DS ... MOV AL,20H OUT 20H,AL POP DS POPA IRET;把堆栈的信息弹出来,继续执行JZ SCAN... SERVICE ENDP
断口偏移地址 IP 断口段基址 CS F寄存器的内容 FLAG
- 最先入栈的在下面
- 普通结束子程序:RET/中断服务子程序结束:IRET(中断服务子程序的编写涉及,其他都是普通子程序)
DMA>NMI>INTR
即可屏蔽中断级别最低。
INTR、NMI答题模版:
①有XXX请求,没有DMA请求(INTR再加一个:也没有非屏蔽中断请求)
②CPU 当前指令执行完毕。
③CPU处于XXX状态,I标=X。
由输入到 INTR 引脚的中断请求信号引发的中断称为可屏蔽中断。
CPU 响应可屏蔽中断(INTR)的条件:
①INTR 引脚有中断请求, NMI 引脚没有中断请求,系统没有 DMA 请求。
②CPU 当前指令执行完毕。
③CPU 处于开中断状态**(I 标=1)**
题目变形:
日时钟中断源向CPU提出中断申请,但CPU不响应,简述其原因。(反着回答)
当某一中断接到 ISA 总线的 B4 端子,而 CPU 没有响应该中断,请分析可能的原因有哪些?
若 INTR 引脚提出的一个中断请求没有被响应,试分析其原因。
①NMI 引脚有中断请求,系统没有 DMA 请求。
②CPU 当前指令执行完毕。
IRET 从栈顶弹出 6 个元素→ IP,CS,F
远程FAR RET,从栈顶弹出 4 个元素→ IP,CS
近程NEAR RET,从栈顶弹出 2 个元素→ IP
- 状态标志:有SF、ZF、PF、CF、AF、OF
- 控制标志:有DF、TF、IF
( 1)中断的引发方式不同
硬件中断 | CPU以外的设备发出的接到引脚INTR和NMI上的中断请求信号而引发的 |
---|---|
软件中断 | 由CPU执行INT n指令而引发的 |
(2)CPU 获取中断类型码的方式不同
可屏蔽硬件中断(INTR) | 由中断控制器8259A提供 |
---|---|
非屏蔽硬件中断(NMI) | CPU自动产生 |
软件中断 | 软件中断指令INT n本身提供 |
(3)СРU 响应的条件不同
可屏蔽硬件中断(INTR) | 可以被屏蔽 | 只有在CPU开中断时才响应 |
---|---|---|
非屏蔽硬件中断(NMI) | 不可以被屏蔽 | |
软件中断 | 不可以被屏蔽 |
(4)中断处理程序的结束方式不同
硬件可屏蔽中断服务程序中 | 中断处理结束后,首先要向8259A发出中断结束命令,然后执行IRET指令,中断返回。 |
---|---|
软件中断服务子程序中 | 中断处理结束后只需执行IRET指令。 |
(1)都会引起程序终止。
(2)CPU获得中断类型码n后,自动从4 * n ~ 4 * n+3单元取出该中断源的中断向量–>IP、CS,从而执行该中断源的中断服务程序。
①将 F 寄存器、CS 和 IP 的当前值压入堆栈
②CPU 从 4 * 21H—4*21H+3 单元中取出 21H 型中断向量写入 IP 、CS 中
③执行 21H 中断服务程序,完毕前从栈顶弹出两个分量到 IP 、CS 还包括 F 寄存器内容,返回断点
8259A内部结构
( 1)中断请求寄存器IRR(Interrupt Request Register),寄存中断请求引脚的中断请求信号
(2)中断屏蔽寄存器IMR(Interrupt Mask Register),用于开放和屏蔽某些中断
(3)中断服务寄存器ISR(Interrupt Service Register),用于记录当前 CPU 正在为哪些可屏蔽的中断(INTR)服务
(4)优先权电路,进行中断优先级判别
- 比较同时送达优先权电路的中断请求,哪一个级别最高
- 比较CPU正为之服务的中断源和刚进入优先权电路的中断源,哪一个级别更高
中断屏蔽寄存器口地址(奇地址) | 接收中断结束命令的寄存器口地址(偶地址) | |
---|---|---|
主8259A | 21H | 20H |
从8259A | 0A1H | 0A0H |
中断屏蔽寄存器(奇地址) | 1 |
---|---|
中断结束命令字(偶地址) | 0 |
CS非电平:0
CPU写<==>人写
WR非=0
RD非=1
中断类型码 | 中断源 | |
---|---|---|
日时钟中断 | 08H(INT 1CH) | 系统 8254 0#计数器,每 55ms 有一次中断请求 |
键盘中断 | 09H | |
用户中断 | 71H (改向INT 0AH) | 系统的 ISA 总线 B4 端子引入的中断请求信号 |
[ INT 21H 的 25H 子功能 ]
功能:写入 n 型中断向量
入口: DS=中断服务程序所在代码段的段基址
DX=中断服务程序入口的偏移地址
AL=中断类型码
I8259A PROC
PUSHA
PUSH DS
MOV AX,SEG SERVICE
MOV DS,AX
MOV DX,OFFSET SERVICE
MOV AL,0CH ;中断类型码
MOV AH,25H
INT 21H
POP DS
POPA
RET
I8259A ENDP
[ INT 21H 的 35H 子功能 ]
功能:读出 n 型中断向量
入口: AL=中断类型码
出口: ES:BX=n 型中断向量
MOV AL,0BH
MOV AH,35H
INT 21H
MOV PTR WORD STORE, BX
MOV PTR WORD STORE+2, ES
IN AL,21H
AND AL, 11111011B
OUT 21H,AL
IN AL ,0A1H
AND AL, 11111101B
OUT 0A1H,AL
① 若用户中断定义为 0AH 型(主) ,服务程序结束前只向主 8259A 送结束命令。
MOV AL,20H
OUT 20H,AL
②若用户中断定义为 71H 型(从) , 服务程序结束前,向主从 8259A 各送一中断结束命令 。
MOV AL,20H
OUT 20H,AL
OUT 0A0H,AL
答:(1) ①单工方式:只允许数据按照一个固定的方向传送。
? ②半双工方式:收发双方均具备接收和发送数据的能力,由于只有一条信道,数据不能在两个方向上同时传送。
? ③全双工方式:收发双发可以同时进行数据传送。
? (2). 半双工 和 双工
标准规定:逻辑“1”信号,电平在-15V~-3V之间;
? 逻辑“0”信号,电平在+3V~+15V之间;
- 跟数字电路相反,请注意!!!
内环自发自收不画线。
注:
TXD是 Transmint External Data ,向外部设备发送数据。(2) |
---|
RXD是Receive External Data,接收外部设备传来的数据。 (3) |
GND是 Ground 地 |
端子号、端子名称:
注意箭头方向都是TXD–>RXD(2–>3)。
GND没有箭头关系
人为将RS-232C接口芯片端子2和端子3用线连接起来。
(附录有)四部分:
起始位 | 1位 | ‘0’ |
---|---|---|
数据位 | 5~8位 | ‘0’或‘1’ |
奇偶校验位 | 0~1位(可有可无) | ‘0’或‘1’ |
停止位 | 1、1.5、2位 | ‘1’ |
奇校验 | 数据位与校验位中‘1’的个数为奇数 |
---|---|
偶校验 | 数据位与校验位中‘1’的个数为偶数 |
1.异步串行通信 01010001001传送的数据是?校验方式是?
0(起始位) 1010 0010 0 (8+1,先低后高) 1(停止位)
反着写:0100 0101B = 45H
2.已知接收波形的一帧数据(TTL电平),ASCII对应的字符?校验方式?
_ ‘ ’_ _ _ _ ‘ ’ ‘( ’–1 _ -0)(传送方向<——)
0 1100 001 1 1
100 0011B=43H
- 标准的ascii码是7位的
- 既然问了奇校验还是偶校验就说明有校验方式
- 给(+12V—— -12V)RS-232C标准,电平就反着来
3.告诉传输字符、校验方式以及停止位的位数。要求画图。
位置1:0/1、TTL电平、8250引脚(Sout/Sin)
位置2:+12V/-12V、RS232电平、RS232引脚(TXD/RXD)
翻转课堂错题:
通信速率(波特率):每秒钟传送的0、1代码(二进制位)个数(包括起始位、数据位、校验位、停止位),单位为“波特‘。
? 波特率/位数=每秒传送多少帧字符
传一帧字符的时间=1/?
数据端口:接收缓冲寄存器、发送保持寄存器;
状态端口:通信线路状态寄存器、 MODEM 状态寄存器、中断识别寄存器;
控制端口:通信线路控制寄存器、 MODEM 控制寄存器、中断允许寄存器、除数寄存器
接收线路状态中断;(接收数据错中断)
接收缓冲器满;(接收中断)
发送保持器空;(发送中断)
MODEM 状态中断;
都是移位寄存器
在这里插入图片描述
MOV DX,端口号
MOV AL,控制字
OUT DX,AL
其中X的顺序是:B98B9C
MOV DX,3FBH
MOV AL,80H
OUT DX,AL
MOV DX,3F9H
MOV AL,控制字
OUT DX,AL
MOV DX,3F8H
MOV AL,控制字
OUT DX,AL
MOV DX,3FBH
MOV AL,控制字
OUT DX,AL
MOV DX,3F9H
MOV AL,控制字
OUT DX,AL
MOV DX,3FCH
MOV AL,控制字
OUT DX,AL
其中第一个一定是80H
① 80H → 线路控制寄存器
② 通信速率 → 除数寄存器(分频系数位–>除数寄存器位,高对高,低对低)(分频系数是00XX H从题目中读)
- 除数寄存器高8位(3F9H/2F9H)-- 00H,低8位(3F8H/2F8H)-- XX H
- 9–>高,8–>低
③ 数据帧格式→线路控制寄存器
④ 设置中断允许寄存器
- 查询方式,则中断相应位 置 0,禁止中断
- 中断方式,使中断相应位 置 1,允许中断
⑤ 设置 MODEM 控制寄存器(通常设置为 0H(或 03H), 中断设置 D3 为 1, 内环自发自收设置 D4 为 1)
- 注:正常通信(外环自发自收):D4=0
- D3的位置别找错了 :0000 1000H
① 确定波特率—— 设置除数寄存器;
② 确定数据格式—— 设置通信线路控制寄存器;
③ 若使用中断方式—— 需设置中断允许寄存器的相应位(置“1”);
例题:A、B两台PC机进行单工通信,已知双方的通信速率被设定为2400波特(对应分频系数为0030H),一帧数据格式为7个数据位,2个停止位,无校验方式,A机 主串口 查询方式 发送,而B机利用中断方式从辅串口以同样的波特率接收数据。
(1)请为发送方(A机)编写一个8250初始化程序段。(当某个二进制位,取0或1都可以时,一律取值为0)
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;80H-->通信线路控制寄存器①
MOV DX,3F9H
MOV AL,00H ;分频系数为0030H的高8位--9
OUT DX,AL
MOV DX,3F8H
MOV AL,30H ;分频系数为0030H的低8位--8;通信速率-->除数寄存器②
OUT DX,AL
MOV DX,3FBH
MOV AL,控制字
OUT DX,AL ;数据帧格式-->通信线路控制寄存器③
MOV DX,3F9H
MOV AL,0000 00110B
OUT DX,AL;中断允许命令字④
MOV DX,3FCH
MOV AL,00H;除了中断D3=1,内环自发自收D4=1以外均为00H
OUT DX,AL;设置MODEM控制寄存器⑤
如果是子程序就要写子程序的结构。
(2)请为B机编写一个8250初始化程序段。(当某个二进制位,取0或1都可以时,一律取值为0)
MOV DX,2FBH
MOV AL,80H
OUT DX,AL ;80H-->通信线路控制寄存器①
MOV DX,2F9H
MOV AL,00H ;分频系数为0030H的高8位--9
OUT DX,AL
MOV DX,2F8H
MOV AL,30H ;分频系数为0030H的低8位--8;通信速率-->除数寄存器②
OUT DX,AL
MOV DX,2FBH
MOV AL,控制字
OUT DX,AL ;数据帧格式-->通信线路控制寄存器③
MOV DX,2F9H
MOV AL,0000 00001B;接收中断,D0设置为1
OUT DX,AL;中断允许命令字④
MOV DX,2FCH
MOV AL,0000 1000B;除了中断D3=1,内环自发自收D4=1以外均为00H
OUT DX,AL;设置MODEM控制寄存器⑤
- 如果是无联络线3线连接(全双工),收发双方采用的方式一起写入中断允许命令字。
- 如果是无联络线单工通信,看清题目要求的收还是发,不可以同时写。
如果是要求写子程序:
I8250 PROC
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;80H-->通信线路控制寄存器①
MOV DX,3F9H
MOV AL,00H ;分频系数为0030H的高8位--9
OUT DX,AL
MOV DX,3F8H
MOV AL,30H ;分频系数为0030H的低8位--8;通信速率-->除数寄存器②
OUT DX,AL
MOV DX,3FBH
MOV AL,控制字
OUT DX,AL ;数据帧格式-->通信线路控制寄存器③
MOV DX,3F9H
MOV AL,0000 00110B
OUT DX,AL;中断允许命令字④
MOV DX,3FCH
MOV AL,00H;除了中断D3=1,内环自发自收D4=1以外均为00H
OUT DX,AL;设置MODEM控制寄存器⑤
RET
I8250 ENDP
⑴中断允许寄存器相应位置 1 – 8250
⑵MODEM 控制寄存器 D3 = 1,即 OUT2 = 0 打通 8250 的中断请求通道。–8250
⑶8259 相应中断屏蔽位置 0 (主 8259 IR3 、 IR4)— 8259
⑷CPU 处于开中断(STI)— CPU
变形:某同学发现自己的串行通信程序不能正常运行,在跟踪调试自己编写的程序时,发现 CPU 始终不能进入接收中断服务程序,但经过老师的测试发现硬件一切正常,帧格式和波特率也正确,请帮助该同学分析他编写的程序出错的原因可能有哪些?
- 8250中断允许寄存器相应位 置1
- OUT2非=0
- 开放8259A的IR4中断屏蔽
- STI
编写程序正确,中断服务程序始终没被执行?
在发送数据前,读通信线状态寄存器(状态口)获取发送保持寄存器(数据口 D5)是否空闲;
在接收数据前,读通信线状态寄存器(状态口)获取接收缓冲寄存器(数据口 D0)是否已收到1帧数据。
①查询状态。只有当 D0=1 时, CPU 才能读数; 只有当 D5=1 时,CPU 才能写数据。
②发送接收字符。发送的字符 →发送保持寄存器 OR 接受缓冲寄存器 → 接受的字符
例1:编写程序段,利用主串口查询方式发送一个“B”
SCANT:MOV DX,3FDH
IN AL,DX
TEXT AL,0010 0000B
JZ SCANT
MOV DX,3F8H
MOV AL,'B'
OUT DX,AL
X X X X X X X X |
---|
0 0 1 0 0000 |
0 0 X 0 0000 |
例2:编写程序段,辅串口查询方式接收一个字符
SCANT:MOV DX,2FDH
IN AL,DX
TEXT AL,0000 0001B
JZ SCANT
MOV DX,2F8H
IN AL,DX
X x x x x x x x |
---|
0 0 0 0 0 0 0 1 |
0 0 0 0 0 0 0 x |
什么是端口?已芯片8255A为例,说明端口的分类。
在接口电路中,能与CPU交换信息的寄存器
数据端口:A口、B口、C口
控制端口:C口
状态端口:C口
- 作为数据口,可分为两个独立的4位口,(C上、C下)使用;
- 1方式和2方式时,C口的部分引脚作为A、B口的固定联络信号线
- 1方式和2方式时,C口作为状态口使用
- C口的引脚可以用按位置、复位命令进行按位控制。
包括(看附录):
- cs非=0
A1 A0 00(0) A 01(1) B 10(2) C 11(3) 控制
- 初始化操作:往控制口送控制字,A1A0=11
1.端口不固定,关注题目所给。
按照A\B\C\控制口的顺序。
2.给电路图,问A\B\C\控制口地址分别是多少?
例题1.
XX的位置00、01、10、11依次往下写,A\B\C\控制口–>60H—63H
例题2.计数器的端口地址分别是多少?
在这里插入图片描述
工作方式 | 工作方式的名称 | 适用于端口 … … |
---|---|---|
方式 0: | 基本型入/出 | A 口、B 口、C 口 |
方式 1: | 选通型入/出 | A 口、B 口 |
方式 2: | 双向传输 | A 口 |
A 口可工作在方式 0 、1、2。
B 口可工作在方式 0 、1。
C 口可工作在方式 0。
工作方式 | 怎么区分? |
---|---|
方式0 | 没有联络线 |
方式一 | 有联络线 STB非、ACK非、IBF、OBF非 |
8255A的接口电路如图,端口地址分别为:80H和83H
MOV AL,90H
OUT 83H,AL
IN AL,80H
SHR AL,4
NOT AL
OUT 81H,AL
A口的工作状态:0输入(没有联络线)
B口的工作状态:0输出
此电路可以实现什么功能?
用4个LED,L3~L0反应4个开关K3~K0的状态,相应开关合上则灯亮,断开则灯灭。
某外扩8255A连线如下图所示,分别判断ABC口的工作方式(看CS非的端口对应的是什么),以及是输入还是输出?
- A口:60H,方式0输入(没有联络线–方式0)(开关给‘0’、‘1’的输入信号)
- B口:61H,方式0输出(没有联络线–方式0)(显示结果‘亮’、‘灭’的输出结果)
- C口:62H,未使用
- 控制口:63H
初始化子程序:
I8255A PROC
MOV AL,1001 0000B
OUT 63H,AL
RET
I8255A ENDP
通过开关控制LED的亮灭:
IN AL,60H
NOT AL
MOV AL,63H
OUT DX,AL
例题3:
在这里插入图片描述
- A口:208H,方式1输入(没有联络线–方式0)(开关给‘0’、‘1’的输入信号)
- B口:209H,方式0输出(没有联络线–方式0)(显示结果‘亮’、‘灭’的输出结果)
- C口:20AH,未使用(注意,A口方式1输入时,PC3,PC4,PC5输入输出方向不受编程控制(可以查附录),因此编程直接置0,认为是无关项)
- 控制口:20BH
工作方式 | 工作方式的名称 | 适用于端口 … … | |
---|---|---|---|
方式 0: | 基本型入/出 | A 口、B 口、C 口 | 无条件传送 |
方式 1: | 选通型入/出 | A 口、B 口 | 查询or中断 |
方式 2: | 双向传输 | A 口 | 查询or中断 |
数据口工作在方式0时,CPU采用无条件传送方式
数据口工作在方式1、2时,CPU用(1)查询方式(2)中断方式
考点
(1)查询方式
方式1(选通行)查询的联络线问题
选通型输入:
IBF(Input Bufffer Full)输入缓冲器满
STB非(Strobe)选通信号输入
选通型输出:
OBF非(Output Buffer Full)输出缓冲器满
ACK非(Acknowledge)确认应答
方式1输出,查询OBF非=1时(表示输出缓冲器空),表示CPU可以用OUT指令向A或B口写数据以送给外设。
方式1输入,查询IBF=1时(表示输入缓冲器满),表示CPU可以继续用IN指令从A或B口读入外设送来的数据。
无论是输入还是输出,都查询连接与门引脚的线的端口,只有等于1时,才可以输入或者输出
(2)中断方式:
- 中断看虚线对齐的,未连线的端口,与门输出的端口作为中断请求信号线。
①方式选择命令字→控制口
②工作在方式 1、2 时(方式 0 不需要):允许中断(或禁止中断==>查询方式)的命令字→控制口
- 步骤 1 是肯定需要的,步骤 2 可能需要重复 n 次(n=0,1,2)
MOV AL,控制字
OUT 控制口,AL
MOV DX,控制口
MOV AL,控制字
OUT DX,AL
D0=0 | 查询 |
---|---|
D0=1 | 中断 |
MOV DX,控制口
IN AL,控制字
OUT DX,AL
MOV AL,控制字
OUT DX,AL
MOV DX,控制口
IN AL,DX
IN AL,控制口
送了1次0AH,送了两次71H?
1-0变换NOT AL
移位B0–B3—>B4–B7 SAL AL,4
计算机系统中采用可编程定时/计数器I8253和I8254.
一片8254芯片有4个端口:1个控制口,3个数据口(计数器)。
8254内部集成了3个16位的计数器,每个计数器有6种工作方式(0~5),两种启动方式(软件启动和硬件启动)计数初值可设置为二进制或BCD码(十进制)。最高工作频率10兆。
计数器:每个计数器对外有3条信号线:
- GATE~控制信号
- CLK~计数脉冲输入
- OUT~计数器输出
内部数据线:图一的橘色部分
1.初始化编程时:计数初值–》计数初值寄存器–〉减1计数器
当GATE=1时,开始计数,计数器不断减1,当计数值减到0(或某个值由工作方式确定)时,OUT有输出。
2.收到锁存命令后:当前计数值–》计数值锁存器(以便读出检查),而计数器仍然做减1计数。
计数器 0 | 用于定时(约 55ms)日时钟中断。 |
---|---|
计数器 1 | 用于动态存储器刷新定时。 |
计数器 2 | 用于为音箱系统产生方波送至扬声器。 |
每个计数器有6种工作方式,均在CLK下降沿计数一次。
主要区别:输出波形不同
端口地址
计数初值 N
N=fclk/fout=Tout/Tclk
f=1/T
1K=10^3 |
---|
1M=10^6 |
1G=10^9 |
6种工作方式:0~5
2种启动方式:软件启动(其他)和硬件启动(1、5)
输出的正负脉冲比N-1:1
N=偶数时,输出1:1连续波形
N=奇数时,正负脉冲比N+1:N-1
装入的及重新装入的初值均为写入的初值减1
①初始化编程
②读取计数值
①向控制寄存器写入方式控制字
目的:选择一个计数器,并确定其工作方式和计数值(计数初值)的读/写顺序。
②向选择的计数器写入计数初值。