微型计算机原理与接口技术
参考:慕课
计算机基础
详解
- 存储器是计算机系统的记忆设备,主存储器主要用来( 存储指令和数据 )。
80X86微处理器
详解
指令系统
详解
- 思维导图
详情见: https://www.kdocs.cn/view/l/cs12jJSDepuL?from=pwa
基本集指令见:https://www.kdocs.cn/view/l/ckGgA7aHPh5D?from=pwa
- 实模式下,CPU要执行的下一条指令的逻辑地址分别存放在( CS:IP )寄存器中。
- 一个单元的偏移地址是该单元第一个存储单元的地址。
- 内存操作数寻址的存储单元内容进行改变除了变量名直接寻址的都要用PTR进行申明类型属性。
- MOV AL,[DI+SI]中,[DI+SI]为变址+变址,不合法
- 堆栈通常是在内存中的堆栈段(Stack Segment)中实现的
- 寻址堆栈:SS: SP/BP
- BUF+1是从BUF中的第二个字节地址里面的内容开始访问
- 将BUF内存单元的偏移地址传送到BX中,有两种:
- MOV BX, OFFSET BUF
- LEA BX,BUF
- 堆栈:像盖房子一样,PUSH,POP最少2字节,即SP最少+2或减2浮动,SP始终指向最后进的的数的低位,并且与存储单元存储数据一样,也是低位进低地址,高位进高地址,只是后进的数地址更低,而存储单元存数据是后进的数地址越高
- MOV指令默认复制的是一个字节(即8位),要想复制16位,要写成MOV WORD PTR…,…
- 80x86微处理器的标志寄存器中,和串指令相关的的标志位是(DF)
- REPE (Repeat while Equal):指令前缀,表示在CX寄存器中的计数器不为零并且比较相等时,将重复执行操作
- CMPSB (Compare String Byte):比较字符串操作指令,用于比较DS:SI和ES:DI指向的连续字节数据。在执行指令之前,需要将ES和DI设置为目标字符串的起始地址,DS和SI设置为源字符串的起始地址。比较时,将逐个字节地比较两个字符串中对应位置的字节,直到两个字节不相等或者CX为零为止。如果比较过程中发现不相等的字节,则ZF标志位将被清零,否则ZF标志位将被设置为1。在发现不相等的字节时,SI指向的地址还会+1
- ? — 随机数, Dup ~ Duplicate(重复)
- 3 Dup(?) 代表3个用逗号间隔的随机数
- 5 Dup (‘A’) 代表5个用逗号间隔的A的ASC∏码
汇编语言程序设计
详解
- CPU执行的是链接程序后生成的可执行文件中的机器指令(目标指令)(一串0,1代码)
- CPU内部有一个指令集架构(Instruction Set Architecture,ISA),用于定义CPU所支持的指令集,包括基本指令集和扩展指令集
- MOVE AX,DATA MOVE DS,AX中 ,MOVE是基本指令集,在CPU中执行时,DATA变成了立即数,所以不能直接写成MOVE DS,DATA
也可以理解成:段寄存器的赋值必须通过通用寄存器 - 立即数不能直接赋给段寄存器:
由于立即数直接写入段寄存器这样的指令,被翻译成机器码之后将占用更多的字节,在事先规定的指令长度范围内无法存贮下这么多的内容,因此改由先写入通用寄存器,再由通用寄存器写入段寄存器的办法代替。立即数实际上是相当占地方的。 - DOS中的01H功能调用,键入字符后,AL接收的是该字符的ASCLL码,并且每进行一次调用,AL内的值都会刷新
- DOS中的0AH功能调用,键入一段字符并按回车后,缓冲区从BUF+2开始为键入字符串的实际存储区域,其最后有回车键的ASCLL码(0DH)
- CS段寄存器程序员是不能赋值的
- 要在屏幕上显示一彩色字符串,可以调用的是(BIOS INT 10H的13H号)功能调用
- MOV AH,0EH
INT 10H
在屏幕中显示DL寄存器内的数,并以二进制格式呈现 - 在汇编语言中,用于定义变量、内存空间分配的是(伪指令)
- CPU执行近过程RET指令,从堆栈中弹出(2)个字节:RET指令用栈的数据修改IP的值,从而实现近转移,相当于POP IP
- 宏指令必须先定义,后调用;而子程序则可以先调用,后定义
- JG是有符号数的比较,G是Greater
汇编程序
顺序程序设计
- 从键盘输入一个字符并存储到字节变量BUF单元中
- 分析:
用DOS功能调用完成键入,输入的字符保存在AL寄存器中
将AL中的内容存到定义在数据段的变量BUF所指单元中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16.486
DATA SEGMENT USE16
BUF DB ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS : CODE , DS : DATA
BEG: MOV AX , DATA
MOV DS , AX
MOV AH , 1
INT 21H ;AL=键入字符的
MOV BUF , AL ASCII码
MOV AH , 4CH
INT 21H
CODE ENDS
END BEG
- 分析:
简单分支
将BX寄存器的内容以二进制数格式显在屏幕上
- 流程图:
- 源程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16· 486
CODE SEGMENT USE16
ASSUME CS:CODE
BEG: MOV BX,5678H
MOV CX,16
LAST: MOV DL,’0’
ROL BX,1
JNC NEXT
MOV DL,’1’
NEXT: MOV AH,2H
INT 21H
LOOP LAST
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
循环程序设计
假设从BUF单元开始为一个字符串ASCII码,找出其中的最大数送屏幕显示
- 流程图:
- 源程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31· 486
DATA SEGMENT USE16
BUF DB 'QWERTYUIOP123'
COUNT EQU $ -BUF;统计串长度
MAX DB 'MAX=',?,0DH,0AH,'$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV AL,0
;无符号最小数 0 →AL
LEA BX,BUF
;串首址偏移量→BX
MOV CX,COUNT
;串长度→CX
LAST: CMP [BX],AL;比较
JC NEXT
MOV AL,[BX];大数→AL
NEXT: INC BX
LOOP LAST ;循环计数
MOV MAX+4,AL
;最大数→MAX+4 单元
MOV AH,9
MOV DX,OFFSET MAX
INT 21H ;显示结果
MOV AH,4CH
INT 21H ;返回 DOS
CODE ENDS
END BEG
总线
详解
存储器系统
详解
- 有若干片1K×8位的SRAM芯片,采用字扩展方法构成4KB存储器,问:需要(4)片SRAM,寻址该存储器需要(12)根地址线,参与片选的地址位至少需要 (2)位。
- 现有16K×1位的静态RAM芯片,欲组成128K×8位的存储器,需要(64)片这样的静态RAM芯片,需组成(8)个芯片组,这属于(字位同时)(字、位或者字位同时)扩展,用于片内地址选择的地址线(14)根,至少需用(3)根地址线进行译码来实现不同芯片组的选择。
- 设机器字长32位,存储容量1GB,若按字节寻址,则至少需要(30)根地址线
- 机器字长:CPU一次能处理数据的位数,通常与CPU的寄存器的位数有关
- 存储字长:存储单元的位数
- 存储容量=字数(n根地址线,字数为)x存储字长
- 按字节寻址,说明存储字长为1Byte
输入/输出系统
详解
详情见 :https://www.kdocs.cn/view/l/cdhAdAdsq690?from=docs
- 系统总线中地址线的功能是(
指定主存和I/O设备接口电路的地址
)
中断系统与 8259A 中断控制器
详解
- n型中断向量在系统RAM中存放在4n~4n+3单元
nH(16进制)型中断向量在系统RAM中存放,nH×4将nH转成二进制数再左移两位 - 在中断响应周期,8259A向CPU提供相应的中断类型码(n),CPU根据中断类型码自动到中断向量表中取相应的中断向量(地址)
- 根据中断源的不同,中断可以分为外部中断和内部中断两大类
实模式下的定时中断程序设计
- 中断源是系统8254的0#计数器,但定时周期≠55ms的整数倍,重新对8254 0#计数器进行初始化
- 流程图:
- 每隔xms产生一次中断:若计数器脉冲周期为1ms,计数器应工作在方式3,计数初值=2x,OUT0=周期为2xms的方波信号(1:1连续波形)(因为OUT0接8269A的IRi,为1时表示有了中断请求信号)
- 流程图:
- 采用系统自带的8259A的日时钟中断请求,定义外扩中断1CH服务程序,保护现场(要压栈DS),因为在日时钟中断处理中将40H赋给了DS
这个1CH型中断是嵌套在8H型中断里的,对其进行改变,要保护8H型中断内容
微机系统串行通信
详解
详情见:https://kdocs.cn/l/clw0Ao47o5nI
实验
- 题目:编写程序对微机系统的串口进行自发自收外环测试;发送采用查询方式,接收采用中断方式,数据发送从键盘键入,接受数据屏幕显示
- 分析:
- 外环自发自收:把串行口的2端子与3端子连接(实验室已连接好,且用的辅串口)
- 发送采用查询方式,数据发送从键盘输入:
设置FLAG变量(初值为0),在主程序中检测FLAG为1(在中断中更改,说明接收到结束字符#(23H)),则结束中断,主程序结束
查询键盘缓冲区与通信线状态寄存器,当键盘缓冲区有内容时(可使用16H软中断的1号子功能),读取出键盘缓冲区ASCLL码(可使用16H软中断的0号子功能)
查询通信线状态寄存器(2FDH)的D5位,若为1,发送保持寄存器空闲,可将键盘缓冲区数据送入发送保持寄存器
查询通信线状态寄存器(2FDH)的D6位,若为1,发送移位寄存器空闲,表明一帧数据已发送,在数据全部输入完使用,保证数据全部发送 - 接收采用中断方式,接受数据屏幕显示:
开放主8259的辅串口(中断类型码为0BH,引脚IR3)
进入中断服务子程序后读取接收缓冲寄存器内容,若不是‘#’,则在屏幕中显示;若为‘#’,则FLAG变量置1
知识点梳理:
- 8250初始化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25I8250 PROC
MOV DX, 2FBH
MOV AL, 80H
OUT DX, AL ;寻址位置1,访问除数寄存器
MOV DX, 2F9H
MOV AL, 0
OUT DX, AL ;写除数寄存器低8位
MOV DX, 2F8H
MOV AL, 30H
OUT DX, AL ;写除数寄存器低8位
MOV DX, 2FBH
MOV AL, 03H
OUT DX, AL ;写数据帧格式,寻址位置0
MOV DX, 2F9H
MOV AL, 01H
OUT DX, AL ;中断允许寄存器,D0=1,允许接收中断
MOV DX, 2FCH
MOV AL, 0BH
OUT DX, AL
RET ;MODEM控制寄存器,D3=1(D1,D0任意)能送出中断请求
I8250 ENDP - 8259A初始化
1
2
3
4
5
6I8259 PROC
IN AL,21H ;读取主8259中断屏蔽寄存器
AND AL,11110111B ;开放IR3引脚中断请求
OUT 21H,AL
RET
I8259 ENDP
- 8250初始化:
程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134.486
DATA SEGMENT USE16
OLD0B DD ? ;保存原0BH中断向量的地址
FLAG DB 0
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS, AX
CLI
CALL I8250
CALL I8259
CALL RD0B
CALL WR0B
STI
SCANT:CMP FLAG,1
JZ RETURN
MOV AH,1
INT 16H
JZ SCANT
MOV DX,2FDH
IN AL,DX
TEST AL,20H
JZ SCANT
MOV AH,0
INT 16H
AND AL,7FH
MOV DX,2F8H
OUT DX,AL
JMP SCANT
TWA: MOV DX,2FDH
IN AL,DX
TEST AL,40H
JZ TWA
RETURN: CALL RESET
MOV AH,4CH
INT 21H
RECEIVE PROC ;中断服务子程序
PUSH AX
PUSH DX
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV DX,2F8H
IN AL,DX
AND AL,7FH
CMP AL,23H
JZ NEXT
MOV AH,2
MOV DL,AL
INT 21H
JMP EXIT
NEXT: MOV FLAG,1
EXIT: MOV AL,20H
OUT 20H,AL ;将中断结束命令字(20H)写入主8259接收中断结束命令的寄存器(口地址20H)
POP DS
POP DX
POP AX
IRET
RECEIVE ENDP
I8250 PROC
MOV DX, 2FBH
MOV AL, 80H
OUT DX, AL
MOV DX, 2F9H
MOV AL, 0
OUT DX, AL
MOV DX, 2F8H
MOV AL, 30H
OUT DX, AL
MOV DX, 2FBH
MOV AL, 03H
OUT DX, AL
MOV DX, 2F9H
MOV AL, 01H
OUT DX, AL
MOV DX, 2FCH
MOV AL, 0BH
OUT DX, AL
RET
I8250 ENDP
I8259 PROC
IN AL,21H
AND AL,11110111B
OUT 21H,AL
RET
I8259 ENDP
RD0B PROC ;保存0BH中断向量中原地址
MOV AX,350BH
INT 21H
MOV WORD PTR OLD0B,BX
MOV WORD PTR OLD0B+2,ES
RET
RD0B ENDP
WR0B PROC ;在0BH中断向量中写入新的地址
PUSH DS
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET RECEIVE
MOV AX,250BH
INT 21H
POP DS
RET
WR0B ENDP
RESET PROC
IN AL,21H
OR AL,00001000B
OUT 21H,AL ;屏蔽IR3引脚中断请求
MOV AX,250BH ;恢复中断向量
MOV DX,WORD PTR OLD0B
MOV DS,WORD PTR OLD0B+2
INT 21H
RET
RESET ENDP
CODE ENDS
END BEG
小结
- 在Intel 8250芯片中,实现
并行
数据转换为串行
的是发送器
,实现串行
数据转换为并行
的是接收器
- 电平转换电路:用于将不同电平的信号转换为串口芯片所能接受的电平信号
要测试电平转换电路是否正常工作,需要使用外部测试设备或者信号发生器,因此不能使用8250的内环自检方式检测电平转换电路是否正常工作
- 已知主机A和B间主串口以单工方式进行异步串行通信,不需要使用联络线,则A、B间的通信至少需要
2
条连线
一条传输数据的单向通道(连TXD与RXD),一条地线(GND)
并行接口芯片8255A
可编程定时器/计数器
详解
详情见:https://www.kdocs.cn/view/l/cdapOAxskqT0?from=docs
- 8254计时器标注的A1,A0可以连接I/O口地址(A9~A0的任意两个),一般连A1,A0,这样口地址是连续的
- 8254计数器先减1再判断是否为0
- 计数初值二进制表示0~FFFFH实际表示1~10000H
- 计数初值用BCD码表示0~9999实际表示1~10000
- 4000H,看方式控制字的D0位
- D0=1,用BCD码表示,为4000
- D0=0,用二进制表示,为16384
- 将8254的0号计数器与1号计数器级联,两者均工作在方式3,计数初值均采用BCD码,设第一个计数器的时钟频率为2MHz,则级联后输出方波的最大周期为
50秒
- 两个计数器级联,表明第一个计数器输出作为第二个计数器输入,要想级联后输出方波周期最大,则第一个计数器的输出方波周期最大
- 输出方波周期最大,即输出频率最小,计数初值最大,而计数初值均采用BCD码,最大为0(即10000),因此第一个计数器的输出频率最小为200Hz
- 第二个计数器的输出频率最小为1/50Hz,即最大周期为50s