微机原理及应用试验指导书

更新时间:2023-03-11 23:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理及应用实验指导书

董珂 编写

电气与自动化工程学院专业实验中心

2006年9月

目录

第一章 系统概述 .............................................................. 1

系统组成 ................................................................... 1 系统介绍 ................................................................... 1 系统资源分配 ............................................................... 2

第二章 软件实验 .............................................................. 3

实验一 实验二 实验三 实验四 实验五 实验六 实验七 实验八 实验九

内存操作数及寻址方法 ............................................. 4 清零程序 ......................................................... 8 逻辑运算程序 ..................................................... 9 拆字及位移程序 .................................................. 10 拼字程序及分支程序、堆栈程序 .................................... 12 数据区移动 ...................................................... 14 数据排序实验 .................................................... 16 串操作 .......................................................... 18 32位二进制乘法 .................................................. 22

实验十 多分支程序设计 .................................................. 25

实验十一 子程序 ........................................................ 29

第三章 硬件实验 ............................................................. 33

实验一 实验二 实验三 实验四 实验五 实验六 实验七

简单I/O口扩展 .................................................. 33 8259中断控制器实验 .............................................. 35 8255A并行口实验(一)方波 ......................................... 40 8255A并行口实验(二)PA输入,PB输出 .............................. 42 8255A并行口实验(三)控制交通灯 ................................... 45 定时/计数器 8253方波 ........................................... 49 8253实验二 ...................................................... 52

实验八 继电器控制 ...................................................... 55

实验九 8251串口实验(一) 自发自收 ....................................... 57 实验十 8251串口实验(二) 8251发送26个字母.............................. 61 实验十一 步进电机控制 .................................................. 65 实验十二 实验十三

时、分、秒显示实验 ............................................ 67 8259中断嵌套 .................................................. 72

第四章 仿真实验系统键盘监控简介.............................................. 73

键盘/显示使用 ............................................................. 73 键盘监控程序简介 .......................................................... 73

第一章 系统概述

系统组成

Dais系列单片机微机仿真实验系统的8088/8086微机接口实验是由管理CPU89C52单元、目标CPU8088/8086单元、接口实验单元和内置稳压电源组成,通过RS232C串行接口与PC微机相连,系统硬件主要内容如下: CPU 系统存储器 接口芯片 及单元实验 管理CPU89C52、目标CPU8032/78E438 监控在89C52内E2PROM(8K)、RAM6264、RAM61256(32K)一片、BPRAM61256(32K) 8253、8255、8259、ADC0809、DAC0832、6264、164、273、244、393分频、电子发声单元、电机控制单元、开关及发光二极管、单脉冲触发器、继电器控制、16X16点阵、8155扩展3X3键盘、四位LED显示、PC总线扩展单元及8251、8250串行通讯等。 外设接口 显示器 键盘 系统电源 打印接口、RS232C串口、D/A驱动接口、步进电机驱动接口、音频驱动接口、PC总线接口、2X16LCD液晶显示接口 6位LED、双踪示波器 32键自定义键盘 +5V/2A、±12V/0.5A EPROM编程器 对EPROM2764/27128快速读出 系统介绍

(1) 自带键盘、显示器,能独立运行,也可以PC微机为操作平台。(注意:PC微

机必须与本实验系统保持联机状态,即软件界面右上角有编译进度条)

(2) 系统采用紧耦合多CPU技术,用89C52作为系统管理CPU,8088/8086作为目标接口扩展实验CPU。

(3) 目标CPU8088/8086采用主频为14.3818MHZ,系统以最小工作方式构成。 (4) 配有1片6264构成系统的8K基本内存,地址范围为0F000:0000H—07FFH,

作为监控程序区和数据区,另配1片61C256(32K)作为实验程序空间,地址从0000:0000H—FFFFH(其中0—003FFH作为目标机中断向量区),还配1

片61C256(32K)作为用户设置的断点区(BPRAM)。

(5) 系统接口实验电路为单元电路方式,数据总线以8芯扁平线形式引出,硬件学生连线为电路图上粗实线。

(6) 通过RS232通信接口,利用上位机实现用户程序的编辑、编译和调试运行。(注意:上位机的存盘文件名只能用英文字母和数字组合,长度不能超过8位且存

盘路径必须在默认的C盘DAIS目录下)

(7) 系统可无限制设置断点,同时具有单步、宏单步、连续运行及无限制暂停等功能。

(8) 自带EPROM编程器,可对2764/27128快速读出(软硬件实验所需的代码文件)。

1

系统资源分配

(1) 实验系统寻址范围定义如下:

系统数据区 系统堆栈区 系统程序区 用户程序区 用户数据区 用户堆栈区 中断向量区

接口芯片 74LS273 74LS273 74LS245 8255A口 8255B口 8255控制口

口地址 FFDDH FFDCH FFDEH FFD8H FFD9H FFDBH 用途 字位口 字形口 键入口 EP总线 EP地址 控制字 F000:0000—00FFH F000:0100—01FFH F000:0200—02FFH 0000:1000—7FFFH 0000:1000—7FFFH 0000:0600—0400H 0000:0000—03FFH (2) 系统已定义的I/O地址如下:

2

第二章 软件实验

本实验仪器CS、DS、ES段地址相同(0000H),使用范围0000:1000—7FFFH。

实验仪上的波段开关都必须拨在中间(一个是选择波特率,一个是选择8088系统)

