软件部分
实验一 8086 汇编程序的一般结构和上机过程
实验目的: 熟悉 8086 汇编语言源程序的一般结构, 掌握汇编程序的上机过程。
实验内容: 1. 通过程序设计的实例, 熟悉8086汇编语言源程序的一般结构。
2. 通过实际操作,
掌握 8086 汇编程序的上机过程。
欲进行 8086 汇编语言实验, 计算机 C:盘 \asm 目录下应有下列文件:
ed.com
全屏幕编辑程序
masm.exe 宏汇编程序
link.exe 连接程序
debug.com
调试程序
下面以建立和执行用户程序 abc.exe 为例, 来说明 8086 汇编语言源程序的一般结构和上机过程。
一.
8086 汇编语言源程序的一般结构
源程序 abc.asm 是为解决下面的具体问题而设计的: 有一段内存, 所存数据为 -1、2、-3、4、-5、6、-7、8、-9、12、-30、0ah、-0ch、6, 要求统计这个数据段中负元素的个数。
abc.asm
设计如下:
data
segment (数据段开始)
d1 db
-1,2,-3,4,-5,6,-7,8,-9,12,-30,0ah,-0ch,6
count
equ $-d1
rs dw ?
data
ends
(数据段结束)
stack
segment para stack 'stack' (堆栈段开始)
sd db
100 dup(?)
stack
ends
(堆栈段结束)
code
segment (代码段开始)
assume
cs:code,ds:data (说明语句)
start
proc far (start 过程开始)
push ds (此三条指令将 ds 和 0 进栈, 保留返回地址。 .exe 文
mov
ax,0 件装入后, 自动设置 ds 指向程序段前缀, 此前缀的开
push ax 始处是一条中断指令 int 20h。)
mov ax,data
mov ds,ax (ds 初始化)
mov bx,offset
d1
mov
cx,count
mov
dx,0
loop1:mov
ax,[bx]
cmp
ax,0
jge jus
inc dx
jus:inc
bx
loop
loop1
mov
rs,dx
ret (执行 ret,可自动将ds 和0 出栈到cs 和ip,正好执行 int 20h 指令, 退出当前程序,
返回 dos。)
start
endp
(start 过程结束)
code
ends
(代码段结束)
end
start
(程序结束)
程序说明:
1. 带符号数中, 最高位(符号位) 为 1 的数为负数。
2. 本程序建立了数据段、堆栈段和代码段, 使用了循环程序的设计方法。
3. 原始数据存放在d1开始的单元中, 统计出的负元素个数存放在rs中。
二.
8086 汇编程序的上机过程
源程序设计出来以后, 还需要在计算机上实现。
上机过程如下:
ed
abc.asm (编辑源程序abc.asm
)
masm abc; (对 abc.asm 进行汇编。若通过, 则产生 abc.obj 浮动码文件)
N
汇编通过?
Y
link abc; (对 abc.obj进行连接。若通过, 则产生 abc.exe 执行文件)
N
连接通过?
Y
debug abc.exe(调试 abc.exe)
abc (执行 abc.exe)
实验二 调试程序
debug
实验目的: 掌握调试程序 debug 的使用方法。
实验内容: 通过对两个汇编程序进行各种调试和检测, 掌握调试程序debug 的使用方法。
调试程序 debug.com, 可对用户程序进行各种检测调试, 帮助用户进一步发现程序设计中的错误和不足。现以两个实例来说明 debug 程序中主要命令的使用方法。debug 状态下显示的和输入的数据均为 16 进制数。
实例一: 在 debug 状态下用 a 命令建立、汇编一段小程序, 将一段内存单元中的数据复制到另一段内存中。然后对该程序进行各种检测和调试。
a:>debug
(进入 debug 程序)
-a (a 为汇编命令, 可修改、增补程序, 或编写程序。这里是编写程序。)
****:0100
db 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f (定义数据段)
****:0110
mov si,0100 (串操作源地址定为 ****:0100)
****:0113
mov di,0200 (串操作目标地址定为 ****:0200)
****:0116
mov cx,10 (循环次数定为 10h)
****:0119 rep movsb (将源地址开始的10h个单中的数复制到目标
地址开始的 10h 个单元中)
****:011B
int 3 (返回 debug 状态)
****:011C
-d ****:0100 (d 为内存单元数据显示命令。这里是检查源地址开始的10h个单
元中的数)
****:0100 00 01 02 03 04 05 06 07-08 09 0A 0B 0C
0D 0E 0F ...
...
...
... ...
...
...
-g=****:0110
(g 为运行命令。这里是从
****:0110 地址开始运行程序)
AX=0000
BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0110 DI=0210
DS=****
ES=**** SS=**** CS=**** IP=011B NV
UP EI PL NZ NA
****:011B
CC
INT 3
-d
****:0200 (检查目标地址开始的 10h 个单元中的数)
****:0200 00 01 02 03 04 05 06 07-08 09 0A 0B 0C
0D 0E 0F ...
...
...
...
...
...
...
-a
****:0113
****:0113
mov di,0300 (将目标地址改为 ****:0300)
****:0116
-g=****:0110
(再运行该段程序)
AX=0000
BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0110 DI=0310
DS=****
ES=**** SS=**** CS=**** IP=011B NV
UP EI PL NZ NA
****:011B
CC
INT 3
-d
****:0300 (检查新目标地址开始的 10h 个单元中的数)
****:0300 00 01 02 03 04 05 06 07-08 09 0A 0B 0C
0D 0E 0F ...
...
...
...
...
...
...
-e
****:0100 (e 为修改内存单元内容命令。这里是改写源地址开始的 10h个单元中的数)
****:0100 00.f 01.e 02.d 03.c 04.b 05.a 06.9 07.8
****:0108 08.7 09.6 0A.5 0B.4 0C.3 0D.2 0E.1 0F.0
-g=****:0110
(再运行该段程序)
AX=0000
BX=0000 CX=0000 DX=0000 SP=FFEE
P=0000 SI=0110 DI=0310
DS=****
ES=**** SS=**** CS=**** IP=011B NV
UP EI PL NZ NA
****:011B
CC
INT 3
-d ****:0300
(检查新目标地址开始的10h 个单元中的数据)
****:0300 0F 0E 0D 0C 0B 0A 09 08-07 06 05 04 03
02 01 00 ...
...
...
...
...
...
...
若要把调试中的数据存盘, 可先用 n 命令指定文件名, 再用 w命令将指定长度和起始地址的数据存入指定文件。具体操作为:
-n aaa (n 是命名命令, 用此命令指定了文件后, 才能用 l 命令调文件或用w 命令写文件。这里是在当前盘当前路径下指定了文件 aaa)
-r cx
(r 是显示/修改寄存器内容命令, 能显示 cpu 内部所有寄存器的内容和全部标志位的状态, 也能显示和修改某个指定寄存器的内容, 也能显示和修改所有标志位的状态。这里是改写 cx 的值)
cx 0000
:001c (将要存盘的字节数 1ch 写入 cx)
-w
****:0100 (w 是写命令。这里是将从地址 ****:0100 开始的 1ch 个字崐
节的数据存入文件 aaa 中)
Write
001c bytes
-q (退出 debug)
实例二: 对 abc.exe 程序进行检测、调试。有两种方法将 abc.exe 程序调入 debug。
方法一: debug abc.exe
方法二: debug
-n abc.exe (指定文件 abc.exe)
-l (l 是调入命令, 将 n 命令指定的文件调入 debug。)
用其中一种方法将 abc.exe 调入debug 后, 继续操作如下:
-u (u 是反汇编命令, 可将目标程序反汇编为源程序。这里是从当前地址
****:0000=cs:ip 处开始反汇编)
****:0000
1E
PUSH DS
****:0001
B80000
MOV AX,0000
****:0004
50
PUSH AX
****:0005
B82A14
MOV AX,DATA (DATA 为 ds 段基址)
****:0008
8ED8
MOV DS,AX
****:000A
BB0000
MOV BX,0000 (0000 为 d1 的地址偏移量)
****:000D
B90E00
MOV CX,000E
****:0010
BA0000
MOV DX,0000
****:0013
8B07
MOV AX,[BX]
****:0015
3D0000
CMP AX,0000
****:0018
7D01
JGE 001B
****:001A
42
INC DX
****:001B
43
INC BX
****:001C
E2F5
LOOP 0013
****:001E
89160E00
MOV [000E],DX (000e 为 rs 的地址偏移量)
-d
****:0 (显示d1 的地址开始的内存单元中的数据)
****:0000 FF 02 FD 04 FB 06 F9 08-F7 0C E2 0A F4
06 00 00 ...
...
...
...
...
...
...
可看出 d1 地址开始的数据块中有 14 个单字节数, 其中有 7 个负数。
-g=****:0
(从 cs:ip 开始运行程序。若程序正确, 则 rs 所在单元
****:000e 的内容应为 7)
Program
terminated normally
-d
****:0 (显示****:000e
单元的内容)
****:0000 FF 02 FD 04 FB 06 F9 08-F7 0C E2 0A F4
06 06 00 ...
...
...
...
...
...
...
发现 ****:000e 单元的内容不是 7, 而是 6, 说明程序有错。
-t (t 为跟踪命令, 可选择逐条跟踪或多条跟踪。跟踪过程中, 显示每条指令执行后寄存器内容、标志位状态、下一条指令的地址和内容等信息。 这里是从
cs:ip 开始逐条跟踪运行, 以便查找错误)
AX=0000
BX=0000 CX=0033 DX=0000 SP=0062 BP=0000 SI=0000DI=0000
DS=****
ES=**** SS=**** CS=**** IP=0001 NV
UP EI PL NZ NA
****:0001
B80000
MOV AX,0000
-t
...
****:0004
50
PUSH AX
-t
...
****:0005
B82A14
MOV AX,****
-t
...
****:0008
8ED8
MOV DS,AX
-t
...
****:000A
BB0000
MOV BX,0000
-t
...
****:000D
B90E00
MOV CX,000E
-t
...
****:0010
BA0000
MOV DX,0000
-t
AX=****
BX=0000 CX=000E X=0000 SP=0060 P=0000 SI=0000 DI=0000
DS=****
ES=**** SS=**** CS=**** IP=0013 NV
UP EI PL NZ NA
****:0013
8B07
MOV AX,[BX]
DS:0000=02FF
单步执行到此处,发现错误, 第一个数应该是单字节负数 ffh, 但被处理为双字节正数 02ffh。
应该将 mov ax,[bx] 以及 cmp ax,0 这两条指令中的 ax 改为 al。根据前面反汇编的结果可知, 这两条指令所在的内存单元为****:0013~****:0017。
-a
****:0013 (用 a 命令改写这两条语句)
****:0013
mov al,[bx]
****:0015
cmp al,0
****:0017
nop (改写到 ****:0017 单元)
****:0018
-g=****:0
(改写程序后, 再次运行程序)
Program
terminated normally
-d ****:0
(显示运行结果)
****:0000 FF 02 FD 04 FB 06 F9 08-F7 0C E2 0A F4
06 07 00 ...
...
...
...
...
****:000e 单元的内容为 7, 结果正确。
-q (退出 debug)
实验三 顺序结构程序设计
实验目的: 掌握顺序结构的程序设计方法。
实验内容: 内存中自 table 开始的七个单元连续存放着自然数 0 至 6 的立方值
(称立方表)。任给一数 x (0≤x≤6)在 xx 单元, 查表求 x 立方值, 把
结果存入 yy 单元。
根据上述题目的要求, 设计一个顺序结构的程序。程序汇编、连接通过后, 用 debug 对执行文件进行检测, 给 xx 单元赋不同的值, 运行程序, 看 yy 单元的值是否正确。
程序流程:
数据段: 自 table 开始的七个单元连续存放自然数 0 至 6 的立方值;
定义变量 xx, 并赋 0 至 6 之间的值; 定义变量 yy。
堆栈段:
定义 50 个字节的堆栈空间
代码段:
保留返回地址; ds 初始化
bx ← offset table
ah ← 0; al← xx
bx ← bx+ax
al ← [bx]; yy ← al
返回 dos
实验四 分支结构程序设计
实验目的: 掌握分支结构的程序设计方法和有关指令的使用方法。
实验内容:
1 (当
x>0)
符号函数定义为
y= 0 (当
x=0)
-1
(当
x<0)
编写一个分支结构的程序, 将任意给定的 x 值存放在 xx 中, 相应的 y 值存放在 yy 中。程序汇编、连接通过后,用 debug 进行调试, 改变 xx 单元的值, 运行程序, 看 yy 单元的值是否正确。
程序流程:
数据段: 定义变量 xx、yy 堆栈段: 定义 50 个单元的堆栈空间
代码段 :
保留返回地址; ds 初始化; al←xx
比较 al 与 0
建议使用下列指令:
cmp
jge
≥ 0 ? je
jmp
Y
N
al ← 0ffh
= 0 ?
N
Y
al ← 0
al ← 1
yy ← al
返回 dos
实验五 循环结构程序设计
实验目的: 掌握循环结构的程序设计方法和有关指令的使用方法。
实验内容: 内存某一缓冲区中存放 10 个单元的用 bcd 码表示的十进制数。 编写一个循环结构的程序, 将每个单元存放的两个十进制数分别转换为两个对应的 ascii 码。高位的bcd 码转换完后存放在地址较高的单元。程序汇编、连接通过后,在 debug 下进行调试运行, 看结果是否正确。
程序流程:
数据段: 定义 bcdbuf 开始的十个单元的源缓冲区;
count ←
bcdfuf 缓冲区的长度;
定义 ascbuf
开始的二十个单元的目标缓冲区。
堆栈段: 定义 50 个单元的堆栈空间
代码段: 保留返回地址;
建议使用下列指令:
ds 和 es 初始化;
lodsb
si ←
offset bcdbuf;
stosb
di ←
offset ascbuf;
and
cx ←
count;
or
标志位 df 置 0;
shr
kk: al ←
ds:[si];
loop
si ←
si+1;
将 al 低四位 bcd 码转
换为 ascii 码,
并存入 es:[di];
di ←
di+1;
将 al 高四位 bcd 码转
换为 ascii 码,
并存入es:[di]
di ←
di+1;
cx ←
cx-1;
若
cx>0, 则转向 kk;
返回 dos。
实验六 子程序设计
实验目的: 掌握子程序的设计及其调用。
实验内容: 编写一个含有子程序调用的程序, 求函数 y = a2 + b2 + ab
a、b 是两个单字节无符号数, 并在数据段中定义, 结果存在y (占用三个字节)。子程序的任务是求两数乘积及累加和。 程序汇编、连接通过后, 用 debug 进行调试, 改变 a、b 的值,将 y 开始的三单元置 0, 运行程序, 看 y 的值是否正确。
程序流程:
数据段: 定义单字节数 a 和 b, 赋任意值;
定义单字节数 y, 预留三个单元
堆栈段: 定义 100 个单元的堆栈空间
建议使用下列指令:
mul
add
代码段: 保留返回地址; ds 初始化
传递参数 a
调用子程序, 求 a 平方
传递参数 b
调用子程序, 求 b 平方及累加和
传递参数 a、b
调用子程序, 求 a×b 及累加和
返回 dos
实验七 DOS、ROM
BIOS 系统调用一(随机数产生器)
实验目的: 掌握基本 I/O、 程序流程:
格式化输出、键盘检测、
时间计数等方面的系统 定义提示行字符串
调用方法。
实验内容: 计算机系统的
时间计数器每 55ms 计数 定义 50 个字节的堆栈空间
加一。人手匀速击键时,
实际击键瞬间的时间间
隔不会精确相等, 而具 保留返回地址; ds 初始化
有随机性。
编程, 利用系统提供的时
间计数的功能和人手击键
时间间隔的随机性, 使得 显示 "Randow
number generator by key",
每按一次键, 就产生一个 再输出回车、换行
50以内的随机整数, 并以
十进制数的形式显示, 后
随一个空格。若按 ESC
键, 则结束程序, 返回 任意按一个键
DOS。
是 ESC 键 ? (ESC 键的 ascii 码是 27)
N
Y
建议使用下列指令:
int 21h (ah=9)
结束程序, 返回 DOS
int 16h (ah=0)
int 1ah (ah=0)
int 21h (ah=6) 读取时间计数器的当前值
div
and
or
将计数值的低位字屏闭高 6 位后除以51
以二位十进制数的形式显示余数,
后随一个空格
实验八 DOS、ROM
BIOS 系统调用二
实验目的: 掌握图形功能的系统调用和图形程序的编程方法。
实验内容: 显示彩色等腰三角形, 定时改变三角形内的颜色, 改变16次(颜色 0~16) 结束。显示模式取 320×200 彩色图形模式, 背景色黄色(颜色号0eh), 彩色组取绿红黄组(0
号调色板)。三角形中心设在屏幕中心。程序结束时, 恢复 80×25 文本显示模式。
程序流程:
N
设内存变量 D1(存每行点数); D1=0
?
设 100 个字的堆栈空间
Y
D1 出栈;
设显示模式4(图形方式320×200); D1←D1+2(修改点数);
设背景色(0EH)黄色;设0号调色板 CX 出栈;
(绿红黄组); 设图形色号
AL=1 DX←DX+1(起点行坐标);
CX←CX-1(起点列坐标)
设图形起点行坐标 DX=10;
CX=0?
设图形第一行点数 D1=1;
N
设图形起点列坐标 CX=160
Y
N
AL←AL+1;AL=16?
Y
CX、D1 入栈
设文本显示模式 80×25
写点 (12 号调用);
修改写点列坐标 CX←CX-1;
结束程序, 返回 DOS
修改写点计数 D1←D1-1
建议使用下列指令:
int 10h
(ah=0) int 10h
(ah=11) int 10h
(ah=12) int 10h
(ah=2)
注意: int 10h 调用将破坏 AX 的值。若需要保存 AX 的值,应在该指令前面将 AX 进栈,
在该指令的后面将 AX 出栈。
实验九 DOS、ROM
BIOS 系统调用三
实验目的: 掌握彩色文本功能的系统调用和彩色文本程序的编程方法。
实验内容: 在彩色文本 40×25 显示模式下, 显示 127 个带有属性的彩色字符。属性从 0 开始,逐字加 1。每行显示 11 个字符,字符之间用空格隔开, 每个字符的显示适当延时。屏幕边缘设黄色(0eh)。
程序流程:
设内存变量 D1、D2、D3、D4
设显示模式 1 (彩色文本 40×25);
设黄色边缘;
写光标位置; 写字符; 延时
列坐标 D2 加二;
字符 ASCII 码(D3)加一;
Y
D3>'~' ?
结束程序, 返回 DOS
N
字符属性 D4 加一
Y
列坐标 D2≤30 ?
N
行坐标 D1 加一
建议使用下列指令:
设列起点坐标 D2=10
int 10h (ah=0)
int
10h (ah=11)
int
10h (ah=2)
延时程序段可采用:
int 10h (ah=9)
mov cx,0ffffh
q:loop q
实验十 8253、8255编程实验(音乐程序)
实验目的: 了解 IBM PC/XT 机内发音电路原理及发音电路中各接口芯片的作用。掌握8253定时/记数器芯片和8255并行接口芯片的编程方法。掌握音乐程序的设计、编程方法。
实验内容: 编程, 使计算机扬声器演奏乐曲 《两只老虎》。
计算机发音的软、硬件基础:
计算机扬声器控制电路如下图
1.19318Mhz 8253
CLOCK信号 CLK2
8255
OUT2
扬
PB0 GATE2
& 驱动
低通
声
PB1
器
由上图可见, 计算机扬声器的发音由机内 8253 芯片(定时/计数器) 和8255 芯片 (并行接口) 共同控制。当 8255 PB0 端(B 口 0 端)为1 时,8253 通道 2 的输出端 (OUT2) 便输出一定频率的方波信号; 当 8255 PB1 端(B 口 1 端) 也为 1 时, 此信号就可经驱动、低通后送往扬声器发音。
8253 OUT2 端输出方波的频率取决于为通道 2 设置的分频值, 频率值与分频值的关系为:
1.19318MHz/频率值=1234dch/频率值=分频值
(其中 1.19318MHz 是 8253 的时钟频率)
设置 8253 芯片, 使扬声器发音的程序段为:
mov al,0b6h (8253 初始化: 选通道 2, 输出方波信号。
out 43h,al 43H 是 8253 芯片控制寄存器的口地址)
mov dx,12h
mov ax,34dch
div di
(计算分频值, 赋给 ax。di 中存放声音的频率值。)
out 42h,al
mov al,ah (向通道 2 写入分频值, 先写低字节, 后写高字节。
out 42h,al 42H 是 8253 芯片通道 2 的口地址)
. . . (软件延时)
设置 8255 芯片, 扬声器进行 开/关 操作的程序段为:
in al,61h
mov ah,al (读取 8255 B口的八位数据。61H 是 8255 B口的口地址)
or al,3 (所读数据和 3 相或, 使低两位置 1)
out 61h,al (将相或后的数据再写入 8255 B口, 开扬声器)
...
...
mov al,ah
out 61h,al (将读取的原数据再写入 8255 B口, 关扬声器)
需编程演奏的乐曲如下:
《两只老虎》
1=c
4/4
1 2 3 1 │1 2
3 1 │3 4
5 ─ │3
4 5 ─ ┃
56
43 3 1 │56 43 3 1 │2 5
1 ─ │2
5 1 ─ ┃
C 调音符和发音频率(Hz)的对应关系如下表:
音符 频率 音符 频率 音符 频率
1 138 1 262 1 524
2 147 2 294 2 587
3 165 3 330 3 659
4 175 4 349 4 698
5
196 5 392 5 784
6 220 6 440 6 880
7 247 7 494 7 988
每个音的音长由软件延时实现, 若以 10 毫秒为基本延时单位, 则 1秒延时由 100 个延时单位实现。
延时 10 毫秒的程序段为:
mov cx,2801
qq:loop qq
程序流程: (为全音符分配 1 秒的延时时间)
设内存数组, 存放歌名 "Two
tiger:";
设内存数组, 存放每个音符的频率值, 再存放一个 0, 作为结束标志;
设内存数组, 存放每个音符的延时单位数;
设堆栈段
保留返回地址; DS 初始化;
显示歌名(使用int 21h)
读取第一个音符的频率值;
读取第一个音符的延时单位数;
初始化 8253, 选择通道二, 产生方波信号;
根据读取的频率值计算分频值; 将分频值分两次写入 8253 的通道二
读取 8255 B口的八位数据, 和3相或后再写入 8255 B口, 开扬声器
根据读取的延时单位数延时
恢复 8255 B口的原数据, 关扬声器
读取下一个音符的频率值
Y
读取的频率值是 0 ?
结束程序, 返回 DOS
N
读取下一个音符的延时单位数
实验十一 8259、8253、8086中断控制系统 编程实验(时钟中断)
实验目的:了解 IBM PC/XT
机内中断控制逻辑电路及中断控制原理,以及电路中各接口芯片 的作用。掌握8259 中断控制器芯片
和 8253 定时/计数器芯片的接线方法和编程技术。
实验内容:对机内 8253 定时/记数器芯片、8259 中断控制器芯片联用编程,使 8253 每隔
10MS 经
8259 向 CPU 发一次 8 号中断。中断一次,屏幕上显示一个数字。
IBM
PC/XT 机内中断控制逻辑电路:
CPU 8259
D7-D0
除法错 RD IOR
WR IOW
CS INTRCS
INT0 OF=1
A0 A0
中 INTR INT IR0
8253 的 OUT0 端
断
8 IR1
键盘接口
INT3断点 控 2
IR2
保留
制 5
IR3 I/O COM2
逻 9
IR4 插
COM1
INTn
辑 NMI
IR5 槽
硬盘
IR6
软盘
IR7
并行打印机
单步TF=1
注:8259 IR0 端引发的中断缺省为 8 号中断。
中断处理程序流程:
AX 进栈;BX BX+1
BX 指向 TAB 数组末尾?
Y
N
将 BX 指向 TAB
向 8259 OCW2(口地址为 20H)写入 20H(通知 8259,本次中断结束)
AX 出栈;中断返回
主程序流程:
数据段中定义数组 TAB;定义堆栈
保留返回地址;等待按任意键
关中断;方向标志清零;保存八号中断的中断向量
DS 初始化;改写八号中断的中断向量
设置 8253:记数器 0 工作于方式 3,二进制记数(8253
的控制寄存器口地址是 43H)
向 8253 记数器 0写入分频值 0ffffh,先写低字节,后写高字节
(8253 记数器 0 的口地址是 40H)
读 8259 IMR 的内容,并进栈保存(8259 IMR 的口地址是 21H);
改写 8259 OCW1 为只允许时钟中断和键盘中断
将 BX 指向 TAB;开中断
N
BX 改值?
屏显 [BX]
Y
按了 ESC 键?(键码 27)
N
Y
关中断;向 8253 记数器 0 写入记数值 0
恢复 8259 原 OCW1;恢复 8 号中断原中断向量
开中断;返回 DOS
实验十二 .EXE 文件和 .COM 文件
实验目的: 了解 .EXE 文件和 .COM 文件的不同组成结构, 掌握 .COM 文件结构的编程方 法, 掌握将 .EXE 文件转换为 .COM 文件的方法。
实验内容: 了解 .EXE 文件和 .COM 文件的结构原理, 按照 .COM 文件的结构改写实验十 的源程序, 最终生成能演奏
《两只老虎》 乐曲的 .COM 文件。
一.
原理概述
在磁盘上扩展名为 .EXE 和 .COM 的文件都是在 DOS 下可运行的文件,也就是说在
DOS 下直接敲入文件名即可。但 .EXE 文件和 .COM 文件是有区别的, 主要是文件结构上的差别。
1. .EXE
文件的结构:
DOS 的 COMMAND.COM 文件在接受一个键盘命令后(.EXE 文件和 .COM 文件的名字也是键盘命令), 首先判断是内部命令还是外部命令, 若是外部命令则去检测可用存储区的最低地址和最高地址, 然后在可用地址的低端开始的100H 个单元建立将要装入的程序的程序前缀区(PSP), 在接下来的地址装入程序本身, 之后转向此程序的入口地址开始执行。程序前缀区(PSP) 占100H个单元, 其分配如下图所示:
CS:00H~01H INT
20H
CS:02H~03H 可用内存最大地址
CS:04H~08H 功能调用入口地址区
CS:09H~0CH 程序正常退出(INT 22H)
CS:0DH~10H Ctrl+Break 或 Ctrl+C 退出(INT 23H)
CS:11H~14H 标准错误出口(INT 24H)
保留区
CS:5CH~6BH 文件控制块1 (FCB1)
CS:6CH~7BH 文件控制块2 (FCB2)
保留区
CS:80H~FFH DOS命令行缓冲区和
DTA(磁盘传输区)
PSP 的头两个字节是 INT 20H 指令。.EXE 文件被装入内存后, DOS 将DS 和 ES 指向 PSP 的起点, 即 INT 20H 指令, 这个指令的功能是返回DOS 系统。但 INT 20H 的执行需要一个前提, 即 CS 必须指向 PSP 区。前面所编的程序都利用了 PSP 区的这条指令来返回 DOS, 在源程序的开始都有下面几条指令:
PUSH DS (将 PSP 区的段基址入栈)
MOV AX,0
PUSH AX (将 PSP 区中 INT 20H 指令的地址偏移量入栈)
这样, 堆栈中首先保存了 PSP 区的入口地址。 而源程序的最后一条执行指令是 RET, 执行时, 它将这个入口地址分两次弹入 CS:IP 中,此时便会执行INT 20H, 实现正确返回 DOS。
.EXE 程序被装入时, 是在 PSP 区之后存放用户程序的数据段(若有)、堆栈段(若有)、代码段, 此时 DS 和 ES 指向 PSP 的首址。 因此, 用户程序中还应对 DS 和 ES 初始化, 使它们指向数据段和附加段。SS 和 SP 可不设置而使用系统的堆栈。CS 和 IP 则在被连接时确定其值。
2. .COM
文件的结构:
.COM 文件和 .EXE 文件一样, 也有一个 PSP 区。.COM 文件被装入时, DS、ES、CS 和 SS 都指向 PSP 区的入口, 用户程序在 PSP 区之后, 所以 .COM 文件的 IP 为 100H。.COM 文件只能由一个段组成, 最大为 64KB。SP指向这 64KB 的末尾, 并在栈顶自动存放了两个字节的 00H。对于 .COM 文件, 因 CS 总是指向 PSP 区, 故程序中可随意使用 INT 20H 指令, 这一点在
.EXE 文件中是不行的。
.COM 文件不象 .EXE 文件那样带有重新定位信息, 因此只能把整个文件看成一段。整段可重新定位, 但不能分段定位。对 DS、ES 和 SS 也不能再初始化, 因无法确定
DATA 的位置。 因 .COM 文件不需要重新定位信息, 所以用 DEBUG 调试完后, 可直接用
DEBUG 的存盘命令存盘, 而 .EXE 文件则不行。
3. .EXE
文件转换为 .COM 文件:
汇编语言程序经汇编和连接之后生成的是 .EXE 文件。一个 .EXE 文件要能转换为 .COM 文件, 必须按照 .COM 文件的格式要求来写, 即只有一个段, 程序入口为
100H, 所有过程定义为 NEAR, 不能有段设置(段名不能出现在语句中) 等。
下面是一个 .COM 程序的结构框架:
code segment
org 100h (程序起点)
assume cs:code,ds:code,es:code,ss:code
start proc near
<程序正文>
int 20h (返回 DOS)
start endp
<数据放此处>
code ends
end start
按照上面的结构编写的源程序经汇编连接后生成 。EXE 文件,再利用
DOS 的
EXE2BIN 命令将 .EXE 文件转换为 .COM 文件。命令行为:
EXE2BIN .EXE文件名 .COM文件名
在转换时,注意不要转换为与 .EXE 文件同名的 .COM 文件。
二.
本次实验要求:
将实验十的源程序按照 .COM 文件的格式进行改写, 汇编连接成
.EXE 文件,再转换为 .COM
文件,使其能演奏 《两只老虎》乐曲。
实验十三 COPY 程序
实验目的:了解磁盘文件管理的一般原理,了解并掌握利用文件标记存取文件的编程方法。
实验内容:对 COPY 程序进行验证和分析。
一.磁盘文件管理概述:
要处理文件,可以借助 DOS 系统功能调用来实现。文件管理的功能调用要用到内存
中的两个数据区。一个是文件数据块 FCB,一个是磁盘传输区 DTA。
FCB中包括 DOS 管理文件时用的信息,通常被指定在程序段前缀(PSP)的偏移地址 05CH 处。处理文件时总是先把文件名和扩展名放在 FCB 的相应字段内。
FCB分标准 FCB(占用 37 个字节)和扩充 FCB(占用 7
个字节),格式规定如下:
0 1~8 9~11 12~13 14~15 16~19 20~21
驱动器号 文件名 文件扩充名 当前块号 记录长度 文件长度 日期
22~31 32 33~36
-7
-6~-2 -1
DOS 留用 当前记录号 相对记号 扩充FCB标志字节 留用 属性字节
DTA 是实现数据缓冲的储存区,一切磁盘 I/O 都和它打交道。读磁盘时,读出的数据放在 DTA 中;写磁盘时,待写的数据也放在 DTA 中。当 DOS 将控制权转给我们的程序时,DTA被放置在 PSP 的偏移地址 80H 处。
可利用文件标记实现文件系统的管理。文件标记为一个 ASCII 码字符串:
[盘符][路径]文件名
后跟一个字节的 00H
建立或打开文件时,要求入口指针指向这个 ASCII 码字符串。文件一旦建立,就获得了一个文件标记(文件号),以后在打开、读、写、关闭文件时就使用这个文件标记。
利用文件标记存取文件的过程示于下图:
打开、建立文件
移动 读/写 指针到所要求的字节位置
设置 CX 为每次 读/写 操作要 读/写 的字节数
进行 读/写 操作
N
存取结束?
Y
关闭文件
建立文件可用 3CH 号功能调用, 打开文件可用 3DH 号功能调用, 关闭文件可用 3EH 号功能调用, 读文件可用 3FH 号功能调用, 写文件可用 40H号功能调用, 移动文件的读/写指针可用 42H 号功能调用。
在建立或打开文件时, 缺省情况下的读/写指针是指向文件开始的第一个字节的。
二.本次实验要求:下面提供一个利用文件标记存取文件的编程实例 ── COPY 程序。要求上机验证这个程序, 并对此程序加以注释和分析。
stack
segment para stack
db 100
dup(9)
stack
ends
data
segment
sfile
db 64
db ?
db 64
dup(' ')
dfile
db 64
db ?
db 64
dup(' ')
ask1 db
0ah,0dh,'Plase input sourse file name','$'
ask2 db
0ah,0dh,'Plase input destnation file name','$'
note db
0ah,0dh,'Plase insert deskettes','$'
er1 db
0ah,0dh,'Create error','$'
er2 db
0ah,0dh,'Open error','$'
er3 db
0ah,0dh,'Read error','$'
er4 db
0ah,0dh,'Write error','$'
er5 db
0ah,0dh,'Close sourse file error','$'
er6 db
0ah,0dh,'Close dest file error','$'
bufr dw
?
data
ends
code
segment
assume
cs:code,ds:data,es:data
start
proc far
push ds
mov
ax,0
push ax
mov
ax,data
mov
ds,ax
mov
es,ax
lea
dx,ask1
call
disp
lea
dx,sfile
call
inpt
mov
cl,sfile+1
xor
ch,ch
mov
si,cx
mov
[si+sfile+2],0
lea
dx,ask2
call
disp lea dx,sfile+2
lea
dx,dfile int 21h
call
inpt lea dx,er3
mov
cl,dfile+1
jc err
xor
ch,ch
or
ax,ax
mov
si,cx
je exit
mov
[si+dfile+2],0
mov ah,40h
lea
dx,note
lea dx,sfile+2
call
disp
xchg
bufr,bx
mov
ah,7
int 21h
int
21h
lea dx,er4
call
copy
jc err
ret
xchg
bufr,bx
start
endp
jmp r_w
disp
proc near
exit:mov ah,3eh
mov
ah,9
int 21h
int
21h
lea
dx,er5
ret
jc err
disp
endp
xchg bufr,bx
inpt
proc near
mov ah,3eh
mov
ah,0ah
int
21h
int
21h
lea dx,er6
ret
jc err
inpt
endp
ret
copy
proc near
err:mov ah,3eh
mov
ah,3ch
int 21h
lea
dx,dfile+2
xchg bufr,bx
mov
cx,0020h
mov ah,3eh
int
21h
int 21h
lea
dx,er1
call disp
mov
bx,ax
ret
jc
err
copy endp
mov
bufr,ax
code ends
mov
ah,3dh
end start
mov
al,0
lea
dx,sfile+2
int 21h
lea
dx,er2
mov
bx,ax
jc err
r_w:mov
cx,10h
mov
ah,3fh
硬件部分
实验一 8253 定时/计数器、8359中断控制器联用实验----统计随机事件
实验目的: 1. 学会 8253 芯片和微机接口的原理和方法。
2. 掌握 8253
定时/计数器的工作方式和编程原理。
实验内容: 1.设置 8253 的计数器2 为方式 0, 用于事件计数(由按钮单脉冲产生事件)。当计数结束时,
向 8259发出中断请求信号, CPU 响应中断后, 在数码管上显示中断次数。满 5 次中断, 数码管组显示“8253GOOD”。
2.如 8253
OUT2 产生的中断信号不符合 8259 IR3 信号电平要求, 产生 7 号中断, 数码管组显示
“ERR”。
8253 芯片介绍:8253 是一种可编程定时/计数器,有三个 16 位计数器、六种工作方式,计数频率范围为 0~2MHZ,用 +5V 电源供电。8253
芯片具有以下功能用途:延时中断、可编程频率发生器、事件记数器、二进制倍频器、实时时钟、数字单稳、复杂的电机控制器。
实验电路原理:
D7 D0 VCC +5V
D6 D1 8 WR IOW
D5 D2 2 RD IOR
D4 D3 5 CS 040 - 04F(译码电路输出孔)
D3 D4 3 A1 A1
D2 D5 A0 A0
D1 D6 CLK2 (按钮单脉冲信号输出孔)
D0 D7 OUT2
CLK0 GATE2 +5V IR3
OUT0 CLK1 1.8432MHZ时钟电路 8259
GATE0 GATE1 +5V U30
GND GND OUT1
8259CS1
CLK
060-06F
U28 (译码电路输出孔)
8251
硬件线路连接:①.8253 的 GATE2孔和 +5V 孔相连。
②.8253 的 CLK2 孔和 孔相连。
③.8253 的 OUT2孔和 8259 的 IR3 孔相连。
④.8259 的 8259CS1 孔和地址译码电路输出信号的 060-06F 孔相连。
本系统规定,8253 记数器1 的时钟输入端 CLK1 接 1.8432MHZ 信号源,输出 OUT1 接 8251 的收发时钟端,供串行通信用,记数器1 仅作为分频器,计数器0 和计数器2 留用户使用。
编程提示:
1.
设置 8253计数器2工作于方式0,用于事件计数。当事件计数结束时,计数器2
向 8259 发出 3 号中断请求信号。CPU 响应中断后,在数码管组上显示中断次数。满 5 次中断,在数码管组上显示“8253GOOD”。
2. 若 8253OUT2 产生的中断信号不符合 8259IR3 信号电平要求,则显示“ERR”。
主程序流程
3 号中断处理程序流程
开始
关中断
调用显示“8253---1”子程序 显示中断次数
填 8259 中断向量表
满 5 次中断否?
N
Y
8259 初始化; 8253 初始化 开中断 显示“8253GOOD”
开中断
中断返回
结束
等待中断
7号中断处理程序流程
关中断
调用显示“ERR”子程序
结束
实验步骤:
1. 按图连接好电路, 检查无误后方可打开电源。
2.
在命令提示符“-”状态下,按 GO 键,显示“500
00”,输入F000:B500,按 EXEC 键,数码管组将显示“8253---1”。
3.
按4次 AN 按钮,右边数码管将显示“1”, 以后每按4次 AN 按钮,产生一次中断,右边数码管显示中断次数,满 5 次中断`,数码管组显示“8253GOOD”。
实验二 8253 定时/计数器实验二
实验目的: 进一步掌握 8253 芯片的工作原理和编程方法。
实验内容: 设计、连接电路, 编程。使 8253 的计数器 0置于方式 3, 产生方波。用示波器观察波形, 波形幅值为 0~5 V。
实验电路原理: 硬件线路连接:
D0 D0 VCC +5V 1. 8253的GATE0孔接+5V孔
D1 D1 8 WR IOW 2. 8253 的 CLK0 孔接分频电
D2 D2 2 RD IOR 路输出孔 Q2
D3 D3 5 CS 040 - 04F 3. 分频电路输入端A孔接
D4 D4 3 A1 A1 8MHZ 孔
D5 D5 A0 A0 4. 8253 的 OUT0 孔接示波器
D6 D6 CLK2
D7 D7 OUT2
GND GND GATE2
示波器 OUT0 CLK1 1.8432MHZ时钟电路
+5V
GATE0
GATE1 +5V
CLK0 OUT1
Q2 CLK
74LS393
U28
A (分频电路输入孔) 8251
8MHZ(8MHZ时钟输出孔)
程序流程: 实验步骤:
开始 1.按图连接好电路,检查无误后
方可打开电源。
调显示“8253---2”子程序 2.在提示符“-”状态下,按GO
键,显示“500 00”, 输入
F000:B700,按EXEC键。
置 8253 工作方式控制字 3.用示波器测8253 OUT0 孔,
应有方波产生,幅值为0-5V。
启动 8253
结束
实验三 8255A 并行口实验一(读取、显示八位开关状态)
实验目的: 1. 掌握 8255A 和微机接口的方法。
2. 掌握 8255A
的工作方式和编程原理。
实验内容: 将 8255 的 A 口置于方式 0, 作为输入口, 读取K1~ K8 八个开关量, 送 C 口显示。C 口置于方式 0, 作为输出口, 将其 PC0~PC7 通过 74LS244 驱动,按 K1~K8 分别对应 a~h段的关系, 在单个数码管上按段显示开关状态 (高电平对应段亮, 反之灭)。PB0 置方式 0, 作为输出口通过
75451 驱动, 作为单个数码管的位控端
8255A芯片简介:
8255A可编程芯片是INTEL公司生产的并行接口芯片,它具有3个8位并行接口,+5V单电源,具有以下3种工作方式:
方式0:基本输入/输出方式;
方式1:选通输入/输出方式;
方式2:双向选通工作方式。
实验电路原理:
D0 D0 PC0 7 a
D1 D1 8 PC1 4 b
D2 D2 2 PC2 L 驱 c
D3 D3 5 PC3 S
d
D4 D4 5 PC4 2 动 e
D5 D5 PC5 4
f
D6 D6 PC6 4 g
D7 D7 PC7 h
A0 A0
DP
A1 A1 PB0 G
75451(驱动)
IOW WR PA0 K1
(开关1)
IOR RD PA1 K2
(开关2)
RESET RESET PA2 K3
(开关3)
0F0-0FF 8255CS PA3 K4
(开关4)
PA4 K5
(开关5)
PA5 K6
(开关6)
PA6 K7
(开关7)
PA7 K8
(开关8)
硬件线路连接:
1.8255芯片A口的PA0-PA7孔依次和开关量输出孔K1-K8相连。
2.8255芯片B口PB0孔和其左面的G孔相连。
3.8255芯片的片选端8255CS孔和译码电路输出孔0F0-0FF孔相连。
4.将8255芯片旁的短路块J5连VCC端。
5.将G孔下方短路块J6连VCC端。
程序流程:
开始
调用显示“8255---1”子程序
置 8255 控制字
置8255 PB0
为低电平
读取 PA 口值
将 PA 口值送 PC 口显示
实验步骤:
1. 按图连接好电路,检查无误后方可打开电源。
2. 在命令提示符“-”状态下,按GO键,显示“500 00”,输入F000:B300,按EXEC键。
3. 数码管的a~h段分别显示K1~K8 八个开关的状态,开者对应段亮,否则灭。若搬动开关,对应段的亮灭随之变化。
实验四 8255A 并行口实验二(交通信号灯)
实验目的: 掌握通过 8255A 并行传输数据的方法, 按交通信号灯的亮灭规律, 控制 12 个发光二极管的亮灭。
实验内容: 1. 将 8255 的三个口置于方式 0, 作为输出口。B 口高四位接4个黄
灯, C 口低四位接4个绿灯, C 口高四位接4个红灯。
2. 了解交通信号灯的亮灭规律, 程控各灯按规律亮灭。
3. 各发光二极管共阳极, 8255相应端低电平时, 对应灯亮, 反之灭。
实验电路原理:
D0 D0 PC0 L1(绿管)
D1 D1 8 PC1 L2(绿管)
D2 D2 2 PC2 L3(绿管)
D3 D3 5 PC3 L4(绿管)
D4 D4 5 PC4 L5(红管)
D5 D5 PC5 L6(红管)
D6 D6 PC6 L7(红管)
D7 D7 PC7 L8(红管)
A0 A0
A1 A1
IOW WR PB0
IOR RD PB1
RESET RESET PB2
0F0-0FF 8255CS PB3
PB4 L9 (黄管)
PB5 L10(黄管)
PB6 L11(黄管)
PB7 L12(黄管)
硬件线路连接:
1. 8255A片选端8255CS孔和译码电路输出孔0F0-0FF相连
2. 8255A C口的PC0-PC7孔依次和L1-L8孔相连,B口的PB4-PB7孔依次和L9-L12孔相连
3. 将8255A芯片旁的短路块J5连VCC端
程序流程:
开始
调用显示“8255---2”子程序
置8255控制字82H, 使B口为输入口
读取B口8位数据保存在BL中
置8255控制字80H, 使各口均为输出, 且工作于方式
0
使 4 个路口的红灯全亮
4 个红灯全亮
延时一段时间
2、4路口绿灯亮
亮 1、3
路口绿灯
延时
延时
灭 2、4 路口绿灯
灭 1、3
路口绿灯 2、4 路口黄灯闪烁 8 次
1、3 路口黄灯闪烁 8 次
4 个红灯全亮
实验步骤:
1.
按图连接好电路,检查无误后方可打开电源。
2.
在命令提示符“-”状态下,按GO键,显示“500 00”,输入F000:B400,按EXEC键。
3.
数码管组显示“8255---2”,同时L1-L12 十二个发光二极管按交通信号灯的亮灭
规律自动亮灭。
实验五 8255A 并行口实验三(位控波形)
实验目的: 利用8255A通道C对数据总线的D0、D1、D2三位进行定时锁存, 使PC0、PC1、PC2三管脚输出规定的波形。
实验内容: 1. 将 8255 的三个口置于方式 0, 作为输出口。C 口低三位对数据总线的D0、D1、D2三位进行定时锁存,使其输出如下的波形:
D0
D1
D2
2.程序实现方法为:把波形的变化数值化,得数据 1,2,6,3,2,4,4,0.将这些数据反复依次写入8255的C口, 写一次延时一次。
3. 在示波器上显示这一组波形。
实验电路原理:
D0 D0 PC0 示波器
D1 D1 8 PC1 示波器
D2 D2 2 PC2 示波器
D3 D3 5 PC3
D4 D4 5
D5 D5 PC7
D6 D6 PA0
D7 D7
A0 A0
A1 A1 PA7
IOW WR PB0
IOR RD
RESET RESET
0F0-0FF 8255CS PB7
硬件线路连接:
1.
8255A片选端8255CS孔和译码电路输出孔0F0-0FF相连。
2.
8255A C口的PC0~PC2孔和示波器相连。
3.
将8255A芯片旁的短路块J5连VCC端。
程序流程:
调用显示“8255---3”子程序
置8255控制字80H, 使各口均为输出, 且工作于方式
0
将波形数值化产生的数字依次写入8255 C口,写一次延时一次
实验步骤:
1. 将实验系统与PC机相连。
2. 在实验系统上按图连接好电路,并检查。
3. 开PC机电源,在PC机上按附录给出的源程序建立程序文件,并汇编、连接产生执行文件。
4. 开实验系统电源。
5. 按附录给出的方法,将执行文件发送到实验系统,目标地址为0:1400H。
6. 按附录给出的方法,用小键盘监控命令或串行监控命令执行该文件。实验系统将显示“8255---3”。
7. 示波器两路探头依次探测PB0、PB1、PB2三路信号,调节示波器,对每两路信号进行比较,可看到规定的波形。
实验六 8259 单极中断控制实验
实验目的: 1. 掌握 8259A 中断控制器的接口方法;
2. 掌握
8259A 中断控制器的应用编程。
8259芯片介绍:中断控制器8259A是专为控制优先级而设计开发的芯片。它将中断源按优先级排队,辨别中断源以及提供中断矢量的电路集于一片中。固无须附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先的模式和中断请求方式。进而,在不需要增加其他电路的情况下,通过多片8259A的级联,能构成多达64级的矢量中断系统。
实验内容: 本系统中有两片 8259A 芯片 U30 和 U31,
U30工作在主片方式,U31 工作在从片方式。 当 U31 不工作时, U30 即工作于主片方式。主片和从片的 IR0~IR7 全部供用户使用。
本次实验使用 3 号中断源 IR3, IR3 和高脉冲插孔相连, 中断方式为边沿触发方式, 每按两次 AN 按钮产生一次中断。满
5 次中断, 数码管组显示 “8259GOOD”。若中断源电平信号不符合规定要求, 则自动转到7 号中断, 数码管组显示
“ERR”。
本实验系统的中断向量表如下:
中断号 0 1 2 3 4 5
6
7
20H 24H 28H 2CH 30H 34H 38H 3CH
向量地址 | | | | | | | |
23H 27H
2BH 2FH 33H
37H 3BH 3FH
实验电路原理:
D0 D0 IR0
D1 D1 8 IR1
D2 D2 2 IR2
D3 D3 5 IR3 (按钮高脉冲信号)
D4 D4 9 IR4
D5 D5 IR5
D6 D6 U30
IR6
D7 D7 IR7
A0 A0 SP/EN Vcc
IOW WR CAS0 NC
IOR RD CAS1 NC
8088INTR INT CAS2 NC
8088INTA INTA 8259CS1 060─06F(译码电路输出信号)
硬件电路连接:
1. 8259的片选端8259CS1孔和译码电路输出060-06F孔相连
2. 8259的3号中断IR3插孔和高脉冲信号
孔相连
主程序流程
3号中断处理程序流程:
开始
关中断
调用显示“8259---1”子程序
显示中断次数
N
8259 初始化 满 5 次中断否?
Y
等待中断 次数加1 显示“8259GOOD”
中断返回 结束
7 号中断处理程序流程:
开中断
调用显示“ERR”子程序
结束
实验步骤:
1. 按图连接好电路,检查无误后方可打开电源。
2. 命令提示符“-”状态下,按GO键,显示“500 00”,输入F000:B800,按EXEC键, 数码管组显示“8259---1”。
3. 每按两次AN键,中断次数加一,数码管组的显示相应改变,中断满5次后,数码管组显示“8259GOOD”。
实验七 8259 极联中断控制实验
实验目的: 掌握 8259A 中断控制级联方式的硬件设计和软件编程。
实验内容: 本系统中有两片 8259A 芯片 U30 和 U31,
U30工作在主片方式,U31 工作在从片方式, 当 U31 不工作时, U30 即工作于主片方式。主片和从片的 IR0~IR7 全部供用户使用。
1. 从片的
IR0孔 (0 号中断申请端) 和单脉冲电路的
孔相连。
2. 主片的
IR3 孔(3 号中断申请端) 和从片的 INT2 孔相连。
本实验要求先在数码管组显示“8259---2”, 按一次 AN 按钮后产生中断, 数码管组显示“8359GOOD”。
实验电路原理:
D0 D0 IR0
D1 D1 8 IR1
D2 D2 2 IR2
D3 D3 5 IR3 IR3孔
D4 D4 9 IR4
D5 D5 IR5
D6 D6 U30
IR6
D7 D7 IR7
A0 A0 SP/EN Vcc
IOW WR CAS0
IOR RD CAS1
8088INTR INT CAS2
8088INTA INTA 8259CS1 060─06F
D0 D0 IR0
D1 D1 8 IR1
D2 D2 2 IR2
D3 D3 5 IR3
D4 D4 9 IR4
D5 D5 IR5
D6 D6 U31
IR6
D7 D7 IR7
A0 A0 SP/EN GND
IOW WR CAS2
IOR RD CAS1
0F0-0FF 8259CS2 CAS0
8088INTA INTA INT INT2孔
硬件电路连接:
1. 主片8259(U30)片选端8259CS1和译码电路输出孔060-06F相连
2. 从片8259(U31)片选端8259CS2和译码电路输出孔0F0-0FF相连
3. 从片8259(U31)0号中断2IR0孔和 孔相连
4. 从片8259(U31)INT2孔和主片3号中断IR3相连
5. 从片8259(U31)旁的短路块J3连VCC端
主程序流程
开始
调用显示“8259---2”子程序
8259 主片初始化;8259从片初始化
开中断
等待中断
3 号中断处理程序流程
关中断
调用显示“8259GOOD”子程序
结束
7 号中断程序流程: 略
实验步骤:
1. 按图连接好电路,检查无误后方可打开电源。
2. 命令提示符“-”状态下,按GO键,显示“500 00”,输入F000:BA00,按EXEC键, 数码管组显示“8259---2”。
3. 按两次AN按钮产生中断,数码管组显示“8259GOOD”。
实验八 8279 键盘接口应用实验
实验目的: 1. 掌握 8279 键盘接口的编程和应用。
2. 了解本系统上
8279 的应用和键盘编码。
实验内容: 1.本实验不需增加硬件线路, 只需阅读、分析本系统中与8279 有关的硬件线路原理图。从图中可见, 本系统通过 8279 接口芯片及相关电路完成键盘显示。
2.编程, 用查询方式获取键盘状态, 读取键值。若按数字键, 显示相应数字;
若按 MON 键, 则显示 “8279GOOD” (均在数码管组上显示); 按其它键不予理睬。
8279芯片介绍:
8279是一种可编程键盘/显示接口芯片,它共有3种工作方式:编码扫描方式、传感器扫描方式、时钟脉冲选通方式。固只需通过编程就可用8279来实现各种键盘/显示器的接口,几乎不需附加任何电路。
本系统8279接口规定的小键盘的键名和键值对照表及数码管组显示代码表如下。
键名键值对照表:
键名 0 1 2 3 4 5 6 7 8 9 A
键值 00 01 02 03 04 05 06 07 08 09 0A
键名 B C D
E F EXEC NEXT MOV
MON LAST STEP
键值 0B 0C 0D 0E 0F 10 11 12 13 14 15
显示代码表:
显示值 0 1 2 3 4 5 6 7
显示代码 3FH
06H 5BH 4FH 66H 6DH 7DH 07H
显示值 8 9 A B C D E F
显示代码 7FH 6FH 77H 7CH 39H 5EH 79H 71H
程序流程
N
清显示缓冲区 是MON键?
Y
调用显示“8279GOOD”
N 读键盘状态
结束
判断有键否?
Y
键值转换成显示代码送显示缓冲区
延时
调用显示子程序, 显示相应数字
读取键值
N Y
是数字键?
实验步骤:
1. 打开电源,数码管组显示“DVCC8088”,再按任意键(RESET键和INTR键除外),出现命令提示符“-”,按GO键,显示“500 00”,输入F000:BB00,按EXEC键,
数码管组显示“8279---1”。
2. 按键:若按数字键,数码管组显示相应数字;若按MON键,数码管组显示“8259GOOD”;若按其他键,程序不理睬。
实验电路原理:
数码管组电路
D0 DB0 OUTB0 7
D1 DB1 8
OUTB1 4 驱
D2 DB2 2
OUTB2 L
D3 DB3 7
OUTB3 S
D4 DB4 9
OUTA0 2
D5 DB5 OUTA1 4 动
D6 DB6 U41 OUTA2 4
D7 DB7 OUTA3
A0 A0 SL3 NC
IOW WR SL2 译 码
IOR RD SL1 74LS138
RESET RESET SL0
080-08F CS RL0
NC IRQ
RL1
NC BD RL2
GND CNTL/S RL3 小`键 盘
GND SHIFT RL4 电 路
2.38MHZ CLK RL5
RL6
RL7
实验九 8251 串行口实验 ── 双机通讯
实验目的: 1. 了解串行通讯的一般原理和 8251 的工作原理。
2. 初步了解
RS-232 串行接口标准及 TTL 电路的连接方法。
3.
掌握 8251A 的编程方法。
实验内容:1.本系统中装有一片8251 芯片并和标准 RS-232 接口连好,对
8251 芯片的初始化程序在监控软件中已作好, 我们可以直接 对 8251 进行串口状态查询。
2.准备二台 DVCC-8086 系统, 确定 1 号机为发送, 2 号机为接
收收。1 号机的 RXD 与 2 号机的 TXD 相连, 2 号机的 RXD 与1 号机的 TXD 相连, 两机共地线。
3. 两机间用查询方法进行发送/接收, 1 号机运行发送程序, 2 号机运行接收程序。1 号机上键盘敲入的字符在 2 号机的数码管组上显示。
实验电路原理:
D0 D0 SYNDET NC
D1 D1 8 TxEMPT NC
D2 D2 2 DSR NC
D3 D3 5 RTS NC
D4 D4 1 DTR NC
D5 D5 TxRDY TxRDY
D6 D6 U28 RxRDY RxRDY
D7 D7 RxCLK
A0 C/D TxCLK
IOW WR RxD OUT1
IOR RD TxD
PCLK CLK 8251CS 3F8─3FF U27
RESET RESET CTS GND 8253
CLK1
T TTLIN 1.8432MHZ
T TTLOUT
L
232IN RXD
2
232OUT TXD
3
TTLIN1 NC
2 TTLOUT1 NC
U29 232IN1 NC
232OUT1 NC
电路图说明:
1.TxCLK和 RxCLK 分别为8251A的发送时钟和接收时钟,由8253的OUT1提供。
2.8251的片选端8251CS接译码电路输出3F8H-3FFH。
3.CTS端必须接地,8251A才可向外发送数据,其他回答信号(RTS、DTR、DSR)不用。
4. RxRDY、TxRDY为允许接收和允许发送信号,本系统中不用。
接收程序流程
调用显示“8251---2”子程序
读串口状态(接收缓冲区) N
判断允许接收否?
Y
读取串口数据存入RAM区
读串口状态(发送缓冲区) N
判断允许发送否?
Y
取刚才接收的数据发送
显示刚才接收的数
发送程序流程
用显示“8251---1”子程序 键值转换成显示代码
读键盘状态
读取串行口状态(发送缓冲区)
N N
判断有键否?
Y
允许发送否?
延时
Y
读取键值 Y 发送键值对应的显示代码
是数字键?
N
读取串口状态(接收缓冲区)
N
N
是MON键?
Y
允许接收否?
按MON键前未按过数字键?
Y
N
Y
显示“ERR”
显示“8251GOOD” 读取串行口数据
结束
Y
接收到的数据等于刚才发送的数据?
N
实验步骤:
显示“ERR”
1.准备 2 台实验系统,确定1号机为发送,2号机为接收。
2.将 1号机的RXD孔接2号机的TXD孔,
结束
将 1号机的TXD孔接2号机的RXD孔,两机共地线。
电路连接好检查无误后,方可打开电源。
3.先在2号机上运行接收程序,在命令提示符“-”下,按GO键,再输入F000:BE00,
按EXEC键,系统进入串行接收状态,数码管组显示“8251---2”。
4.再在1号机上运行发送程序,在命令提示符“-”下,按GO键,再输入F000:BD00,
按EXEC键,系统进入串行发送状态,数码管组显示“8251---1”。
5.在1号机的键盘上按动数字键(0~F),在2号机的数码管组上显示对应的数字。
6.按了数字键后,再按MON键,1号机数码管组上显示“8251GOOD”。若未按数字键第一次就按MON键,或双机通信不能正常进行,则显示“ERR”。
实验十 A/D 转换实验
实验目的: 了解 模/数 转换的基本原理, 掌握 ADC0809 模/数 转换芯片的使用方法。
实验内容: 1.0809 的 CLK孔接 500KHZ 的方波信号(分频电路Q4
输出孔),通道 0 的模拟量输入孔IN0 接电位器的中心抽头 (系统箱上的
W1 中心抽头孔)。
2.为同时锁存通道地址并开始 A/D 采样转换,将0809 的START 管脚与
ALE 管脚相连, 其输入控制信号为 CS 和 IOW。
3.用延时方式等待A/D转换的结果。 循环不断采样,边采样边显示A/D转换后的数字量, 并在数码管组上显示。模拟量和数字量间的对应关系的典型值为:
0V──00H、+2.5V──80H、+5V──FFH。
实验电路原理:
VCC 2-8 D0
W1 A 2-7 D1
地 D 2-6 D2
C 2-5 D3
IN0 IN-0 0 2-4 D4
IN1 IN-1 8 2-3 D5
IN2 IN-2 0 2-2 D6
IN3 IN-3 9 2-1 D7
IN4 IN-4 ADD-C
IN5 IN-5 ADD-B
IN6 IN-6 ADD-A
IN7 IN-7 0809CLK Q4
EOC EOC CLOCK
ALE VCC
START REF(+)
ENABLE 74LS393
RER(-)
分 频
A 8MHZ
地
74LS02 IOR
或非门
0809CS
0E0-0EF
硬件连接:
74LS02 1. 将0809CLK孔接分频电路输出孔Q4。
或非门 IOW
2. 分频电路(74LS393)正下方A孔接到8MHZ孔。
3. 0809CS孔(0809的片选端)接译码电路输出
孔0E0-0EF。
4. 0809通道0输入端IN0孔接电位器W1的中孔。
5.0809旁的短路块J2连在VCC端。
编程提示:
1. ADC0809的START端为A/D转换启动信号输入端,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和IOW,故启动A/D转换只需如下两条指令:
MOV DX,ADPOET (ADPORT是ADC0809的端口地址)
OUT DX,AL(发CS和IOW信号并送通道地址)
2. 用延时方式等待A/D转换结果,使用下述指令读取A/D转换结果:
MOV DX,ADPORT
IN AL,DX
3. 循环不断采样A/D转换结果,边采样边显示A/D转换后的数字量。
程序流程:
启动 0809 进行本次 A/D 转换
延时等待 A/D 转换结束
读取 A/D 转换结果
将结果转换为显示代码
调用显示子程序显示转换后的数字
实验步骤:
1. 按图连接好电路,检查无误后方可打开电源。
2. 在提示符“-”状态下,按GO键,显示“500 00”,输入F000:B000,按EXEC键, 数码管组显示“0809--XX”。
3. 调节电位器W1,数码管组上会不断显示新的转换结果。模拟量和数字量对应关系的典型值如下: 模拟量 数字量
0V 00H
2.5V 80H
5V FFH
4.按RESET键退出。
实验十一 D/A 转换实验一
实验目的: 了解 数/模 转换的基本原理, 掌握 DAC0832 芯片的使用方法。
实验内容: 1. 由 CS 片选信号确定 DAC 寄存器的端口地址, 然后锁存一个数据通过 0832 输出。
2. 产生方波的周期由延时常数确定。 在示波器上观察波形。
实验电路原理:
IOW WR1 ILE +12V
WR2 VCC +12V
D7 MSBD17 D Vref Vcc
‖ 地
D6 D16 A
Rfb
D5 D15 C Iout1 运 放
D4 D14 0 Iout2 电 路 OUT 示波器
D3 D13 8
GND
D2 D12 3 地
D1 D11 2 Xref
-12V
D0 MSBD10 CS
0832CS 0F0-0FF
硬件电路连接:
1. 0832片选端0832CS孔和译码电路输出孔0F0-0FF相连。
2. 将其832芯片旁的短路块J1连在VCC端。
3. 将系统电源线接直流稳压电源的 ±12V,蓝线接 +12V,黄线接 -12V。
4. 将0832芯片左侧的OUT孔接示波器。
编程提示:
1. 由 CS 片选信号确定 DAC 寄存器的端口地址, 然后锁存一个数据通过 0832 输出的典型程序如下:
MOV DX,DAPORT(DAPORT为0832的端口地址)
MOV AL,DATA
OUT
DX,AL (输出数据到0832)
2.产生方波的周期由延时常数确定。
程序流程: 调用显示“0832---1”子程序 实验步骤:
1.
按图接好电路,检查无误后方可打开
数据 00 送AL 寄存器 电源
2.在系统命令提示符“-”下,按GO键,
AL 中的数据输出到 0832 显示“500:00”,
输入F000:B100,
再按EXEC键, 数码管组显示
延时 “0832---1”。
3.用示波器测0832OUT的输出,应有方
取反 AL 中的数据 波,幅值为 –5V~0V。
实验十二 D/A 转换实验二
实验目的: 进一步掌握 数/模 转换的基本原理。
实验内容: 1. 硬件原理和电路连接同实验十。
2. 使 AL 中的数据从 00H 逐渐增加到 FFH, 产生溢出后再循环, 从而使
0832OUT产生连续不断的锯齿波, 在示波器上观察波形。
编程提示:
产生锯齿波的程序段可参考于下:
MOV
DX,DAPORT
MOV
AL,00H
KK: OUT DX,AL
INC
AL
JMP
KK
程序流程:
调用显示“0832---2”子程序
数据 00 送 AL 寄存器
AL 中的数据输出到 0832
AL 中数据增量
实验步骤:
1.按图接好电路,检查无误后方可打开电源。
2.在系统提示符“-”下,按GO键,数码管组显示“500 00”,输入F000:B200,
按EXEC键,数码管组显示“0832---2”。
3.用示波器测 0832OUT的输出,应有锯齿波波形,幅值为 –5V~0V。
实验十三 电传式水表计量、显示、报警系统工程(8253、8259、8255、8279)
实验目的: 设计并实现一个实用的综合实验。
实验要求:有一电传式水表,每流过100升水其信号线上产生一个正脉冲。要求设计一个系统,完成如下功能:
1.
统计并在数码管组上显示该表的用水量和剩余水费。
2.
当只有1吨水的剩余水费时,要自动报警。若水费用完,则自动停水。
3.
报警期间,若用户按任意键表示交纳了水费,则按新的剩余水费计算。
实验内容: 1. 该系统中要使用8253、8259、8255、8279芯片。
2. 8253的记数器2置于方式0,用于统计水表的正脉冲次数。将脉冲信号接CLK2
端,CLK2端接到1次正脉冲,则计1次数,计数达到规定值时,OUT2端向
8259 发一次3 号中断请求,并将计数值置0。CPU响应中断后执行3号中断
处理程序:
①.将中断次数加1(即用水量加100升),若中断次数满10次(用了1吨水),则将剩余水费减2,然后通过8279芯片在数码管上显示用水量和剩余水费。
②.若剩余水费为2,则通过8255驱动LED灯闪烁,发出报警。
③.报警期间,若用户按了任意键,则将水费置于初值,并解除报警。
④.若剩余水费为0,则停止供水(记数器停止记数)。
3.用8255的C口控制LED灯报警,C口置方式0,输出,方式控制字为90。
当剩余水费为2时,使其向单个数码管的a~g段轮流输出0FFH和0,使单管闪烁报警。
4.
用水量和剩余水费的显示通过8279控制数码管组(8个8段数码管)来实现。每次显示前,将用水量和剩余水费的数值转换为显示代码,再写入8279的数据口实现显示。
报警程序段流程:
主程序流程: 初始化8255、8253、8259
启动8253记数 按了数字键? Y
剩余水费置初值;用水量置初值 N
0FFH送8255 C口
显示用水量和剩余水费
稍延时
报警标志置0;改写3号和7号中断向量;开中断
① 00H送8255 C口
N 报警标志=1? 稍延时
Y
启动报警 剩余水费置初值;报警标志置0;转移至①
3号中断处理程序流程: 显示子程序流程:
关中断 将待显示的字符转换为显示代码
中断次数+1;显示中断次数 将8个显示代码写入一个数组中
(不显示的管位用0表示)
N
中断满10次? SI指向数组首地址;BX置0
Y
剩余水费-2;显示剩余水费 将[SI+BX]写入8279的数据口,
8279从右向左在数码管组上显示字符
中断次数置0
BX+1
Y
剩余水费>2 ?
N BX=8?
N
Y
剩余水费=0 ?
Y 结束
返回
N
报警标志置1
开中断
中断返回
7号中断处理程序流程:
关中断
显示“ERR”
结束
实验电路原理:
D7 D0 VCC +5V
D6 D1 8 WR IOW
D5 D2 2 RD IOR
D4 D3 5 CS 040 - 04F
D3 D4 3 A1 A1
D2 D5 A0 A0
D1 D6 CLK2
D0 D7 OUT2
CLK0 GATE2 +5V IR3
OUT0 CLK1 1.8432MHZ 8259
GATE0 GATE1 +5V U30
GND GND OUT1
8259CS1
CLK
060-06F
U28
8251
D0 D0 PC0 7 a
D1 D1 8 PC1 4 b
D2 D2 2 PC2 L 驱 c
D3 D3 5 PC3 S
d
D4 D4 5 PC4 2 动 e
D5 D5 PC5 4
f
D6 D6 PC6 4 g
D7 D7 PC7 h
A0 A0
DP
A1 A1 PB0 G
75451(驱动)
IOW WR PA0
IOR RD PA1
RESET RESET PA2
0F0-0FF 8255CS PA3
PA4
PA5
PA6
PA7
小键盘及数码管组控制电路原理参看实验七。
硬件线路连接:
①.8253 的 GATE2孔和 +5V 孔相连。
②.8253 的 CLK2 孔和 孔相连。
③.8253 的 OUT2孔和 8259 的 IR3 孔相连。
④.8259 的 8259CS1 孔和地址译码电路的 060-06F 孔相连。
⑤.8255A片选端8255CS孔和译码电路输出孔0F0-0FF相连。
⑥.将8255A芯片旁的短路块J5连VCC端。
⑦.8255A芯片PB0孔和其左边的G孔相连。
⑧.将G孔下方的短路块J6连在VCC端。
实验步骤:
1. 将实验系统与微机相连。
2. 按图连接好电路,检查无误后方可打开实验系统电源。打开微机电源。
3. 按附录在微机上建立源程序,汇编连接成执行文件,按附录给出的方法将执行文件发往实验系统,目标地址为0:1500H。
4. 按附录给出的方法,从微机大键盘或实验系统小键盘上执行该文件,此时数码管组显示初始用水量“00”和初始剩余水费“0A”。左边单数码管显示“H”,表示不报警。
5. 连续轻按脉冲按钮。每按10次按钮,用水量显示加1,剩余水费显示减2。
6. 当剩余水费显示减至“2”时,左边单数码管显示“0”,表示报警。此时,可继续按脉冲按钮。
7. 当剩余水费显示减至“0”时,左边单数码管显示“S”,表示水费已用完,报警期已过。此时若继续按脉冲按钮,数码管组的显示不会改变。
8. 报警开始后,若在小键盘上按一次数字键(表示交纳水费),则数码管组的显示立即恢复初始值,左边单数码管的显示立即恢复“H”,实验就可继续做下去。
实验十四 DMA实验
实验目的: 了解DMA实验的基本原理, 掌握8237DMA芯片的使用方法。
实验内容:用RAM到RAM传送方式,将DMA板上8000-83FFH中的内容传送到9000-93FFH中。
实验程序流程:
向8237发总清命令;向8237发清先后触发器命令
对8237四个通道的八个16位寄存器进行全1测试
对8237四个通道的八个16位寄存器进行全0测试
向8237发总清命令;向8237发清先后触发器命令
写8237命令寄存器:允许RAM到RAM传送、允许 8237工作
写通道0基地址8000H(先写低字节,后写高字节)
写通道1基地址9000H(先写低字节,后写高字节)
写通道0基字节3FFH(先写低字节,后写高字节)
写通道1基字节3FFH(先写低字节,后写高字节)
写工作方式寄存器:成组方式传送、0通道DMA读、1通道DMA写、地址自增
写屏蔽寄存器;写请求寄存器,启动8237工作
等待
实验步骤:
1. 将DMA卡和实验系统的总线信号用扁平导线对应相连,接上DMA卡的电源(红线为 +5V,黑线为
0V)。
2. 将DMA卡上的8237CS孔和实验系统的译码电路输出中的确00-01F孔相连。
3. 将实验系统和微机相连。
4. 按附录给出的源程序,在微机上建立源程序文件,并汇编连接为执行文件。
5. 按附录给出的方法,将执行文件发往实验系统,目标地址为0:1000H.
6. 按附录给出的方法,对8000-800FH单元赋值。
7. 按附录给出的方法,以断点方式执行程序,断点地址为1007H。
8. 退出运行状态,按附录给出的方法查看9000-900FH中的内容应和
8000-800FH中的内容一样。
实验电路原理图:
74LS244 A0~A7
A0~A7 A Y
1G 2G
8237A 地
A0-A3 A4--A7
HOLD HRQ CLK 址
XIOR IOR EOP
XMEMR MEMR DREQ0 总
XIOW IOW DACK0
XMEMW MEMW DREQ1 线
HOLDA HLDA DACK1
000-01F CS DREQ2
RESET RESET DACK2
READY RDY DREQ3 DACK3
D0~D7 DB0~DB7 AEN
数 ADSTB
据
总 G E A8~A15(驱动)
线 D0~D7 Q0~Q7
74LS373
A0~A12
D0~D7 OE XMEMR
6264 WE XMEMW
CS1 RAMCS
CS2 VCC
附录
一.DVCC8086十六位机实验系统简介
1.实验系统运行环境
直流电源 DVCC8086实验系统 PC机
该实验系统可单独作实验,也可与PC机相连作实验。
2.实验系统性能特点
①.CPU:8088 主频:4.77 MHZ 工作方式:最小工作方式
②.62256静态RAM一片,构成32K基本内存(0~07FFFH)。27256 EPROM(32K)一片,存放系统监控程序和12个实验程序,地址范围为F8000H~FFFFFH。
③.自带小键盘、数码管组显示器,具有DEBUG操作界面,使该系统能独立运行、调试
④. 提供标准RS-232异步通讯接口,使该系统可与PC机相连,故可开发设计新实验。
⑤.配有常用的各种可遍程接口芯片,如8253定时/记数器、8255并行口、8251串行口、8259中断控制器、ADC0809模/数转换器、DAC0832数/模转换器、8279键盘/显示器接口
等。
⑥. 配置一个PC总线输出孔排。若要作DMA实验,可将DMA卡插入系统总线输出孔排,并将系统与PC机相连。自行设计实验时,若要扩充实验电路,可将扩充板接入系统总线,并将系统与PC机相连。
⑦.带有开关组、发光二极管组、8段数码管、脉冲电路、分频电路、译码电路、模拟量输出电路。
⑧.可单步、断点调试各实验程序。
⑨.使用 +5V 电源。仅在作D/A实验时,需再接入±12V电源。
二.小键盘监控命令
可在小键盘上输入各种命令和数据。小键盘上共有24个键(16个数字键、8个功能键),大部分是多功能键。数字、寄存器及功能符号均印在键上。
1.小键盘功能符号解释如下:
功能符号 |
意 义 |
功能符号 |
意
义
|
EB |
字节读写 |
RESET
|
系统复位 |
ER |
寄存器读写 |
INTR |
无条件暂停,等待用户输入命令 |
GO |
连续执行 |
EXEC |
开始连续执行用户程序 |
ST |
单步执行 |
STEP |
开始单步执行用户程序 |
IB |
I/O口输入字节 |
MOVE |
程序块移动 |
OB |
I/O口输出字节 |
LAST |
地址减量 |
MV |
程序块移动 |
NEXT |
地址赠量 |
EW |
字读写 |
: |
段地址和偏移量之间的分隔符 |
IW |
I/O口输入字 |
MEM |
存储器、寄存器、I/O口读写命令执行键 |
OW |
I/O口输出字 |
MON |
除连续执行状态外,按下此键返回监控 |
2. 显示
数码管组由8个8段数码管组成,其显示内容及位置为
××××.××××
地址段 数据段
用户可通过小键盘输入监控命令和数码管组的显示完成下列操作:
读/写寄存器内容;
读/写存储器内容;
连续或单步来调试运行程序;
往I/O口读写数据。
3.监控命令
i.
显示/修改存储器字节单元
命令格式:EB××××:××××MEM 例. EB0000:1000MEM
②. 显示/修改存储器字单元
命令格式:EW××××:××××MEM
③. 显示/修改寄存器内容
命令格式:ER寄存器键MEM 例. ER AX MEM
④.从I/O口读字或字节数据显示
命令格式:IB(或IW)××××MEM
MEM
MEM
.
.
.
⑤. 向I/O口写字或字节数据
OB(或OW)××××MEM××(或××××)MEM
字节 字
⑥.存储器中数据块转移
命令格式:MV××××:××××NEXT××××NEXT××××:××××MOVE
起始地址 末地址 目的地址
⑦. 连续或断点执行程序
命令格式:GO××××:××××NEXT××××EXEC(执行到断点,按GO键继续)
起始地址 断点地址
或
GO××××:××××EXEC(连续执行)
⑧.单步执行程序
命令格式:ST××××:××××STEP
STEP
STEP
.
.
.
单步执行过程中若要修改起始地址,可键入新地址,再按STEP键。
三. PC机与DVCC8086实验系统间的通讯
1.进入串行监控状态
将DVCC8086系统的9芯插头插入PC机后面板上的COM1或COM2口,PC机加电,实验系统加电,PC机进入DV8086目录,再输入DVCC86〈CR〉,稍后屏幕显示“#”号,实验系统显示“8088 2.0” ,即进入串行监控状态。这时可通过安装在PC机上的DVCC86组合软件进行PC机与DVCC8086实验系统间的串行监控和通讯。
2..串行监控命令如下:
命令 |
功能和格式 |
S |
显示/修改存储器单元内容 S〈地址〉〈CR〉 |
R |
显示/修改寄存器内容 R〈寄存器〉〈CR〉 |
D |
显示存储数据块
D〈起始地址〉,〈末地址〉〈CR〉 |
M |
传送存储数据块
M〈起始地址〉,〈末地址〉,〈目标地址〉〈CR〉 |
I |
接受并显示I/O口数据 I〈口地址〉〈CR〉 |
O |
输出数据到I/O口
O〈口地址〉,〈数据〉〈CR〉 |
G |
执行用户程序
G〈起始地址〉,〈断点地址〉〈CR〉 |
N |
单步执行用户程序
N〈起始地址〉〈CR〉 |
F |
反汇编显示程序代码
F〈起始地址〉,〈末地址〉〈CR〉 |
注:
S命令
按字节或字读写,按“,”则地址增量再显示,按“空格”则地址减量再显示,输入16进制数后再按“,”则改写单元内容,按〈CR〉则返回监控。
R命令若缺省寄存器名,则依次显示14个寄存器的内容,次序为
AX BX CX DX SP BP SI DI CS DS SS ES IP
FL。
D命令若缺省末地址,则显示80H个字节或字内容;若缺省起始地址,则接着上次继续显示。
F命令若缺省末地址,则反汇编11条指令;若缺省起始地址,则接着上一次继续反汇编。
S命令末地址不含段地址。
I命令和O命令的口地址无段地址,且地址在64K范围内。
N命令若缺省起始地址,则从IP所指指令开始;每单步执行后若按“Y”或“C”(仅当CALL指令)则继续,否则停止并返回监控。
G命令若缺省起始地址则从IP所指指令开始执行,若缺省断点地址则连续执行。
3. 文件传送
A. 从PC机向实验系统发送 .EXE执行文件
#ΛF2
Enter
filespec(ESC TO QUIT):[路径]执行文件名〈CR〉
Enter
DCVV8086-B RECV-buffer startaddress:(eg. 0:100<CR>Esc To Quit)目标地址〈CR〉
…
#(此时,已将指定的执行文件发往实验系统指定的目标地址。可用串行监控命令或小键盘监控命令执行该文件)
B. 从实验系统向PC机接受缓冲区发送数据
#F7
Enter
DCVV8086-B SEND-buffer startaddress:( Esc To Quit)数据首地址〈CR〉(含段地址)
Enter
DCVV8086-B SEND-buffer ENDaddress:( Esc To Quit)数据末地址〈CR〉(不含段地址)
…
#
C. 显示用F7命令接受到的数据
#F5
Display
data in recive buffer
Display
data or ASCII Code(0dh=Data):首地址<CR>(若不输入首地址,则首地址为0)
Continuing?(Y/address/N
or Esc to Quit) (若继续显示,按“Y“)
.
.
#
D. 将PC机中用F7命令接收到缓冲区中的数据写入指定文件
#F3
* Note: End
address is ××××
Enter start
address(ESC to Quit):数据首地址〈CR〉(若不输入首地址,则首地址为0)
Enter END
address(ESC to Quit): 数据末地址〈CR〉(若不输入末地址,则默认缺省值)