先新建个文件,文件后缀为ASM,文件的存盘文件名只能用英文字母和数字组合,长度不能超过8位且存盘路径必须在默认的C盘DAIS目录下,然后点编译、连接、装载,如程序有语言错误,会自动提示,确定后点击相应的错误提示,会自动跳到对应的错误行上,修改错误后再编译连接装载,完成后程序等待执行,在软件连续执行结束后,要点击暂停键(否则实验台处于执行状态Г,如果不返回监控状态P,继续操作,会造成同上位PC机通讯中断),然后去查看相应的寄存器和数据存储单元,验证程序结果是否正确。

3

实验一 内存操作数及寻址方法

实验目的

8088指令:

MOV,ADD,ADC,SUB,SBB,DAA,XCHG

8088寄存器: AX,BX,CX,DX,FL,IP

BCD码,用16进制数表示二进制码的方法。

8088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。 8088汇编语言伪操作:BYTE PTR,WORD PTR。 求累加和程序和多字节加减法程序

实验内容

(按照实验装置要求的程序格式输入程序后单步调试): 示例:

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ;定义段

ORG 2000H ;此代码段起始地址偏移2000H SL: 。。。。。。。 ;程序第一条可执行语句的标号名 。。。。。。。 。。。。。。。 JMP $ CODE

注解:因为实验装置中存储范围不超过64K,即不超过一个段的范围,所以对段的定义都是在一个段内

[ ASSUME

CS:CODE,DS:CODE,ES:CODE ]段值都为0000H; 用户程序区 用户数据区 ORG

通过实验掌握下列知识

0000:1000—7FFFH 0000:1000—7FFFH ;死循环,目的是强制程序结束

ENDS ;标记汇编源程序结束 END

SL ;后面带的标号为主程序模块中的标号名称

2000H ;此代码段起始地址必须在上面指定范围内(1000—7FFFH);

SL: 。。。 ;程序第一条可执行语句的标号名可自己按要求定义。

8088常用指令练习

1、传送指令

在内存1000H处写入下列程序:

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG SL: MOV MOV

1000H AX,1234H BX,5678H

XCHG AX,BX MOV AH,35H MOV

AL,48H

4

MOV DX,75ABH

XCHG AX,DX JMP $ CODE ENDS END SL 2、加减法指令

在内存2000H处写入下列程序:

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG

2000H

SL: MOV AH,34H

MOV AL,22H ADD AL,AH SUB AL,78H MOV CX,1284H MOV DX,5678H ADD CX,DX SUB CX,AX SUB CX,CX

JMP

CODE ENDS

$

END SL 3、带进位加减法

在内存3000H处写入下列程序:

CODE

SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3000H SL: MOV AH,12H MOV AL,84H MOV CH,56H

MOV CL,78H ADD AL,CL ADC AH,CH MOV DH,0A7H MOV DL,58H SUB DL,7FH SBB DH,34H

JMP

CODE ENDS

$

END SL

上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。

4、BCD码加减法 CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

5

ORG 4000H

SL: MOV AL,58H ADD AL,25H DAA JMP $ CODE ENDS END SL 5、标志位显示

在单步执行程序时,检查PSW标志寄存器值,其值为16进制,换成2进制查看相应位的值。 15 11 10 9 8 7 6 4 2 0 标志名

OF DF IF TF SF ZF AF PF CF PSW中标志位的符号表示:

标志为1 标志为0

OV DN EI NG ZR AC PE CY

NV UP DI PL NZ NA PO NC

OF 溢出 DF 方向 IF 中断 SF 符号 ZF 零 AF PF CF

奇偶 进位

(是/否) (减/增量) (负/正) (是/否) (偶/奇) (是/否)

(允许/关闭)

辅助进位(是/否)

6、内存操作数及各种寻址方式使用: CODE SEGMENT ASSUME ORG SL: MOV MOV

MOV MOV MOV INC MOV DEC MOV MOV MOV MOV

CS:CODE,DS:CODE,ES:CODE 5000H

AX,1234H

DS:[1000H],AX BX,1002H

BYTE PTR[BX],20H DL,39H BX

[BX],DL DL

SI,0003H [BX+SI],DL [BX+SI+1],DL

WORD PTR[BX+SI+2],2846H

$

JMP CODE ENDS

SL

END

注意:

用户程序区 用户数据区 0000:1000—7FFFH 0000:1000—7FFFH 由于实验装置的存储空间不超过64K,程序区和数据区都在(0000:1000—7FFFH)中,所以我们

6

必须通过偏移地址的不同加以区分。

在利用存储空间存放数据时,其偏移地址必须避开程序存放的偏移地址,在上面的程序中程序的

存放地址是从5000H开始的(ORG 5000H),那么程序中要保存AX值在内存单元中时就不能是5000H,我们将其放在了1000H中(MOV

DS:[1000H],AX)。

思考:有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。

7、求累加和程序:

从内存地址1000H开始依次键入16个字节数,利用程序求和

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG

6000H BX,1000H CX,10H AX,AX AL,[BX] AH,0 BX LOP $ SL

SL: MOV

MOV SUB LOP: ADD

ADC

INC

LOOP JMP CODE ENDS

END

思考:上述程序求和的结果保存在哪?如要将结果保存在2000H应如何修改。

提示:程序执行后如结果保存在寄存器中不适宜用连续执行,利用单步执行执行到最后一句后查看寄存器内容。

8、多字节加法程序。

在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。

CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE ORG SL: MOV

MOV

MOV CLC LOP: MOV

ADC

INC INC

7000H DI,1000H CX,8 SI,2000H AL,[SI] [DI],AL SI DI

$

LOOP LOP

JMP

CODE ENDS END

9、自编程序: 实验步骤

写成完整的实验程序,用单步运行查看对应的寄存器和存储单元的变化。

SL

用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同上题。调试并做记录。

7

实验二 清零程序

实验目的

掌握8088汇编语言程序设计和调试方法,熟悉键盘操作。

实验内容

把RAM区内4000H-40FFH单元的内容清零 。

程序框图及程序

CODE

SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3000H

SL:

MOV MOV MOV

LL:

MOV INC INC LOOP JMP

CODE

ENDS END SL

BX, 4000H AX, 0000H CX, 0080H [BX],AX BX BX LL $

;循环

实验步骤

用连续或单步方式运行程序,检查4000-40FFH内容执行程序前后的变化。

思考

假使把4000H-40FFH中的内容改成FF,如何修改程序; 如果把4000H-40FEH中的内容改成FF,如何修改程序; 试编写一到二种其它方法实现的清零程序。

8

实验三 逻辑运算程序

实验目的

8088指令:AND OR XOR NOT

实验内容

将字单元内容二进制最高位清“0”

自己先在3040H单元放个二进制首位为1的字,结果保存在3042H中(注意:字的高位在后)

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3000H

START: MOV AX,DS:[3040H]

AND

MOV

CODE

AX,7FFFH

DS:[3042H],AX

JMP $ ENDS

END START

将单元内容最高位置“1”

思考:如果屏蔽最低位,应如何修改?

将字的二进制最高位置“1”

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 4000H

START: MOV AX,DS:[1200H] OR AX,8000H MOV DS:[1202H],AX JMP $ CODE ENDS

END START

思考:其余位置“1”如何修改?

将字节单元内容二进制最高位求反

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 5000H

START: MOV AL,DS:[2200H] XOR AL,80H

MOV DS:[2201H],AL JMP $ CODE ENDS END START

思考:

如果要求反任一位或几位,应如何修改? 若将NOT指令加上完成上述程序,应如何修改?

9

实验四 拆字及位移程序

实验目的

掌握汇编语言 设计和调试方法。

实验内容

把4000H单元的字节内容拆开,高位送4001H低位,低位送4002H低位,4001H、4002H 的高位清零,一般本程序用于把数据送显示缓冲区时用。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

S2:

ORG MOV MOV MOV MOV SHR INC MOV AND INC MOV JMP ENDS

3000H BX,4000H AL,[BX] AH,AL CL,4 AH,CL BX

[BX],AH AL,0FH BX

[BX],AL $

CODE

END S2 实验步骤

用连续或单步方式运行程序,检查4000H-4002H中内容变化情况。

思考

如何用断点方式调试本程序;

如果高位送4002H低位,低位送4001H低位,如何修改。

位移程序

16位数左移一位

在1200H单元放一个字,移位结果在1202H单元里查看

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

10

ORG START: MOV

SHL MOV HLT CODE

2000H

AX,DS:[1200H] AX,1

DS:[1202H],AX

ENDS

END START

思考:上述程序中SHL是否可以改用SAL?用指令在用法上有无区别?

若为8位数左移一位,如何修改程序?

试编写32位数右移二位程序(提示:利用带进位位移)

11

实验五 拼字程序及分支程序、堆栈程序

实验目的

进一步掌握汇编语言设计和调试方法 。

实验内容

把4000H、4001H的低位分别送入4002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成一个字节。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 3040H

S3: MOV BX,4000H

MOV AX,[BX] AND AL,0FH MOV CL,4 SHL AL,CL AND AH,0FH OR AL,AH ADD BX,2 MOV [BX],AL JMP $

CODE ENDS END S3 实验步骤

单步或用断点方式运行程序,检查4002H内容变化情况。

分支程序

计算 Y=X+5 X<0

Y=X+25 0<X<25 Y=X+100 其它

利用单步执行查看变化,X值按16进制分别放入初值,填入AX中;单步到HLT时查看BX中Y值 注意:题目中为10进制,内存中要换成16进制。

其中X放入AX中 Y在BX中

CODE SEGMENT

12

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 3000H

START:AND AX,AX JLE LESSE CMP AX,25

JC ADD

BELLOW AX,100 BX,AX $ AX,5 BX,AX HALT AX,25 BX,AX HALT START

MOV HALT: JMP LESSE: ADD

MOV JMP

BELLOW:ADD MOV CODE

思考题:

JMP ENDS END

有一个按从小到大顺序排列的无符号数的数组,其首地址存放在DI寄存器中,数组中的第一个单元

存放着该数组的长度。在AX中放一个无符号的数,要求在该数组中查找(AX),如找到则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到则使CF=1。编写程序实现。(试用折半查找法)

堆栈程序 利用单步观察堆栈指针和堆栈指针所指的存储单元内容的变化,熟悉堆栈的用法。 CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE

SL:

ORG MOV

3000H SP,2000H AX,3000H BX,5000H AX BX AX BX $

MOV MOV PUSH PUSH POP POP JMP CODE ENDS END SL

13

实验六 数据区移动

实验目的

掌握RAM中的数据操作

实验内容

把4100H源RAM区首址内的16字节数据传送到4200H目标RAM区 。

设计思想

程序要求把内存中一数据区(称为源数据块)传送到另一存储区(称为目的数据块)。源数据块和目的数

据块在存储器中可能有三种情况,如下图:

对于两个数据块分离的情况,如图(a),数据的传送从数据块的首址开始,或者从数据块的末址开始均可。但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。

可以得出以下结论:当源数据首址>目的块首址时,从数据块首址开始传送数据(见c图); 当源数据块首址<目的块首址时,从数据块末地址开始传送数据(见b图)。

程序框图及程序

14

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 3060H

S4: MOV CX,0010H MOV SI,4100H

MOV DI,4200H CMP SI,DI JA A42 ADD SI,CX ADD DI,CX DEC SI DEC DI MOV AL,[SI] MOV [DI],AL LOOP A41 JMP $ MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP A42

A41:

A42:

JMP $ CODE ENDS END S4 实验步骤

调试运行3060程序,检查4100-410FH中内容是否和4200-420FH中内容完全一致; 将源数据首址改为4100H,目的数据地址改为410AH,再加以验证; 将源数据首址改为410AH,目的数据地址改为4100H,再加以验证。

15

实验七 数据排序实验

实验目的

熟悉8088指令系统,掌握程序设计方法。

实验内容

编写并调试一个排序子程序,其方法为用冒泡法将RAM中几个单字节无符号的正整数,按从大到小的次序重新排列。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 3090H S5: MOV CX,000AH A53: MOV BX,4000H PUSH CX

A52: MOV AX,[BX] CMP AL,AH JC A51 A54: INC BX

LOOP A52 POP CX LOOP A53 JMP $

16

A51: XCHG AL,AH MOV [BX],AX

JMP A54 CODE ENDS END S5 编程提示

(1)从第一个数开始,依次把相邻的两个数进行比较,即第(N-2)个数与第(N-1)个数比较,第(N-1)个数与N个数比较等等;若第(N-1)个数不大于第N个数,则两者交换,否则不交换,直到N个数的相邻两个数都比较完为止。此时,N个数中的最小数将被排在N个数的最后。

(2)对剩下的(N-1)个数重复第(1)步,找到(N-1)个数中的最小数。 (3)重复第(2)步,直到N个数全部排序好为止。

实验步骤

在4000H-400AH中输入不等的10个数,运行本实验程序后检查4000H-400AH中内容是否按从大到小排列。在和PC机联机时,用连续单步方式,可很清楚地看出数据排序时数据移动变化情况。

思考

注意两个循环是如何循环的,如果想减少判断次数,比如说几次交换后就不再有数据交换了,如何修改程序来减少程序执行时间;

编一程序把4000H-400AH中内容按从小到大排列; 如果是有符号数怎么改写程序。

17

实验八 串操作

实验目的

熟悉汇编语言编程,掌握串操作指令的使用。

熟悉串操作[程序前后自行补完整]

1.MOVSB/MOVSW程序:

将源地址100字节传送到目的地址

| MOV MOV MOV CLD REP |

上面的程序段相当于下面的循环程序段

SI,1000H DI,2000H CX,100 MOVSB

| MOV MOV MOV K: MOVSB DEC JNZ

SI,1000H DI,2000H

CX,100 CX K

|

2.CMPSB/CMPSW程序 比较4个字节的内容是否相同

| MOV MOV CLD MOV REPZ JZ RET

CX,4 CMPSB DONE DI,1000H SI,2000H

DONE: |

3.SCASB/SCASW程序

假设AL中为接收到的一个字节,1000H开始的4个单元中存放4个字节数据,如果AL中数据与4个

字节中的某一个相等,则在2000H开始的对应单元中加1。

MOV CLD MOV MOV

DI,1000H CX,4 DX,CX

18

REPNZ JNZ SUB DEC MOV INC AAA: |

SCASB AAA DX,CX DX

DI,DX

BYTE PTR [DI+2000H]

4.LODSB/LODSW程序

将1700H单元开始的5个字节的内容逐一取来,放在累加器中进行处理,处理完后再送到1700H的

内存区域。

CLD MOV MOV LI:LODSB

PUSH | POP DEC MOV JNZ

SI,1700H CX,5 CX

;处理字符

CX CX

[DI],AL LI

5.STOSB/STOSW程序

将1000H开始的256个单元清0

CLD LEA MOV XOR REP 思考题:

DI,DS:[1000H] CX,0080H AX,AX STOSW

下面这一程序段的功能是:将数据段中buf单元开始的50个字节数据中非负数和负数分开,分别存到pbuf和nbuf开始的单元,并将非负数和负数的个数分别存到pcnt和ncnt单元。填写下列程序中的空白以保证程序的正确性。这段程序是用什么方式控制循环的?写成完整程序调试。

push mov mov lea lea lea mov mov

es ax,ds es,ax bx,pbuf di,nbuf si,buf dx,0

cx,

next: lodsb

and j mov

al,al next2 [bx],al

19

inc

inc jmp

next2: stosb

inc

bx dh

dl

next1:

mov pcnt,dh

mov pop ret

ncnt,dl es

实验内容

在4000H-400FH中查出有几个字节是零,把计数个数放在4100H中。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 30B0H S6:

A62: A63: A61: CODE

MOV BX,4100H ;COUNT MOV AX,0000 MOV [BX],AX MOV CX,0010H MOV DI,4000H CLD SCASB JZ A61 LOOP A62

JMP $

INC BYTE PTR [BX] JMP A63 ENDS END S6

20

实验步骤

在4000-400FH的几个单元中输入零,运行本程序后检查4100H中是几个单元数。

思考

修改程序,查找其它内容;

如果查找的是字或双字,如何修改程序。 思考题:

一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址

存放在DI寄存器中。在AX寄存器中存放一个数。要求编写一程序:在数组中查找该数,如果找到此数则把它从数组中删除。

将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和

ARRAY_END,其中所有数均为正数且已按递增的次序排列。

21

实验九 32位二进制乘法

实验目的

掌握8088汇编语言程序设计方法,熟悉二进制乘法指令的使用。

实验内容

进行两个32位无符号二进制的乘法运算。

实验预备知识

本程序是利用无符号二进制数乘法指令。

设计思想

如下图所示,设A、B为被乘数的高、低16位二进制数,C、D为乘数的高、低16位二进制数,则:

N1N2×N3N4=(A×2+B)×(C×2+D) =BD+AD×2+BC2+AC2

16

16

32

1616

通过分析可知,共需进行四次乘法运算,每次进行两个16位二进制数的乘法,共得到四个部分积,然后再求部分积累加和。

×﹞ ACH ×﹞ ︳—32位— ︳ A C BDH ADL BCL B D BDL ADH BCH ACL M2单元 累加和存入 M1单元 M3单元 M4单元

30DB-30DC 30DD-30DE 30DF-30E0 30E1-30E2

64位积在内存中的存放格式:

积最高位 H1 30DC

M1 L1 30DB H2 30DE M2 L2 30DD H3 30E0 M3 L3 30DF H4 30E2 M4 L4 30E1 CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 30D0H S7: JMP START N1 DW ? N2 DW ? N3 DW ?

22

N4 DW ? M1 DW 0 M2 DW 0 M3 DW 0 M4 DW 0 START: MOV AX,N2 MUL N4 MOV M4,AX MOV M3,DX MOV AX,N4 MUL N1 ADD M3,AX ADC M2,DX MOV AX,N3 MUL N2 ADD M3,AX ADC M2,DX ADC M1,0 MOV AX,N3 MUL N1 ADD M2,AX ADC M1,DX JMP $ CODE ENDS

END S7 实验步骤

在30D3H-30DAH中即?中输入无符号整数的字,为N1-N4的值,连续或单步运行本实验程序后检查30DBH -30E2H中即M1-M4的内容。[注意:?必须改为自行添入的原始数值后编译执行]

阶乘实验 求1到10的阶乘之和;

方法是利用提取公因式的方法:1!+2!+3!+??+10!={[(10*9+9)*8+8]*7??+1}

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 1000H Start: MOV SI,0 MOV DI,0 MOV CX,10 LP: CALL MULTI ADD SI,CX ADC DI,0 LOOP LP

MOV DS:[2000H],SI MOV DS:[2002H],DI JMP $

23

MULTI PROC

MOV AX,SI MUL CX MOV SI,AX MOV AX,DI MOV DI,DX MUL CX ADD DI,AX RET MULTI ENDP CODE ENDS END Start

要求:画出程序框图

24

实验十 多分支程序设计

实验目的

掌握汇编语言的编程,熟悉程序散转的设计方法。

实验内容

编写程序,根据送入的数据转移运行。

设计思想

多分支结构相当于一个多路开关,在程序设计中通常是根据某寄存器或某单元的内容进行程序转移。在设计多分支转移程序时,如果分支太多,则平均转移速度太慢,本实验采用转移地址表实现多分支转移,可以提高平均转移速度。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3130H

S8: JMP A81

TAB DW LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7 DW LED8,LED9,LEDA,LEDB,LEDC,LEDD,LEDE,LEDF A81: MOV BX,OFFSET TAB MOV SI,4000H

MOV AL,[SI] AND AL,0FH SHL AL,1 MOV AH,00H ADD BX,AX

;左移一位相当于乘2,因为地址表地址是字存放

JMP [BX] LED0: MOV AL,0C0H JMP LEDX

25

LED1: MOV AL,0F9H JMP LEDX LED2: MOV AL,0A4H JMP LEDX LED3: MOV AL,0B0H JMP LEDX LED4: MOV AL,99H JMP LEDX LED5: MOV AL,92H JMP LEDX LED6: MOV AL,82H

JMP LEDX

LED7: MOV AL,0F8H JMP LEDX LED8: MOV AL,80H JMP LEDX LED9: MOV AL,90H JMP LEDX LEDA: MOV AL,88H JMP LEDX LEDB: MOV AL,83H JMP LEDX LEDC: MOV AL,0C6H JMP LEDX LEDD: MOV AL,0A1H JMP LEDX LEDE: MOV AL,86H JMP LEDX LEDF: MOV AL,8EH JMP LEDX LEDX: MOV DX,0FFDCH

OUT DX,AL MOV CL,20H

MOV DX,0FFDDH

LEDX1: MOV AL,CL OUT DX,AL PUSH CX CALL DLL POP CX ROR CL,1

JMP LEDX1

DLL: MOV BX,0020H DL1: DEC BX CMP BX,0000

26

JZ DL3

MOV CX,04FFH

LOOP $

JMP DL1 DL3: RET CODE ENDS END S8

编程提示

字形口和字位口都是控制数码管的,字形口地址连接在保存代码数据的一片数据缓冲器74LS273的CLK上,若有效则让数码管显示相应的代码显示,字位口地址是连接在另一片74LS273的CLK上,输出Q1-Q6分别接在实验仪的6位数码管上,若有效则负责开通具体哪个数码管,实验台有6个数码管,最高两位缺省,对应数据为1则开通显示。

字形口地址:FFDCH 字位口地址:FFDDH 键扫显示控制电路:

LED数码管0-F的字形代码: 0 C0 1 2 3 B0 4 5 6 82 7 8 9 A B C C6 D A1 E 86 F 8E 灭 FF F9 A4 99 92 F8 80 90 88 83 D0-D7分别对应相应的发光管,为1发光管灭,为0亮,例如:C0为1100 0000则

显示“0”

27

6位LED数码管的字位代码(从左到右,最高两位缺省):

字位 代码 1 20 2 10 3 08 4 04 5 02 6 01 相应位的位码为1,则该数码管允许输出,如位码输出为0000 0001则最右一位数码管导通。

实验步骤

在4000H中分次输入00,01,02?0F,每次运行程序后,观察数码管上数字循环情况; 搞清楚显示的方法和延时的作用以及是如何延时的。 思考题:

如何显示多位(例如显示AAA循环右移,显示ABC左移);

有一个首地址为MEM的100D字数组,编写程序删除数组中所有为0的项,并将后续项想前压缩,最

后将数组的剩余部分补上0。

数据段中已定义了一个有N个字数据的数组M,编写一程序求出M中绝对值最大的数,把它放在数据

段的M+2N单元中,并将该数的偏移地址存放在M+2(N+1)单元中。

28

实验十一 子程序(选做)

实验目的

掌握LED显示器的显示过程;递归调用子程序。

实验内容

编写程序,依次闪动显示“dais88”“good”。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 31E0H

S9: JMP START9 ZXK EQU 0FFDCH ZWK EQU 0FFDDH

LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H BUF DB ?,?,?,?,?,?

START9: MOV CX,0005H ;\A90: PUSH CX

A91: MOV BX,OFFSET BUF MOV AX,0A0DH

MOV [BX],AX ADD BX,2 MOV AX,0501H MOV [BX],AX ADD BX,2 MOV AX,0808H MOV [BX],AX

MOV CX,0050H ;ONLED,TIME CALL DIS POP CX LOOP A92

A92: PUSH CX

29

MOV CX,0003H

MOV AX,1010H MOV BX,OFFSET BUF A93: MOV [BX],AX INC BX

INC BX LOOP A93

MOV CX,0020H ;OFFSET,TIME A94: PUSH CX CALL DIS POP CX LOOP A94 POP CX

LOOP A90

;------------------- MOV CX,0005H ;\A99: PUSH CX

A95: MOV BX,OFFSET BUF MOV AX,0009H MOV [BX],AX ADD BX,2 MOV AX,0D00H MOV [BX],AX ADD BX,2

MOV AX,1010H

MOV [BX],AX

MOV CX,0050H ;ONLED-TIME

A96: PUSH CX CALL DIS POP CX LOOP A96

MOV CX,0003H MOV AX,1010H

MOV BX,OFFSET BUF

A97: MOV [BX],AX INC BX INC BX

LOOP A97

MOV CX,0020H ;OFFSET-TIME

A98: PUSH CX CALL DIS POP CX LOOP A98

POP CX

30

LOOP A99

JMP START9

;-------------------------- DIS: MOV CL,20H MOV BX,OFFSET BUF DIS1: MOV AL,[BX] PUSH BX

MOV BX,OFFSET LED XLAT POP BX MOV DX,ZXK OUT DX,AL MOV AL,CL MOV DX,ZWK OUT DX,AL PUSH CX

MOV CX,0100H DELAY: LOOP $ POP CX

CMP CL,01H JZ EXIT

INC BX SHR CL,1 JMP DIS1 EXIT: MOV AL,00H MOV DX,ZWK OUT DX,AL RET CODE ENDS END S9

实验步骤

连续运行31E0程序,观察数码管显示情况。 思考题:

将课本上所学的关于利用堆栈传递参数和递归调用等子程序上机调试。

求N!的递归调用子程序:

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3490H S: JMP START D1 DB 4

D2 DW 2 DUP(?) START: MOV DX,0 MOV AH,0

31

MOV BX,OFFSET D1

MOV AL,[BX] CALL FACT

MOV [BX+1],DX JMP $ FACT: CMP AL,0 JNZ CHN MOV DL,1 RET

CHN: PUSH AX DEC AL CALL FACT POP AX MUL DL MOV DX,AX RET CODE ENDS END S

32

第三章 硬件实验

硬件实验按硬件图连线,学生只需要连接粗实线(插拔线的时候一定要断电源,防止短路烧毁芯片,线接好后须教师检查认可,方可上电),进一步掌握8088微机系统扩展和输入输出程序的设计方法,熟悉对扩展系统的软件、硬件设计、调试方法和技巧。

实验一 简单I/O口扩展

实验目的

学习系统中扩展简单I/O口的方法。学习数据输入输出程序的编制方法。

实验内容

利用74LS244作为输入口,读取开关状态,并将此状态,通过74LS273再驱动发光二极管显示出来。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3380H ;273,244 PIO1 EQU 0FFE0H PIO2 EQU 0FFE4H P4: MOV DX,PIO1 IN AL,DX MOV DX,PIO2 OUT DX,AL JMP P4 CODE ENDS END P4

实验电路

33

实验步骤

(1)244输入接K1-K8,273输出接L1-L8,读写用IOWR、IORD。 (2)连续执行程序,拨动K1-K8,观察L1-L8是否对应点亮。

实验提示

当A5~A15为1,A0、A1为0时,使能控制端G有效,A0、A1和A5~A15通过逻辑电路参与译码来确定端口地址。

思考

可否用273输入,244作输出;[提示:注意是否是双向]

如果硬件连线不用Y0和Y1,用其它138输出,如何修改程序;

如果改为开关向上拨,发光二极管灭;如果开关向上拨,发光二极管闪动,如何修改程序; 如果高4位和低4位亮灭相反,如何修改程序;

按照上面的思路,自己设想几种状态并改写程序实现之。

34

实验二 8259中断控制器实验

实验目的

(1)掌握8259中断控制器的接口方法。 (2)掌握8259中断控制器的应用编程。

实验内容

编制程序,利用8259芯片的IR7作为中断源,产生单一中断,系统显示中断号”7”。

程序框图及程序

IR7中断服务程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 ZXK EQU 0FFDCH ZWK EQU 0FFDDH

LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H BUF DB ?,?,?,?,?,? Port0 EQU 0FFE0H

35

Port1 EQU 0FFE1H

P8259: CLI

CALL WP ;初始化显示“P.” MOV AX,OFFSET INT8259 MOV BX,003CH MOV [BX],AX MOV BX,003EH MOV AX,0000H MOV [BX],AX CALL FOR8259 MOV SI,0000H STI CON8: CALL DIS JMP CON8

;------------------------------------ INT8259:CLI

PUSH AX PUSH BX PUSH CX

PUSH DX

MOV BX,OFFSET BUF MOV BYTE PTR [BX+SI],07H INC SI

CMP SI,0007H JZ X59 XX59: MOV AL,20H MOV DX,Port0 OUT DX,AL MOV CX,0050H xxx59: PUSH CX CALL DIS POP CX LOOP xxx59 POP DX

POP CX POP BX POP AX

STI IRET

X59: MOV SI,0000H CALL WP

JMP XX59

;============================== FOR8259:MOV AL,13H

36

MOV DX,Port0 OUT DX,AL MOV AL,08H MOV DX,Port1 OUT DX,AL MOV AL,01H OUT DX,AL

MOV AL,7FH ;IRQ7 OUT DX,AL RET

;---------------------------

WP: MOV BUF,11H ;初始化显示“P.” MOV BUF+1,10H MOV BUF+2,10H MOV BUF+3,10H MOV BUF+4,10H

MOV BUF+5,10H RET

;-------------------------------- DIS: MOV CL,20H

MOV BX,OFFSET BUF DIS1: MOV AL,[BX] PUSH BX

MOV BX,OFFSET LED XLAT POP BX

MOV DX,ZXK OUT DX,AL MOV AL,CL MOV DX,ZWK OUT DX,AL PUSH CX MOV CX,0100H DELAY: LOOP $ POP CX

CMP CL,01H JZ EXIT INC BX SHR CL,1 JMP DIS1 EXIT: MOV AL,00H MOV DX,ZWK OUT DX,AL RET

37

;-------------------------- CODE ENDS

END H8

实验电路

138的A、B、C、G仍要连CPU的A2、A3、A4和G,Y0才有效。 单脉冲电路介绍:

编程提示

(1)8259芯片介绍

中断控制器8259A是专为控制优先级中断而设计的芯片。它将中断源优先级排队, 辨别中断源以及

提供中断矢量的电路集于一片中。因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。同时,在不需要增加其它电路的情况下,通过多片8259A的级联, 能构成多达64级的矢量中断系统。

中断序号 变量地址 0 20H-23H 1 24H-27H 2 28H-2BH 3 2CH-2FH 4 30H-33H 5 34H-37H 6 38H-3BH 7 3CH-3FH (2)本实验中使用7号中断源IR7,\插孔和IR7相连,中断方式为边沿触发方式,每按一次AN按钮产生一次中断,编写程序,使系统每次响应外部中断IR7时,显示1 个字符“7”,满7次后显示“P.”继续等待中断。

实验步骤

(1)按实验电路图连接线路:

①“SP”插扎和8259 7号中断IR7插孔相连,“SP”端初始为低电平

②8259的CS端连138译码器的Y0孔,138的A、B、C、G仍要连CPU的A2、A3、A4和G。 (2)运行实验程序

在系统处于命令提示符“P.”状态下, 运行程序。

(3)按AN按钮,每按1次,LED数码管从最高位开始依次显示1个“7”,按满7次后显示 “P.”继

续等待中断。[注意:由于硬件去抖动效果不好,按一次可能会产生多个脉冲。] (4)按复位键RESET返回“P.”。

38

思考 将主程序 “P。”的显示改为“012345”,如何修改程序;若该为显示“HELLO.”呢?(提示:要修改

LED段码表);中断显示改为第一次显示“1”,第二次显示“12”?如何修改;若改为中断一次显示111111,中断二次显示222222,?,如何修改;

如果脉冲SP信号接入IR6,如何修改程序实现之。

39

实验三 8255A并行口实验(一)方波

实验目的

掌握可编程I/O接口芯片8255的接口原理使用,熟悉对8255初始化编程和输入、输出软件的设计方法。

实验内容

无须连线,在8255A.B.C口任意一口用实验仪自带仿真模拟示波器测出波形(在视图下拉菜单里点逻辑示波器,示波器表笔无须接地,只要用表笔插入测量口即可)。

示波器插孔

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 32C0H

H1: JMP STARTP1 PA EQU 0FFD8H PB EQU 0FFD9H PC EQU 0FFDAH PCTL EQU 0FFDBH STARTP1:MOV DX,PCTL MOV AL,80H

OUT DX,AL MOV AL,55H P11: MOV DX,PA

OUT DX,AL INC DX OUT DX,AL INC DX OUT DX,AL

40

MOV CX,0800H

LOOP $ NOT AL JMP P11 CODE ENDS END H1 实验步骤

(1) 在下位机系统处于“P.”状态时,用下位机执行,即输入32C0,按EXEC键,系统显示执行提示符“┌”。

(或者直接在软件上点连续执行也可)

(2) 用实验仪上自带示波器观察8255A.B.C任意一口波形。(由于自带示波器为仿真模拟示波器,方波

输出前沿陡度不好,类似梯形波。) (3) 按复位键RESET返回“P.”。

实验提示

数据55H可为任意值,A.B.C.口任意一位只要是0-1-0-1-。。。-0-1变化,即可产生方波。

思考 如何改变方波的频率

41

实验四 8255A并行口实验(二)PA输入,PB输出

实验目的

(1) 掌握8255A和微机接口方法。 (2) 掌握8255A的工作方式和编程原理。

实验内容 8255端口地址已固定,

用8255 PA作开关量输入口,PB作输出口。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE

ORG 32E0H

PA EQU 0FFD8H PB EQU 0FFD9H PC EQU 0FFDAH PCTL EQU 0FFDBH H2: MOV DX,PCTL

MOV AL,90H OUT DX,AL P2: MOV DX,PA IN AL,DX

INC DX OUT DX,AL

JMP P2 CODE ENDS END H2

实验电路

42

编程提示

8255A芯片简介

8255A可编程外围接口芯片是Intel公司生产的通用并行接口芯片,它具有A、B、C 三个并行接口,用+5V单电源供电,能在以下三种方式下工作:

方式0:基本输入/输出方式 方式1:选通输入/输出方式 方式2:双向选通工作方式

使8255A端口A工作在方式0并作为输入口,读取K1-K8八个开关量,送PB口显示。 PB口工作在方式0作为输出口。

实验步骤

1.

按实验电路图连接线路:

① 8255A芯片A口的PA0—PA7依次和开关量输入插孔K1-K8相连。

43

② 8255A芯片B口的PB0—PB7依次接L1-L8

2.

运行实验程序。

在系统处于“P.”状态时,输入32E0,按EXEC键(或者用软件界面连续执行), 系统显示执行提示符“┌”,拨动K1-K8,L1-L8会跟着亮灭。 3.

按复位键RESET返回“P.”。

思考 如果将B口输出改为中断后才允许输出,如何修改程序。(参考8259中断程序)

即SP单脉冲送给PC4,PC3送给8259的IR7,8259CS连138的Y0,138的A、B、C、G接到CPU信号的A2、A3、A4、G,实现通过SP发一单脉冲,才允许B口输出,发光二极管才相应点亮。提示:将原程序做为中断响应程序。

44

实验五 8255A并行口实验(三)控制交通灯

实验目的

掌握通过8255A并行口传输数据的方法,以控制发光二极管的亮与灭。

实验内容

用8255作输出口,控制十二个发光二极管亮灭,模拟交通灯管理。

程序框图及程序

CODE SEGMENT

ASSUME CS:CODE,DS:CODE,ES:CODE ORG 32F0H PA EQU 0FFD8H PB EQU 0FFD9H PC EQU 0FFDAH PCTL EQU 0FFDBH H3: MOV AL,88H

MOV DX,PCTL

OUT DX,AL ;MOD:0, MOV DX,PA MOV AL,0B6H

45

OUT DX,AL INC DX

MOV AL,0DH OUT DX,AL CALL DELAY1 P30: MOV AL,75H MOV DX,PA OUT DX,AL INC DX

MOV AL,0DH

OUT DX,AL CALL DELAY1 CALL DELAY1 MOV CX,08H P31: MOV DX,PA MOV AL,0F3H OUT DX,AL INC DX

MOV AL,0CH OUT DX,AL CALL DELAY2 MOV DX,PA MOV AL,0F7H OUT DX,AL INC DX MOV AL,0DH OUT DX,AL CALL DELAY2 LOOP P31

MOV DX,PA MOV AL,0AEH OUT DX,AL INC DX

MOV AL,0BH OUT DX,AL CALL DELAY1 CALL DELAY1 MOV CX,08H P32: MOV DX,PA MOV AL,9EH OUT DX,AL INC DX

MOV AL,07H OUT DX,AL

46

CALL DELAY2 MOV DX,PA

MOV AL,0BEH OUT DX,AL INC DX MOV AL,0FH OUT DX,AL CALL DELAY2 LOOP P32 JMP P30 DELAY1: PUSH AX PUSH CX MOV CX,0030H DELY2: CALL DELAY2 LOOP DELY2 POP CX POP AX RET

DELAY2: PUSH CX MOV CX,8000H LOOP $ POP CX RET CODE ENDS END H3 实验电路

编程提示

(1)通过8255A控制发光二极管PB3、PB0、PA5、PA2对应黄灯,PB1、PA6、PA3、 PA0对应红灯,PB2、PA7、PA4、PAl对应绿灯,以模拟交通路灯的管理。

(2)要完成本实验,必须先了解交通路灯的亮灭规律,设有一个十字路口1、3为南北方向,2、4为东西方向,初始状态为四个路口的红灯全亮。之后,1、3路口的绿灯亮, 2、4路口的红灯亮, 1、3路口

47

方向通车。延时一段时间后,1、3路口的绿灯熄灭,而1、 3路口的黄灯开始闪烁,闪烁若干次以后,1、3路口红灯亮,而同时2、4路口的绿灯亮, 2、4路口方向通车,延时一段时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁,闪烁若干次以后,再切换到1、3路口方向,之后,重复上述过程。 (3)程序中设定好8255A的工作模式,及三个端口均工作在方式0,并处于输出状态。 (4)各发光二极管共阳极,使其点亮应使8255A相应端口的位清0。

实验步骤

(1)按实验电路图连接线路:

8255A PA0-L12 PA1-L11 PA2-L10 PA3-L9 PA4-L8 PA5-L7 PA6-L6 PA7-L5 PB0-L4 PB1-L3 PB2-L2 PB3-L1 (2)运行实验程序

在系统处于“P.”状态时,输入32F0,按EXEC键(或者在软件界面上点连续执行),执行符“┌”,同时L1-L12发光二极管模拟交通灯显示。

(3)按复位键RESET返回“P.”或按暂停键STOP+MON键返回“P”。

思考

程序框图上黄灯过后,使4个路口的红灯全亮的功能没有实现,试改写程序实现此功能; 夜晚,交通灯会变为4个路口黄灯闪烁,如何在程序上完善;

如有突发事件,要求4个路口全为红灯,让紧急车辆通过,试通过中断实现。

48

系统显示

本文来源:https://www.bwwdw.com/article/lxbw.html

Top