8086汇编语言程序设计 微机实验报告.docx
《8086汇编语言程序设计 微机实验报告.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计 微机实验报告.docx(30页珍藏版)》请在冰点文库上搜索。
8086汇编语言程序设计微机实验报告
微机实验报告
第一部分:
8086汇编语言程序设计
一、实验目的
通过上机练习,初步掌握8086的指令系统,熟悉8086汇编语言程序的编写格式,学会编写简单的汇编语言应用程序,初步学会使用DEBUG调试工具。
二、实验题目
(一)编程实现从字符串中查找特定的字符,记录特定字符的个数,并将结果在屏幕上显示,同时退出并返回DOS。
(要求字符串从键盘上输入)
1、流程图
2、实验程序及注释
DATASEGMENT
BUFSIZEDB20;数据段
ACTCHARDB?
;定义字符串
CHARTEXTDB20DUP(?
);给输入字符分配内存
DB'$'
CNTDB0;给计数器分配内存
STRING1DB'PLEASEINPUTTHESTRING:
','$'
STRING2DB0AH,0DH,'INPUTTHEWORDYOUWANTTOCHECK:
','$'
STRING3DB0AH,0DH,'THENUMBEROFTHEWORDIS:
','$'
DATAENDS;数据段结束
COSEGSEGMENT;代码段
ASSUMECS:
COSEG,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1;显示提示语:
请输入字符串
MOVAH,09H;输出字符串STRING1
INT21H
MOVDX,OFFSETBUFSIZE;从键盘输入字符串存入BUFSIZE
MOVAH,0AH;并送显
INT21H
MOVDX,OFFSETSTRING2;显示提示语:
想查询的字符是
MOVAH,09H;输出字符串STRING2
INT21H
MOVAH,01H;从键盘上输入字符到AL中并送显
INT21H
MOVBX,OFFSETCHARTEXT;将字符串首地址存入BX
MOVCL,ACTCHAR;置循环次数CX=字符串长度
XORCH,CH
LP1:
CMPAL,[BX];字符串从头开始与键入字符AL比较
JZLP2;相等则转入LP2
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
JNZLP1;若还有未比较的字符,继续循环LP1
JMPFINI;若全部比较完毕,跳转FINI
LP2:
INCCNT;计数器增一
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
JNZLP1;若还有未比较的字符,跳至LP1
FINI:
MOVDX,OFFSETSTRING3;显示提示语:
所查询的字符个数:
MOVAH,09H
INT21H
MOVAL,CNT;将计数器的值送AL
AAM;将此值转换成非压缩BCD码
ADDAH,30H;将BCD码转换为ASCⅡ码
MOVDL,AH;高位送显
MOVAH,02H
INT21H
MOVAL,CNT;再将计数器的值送AL
AAM
ADDAL,30H;将BCD码转换为ASCⅡ码
MOVDL,AL;低位送显
MOVAH,02H
INT21H
MOVAH,4CH;结束
INT21H
COSEGENDS;代码段结束
ENDSTART;程序结束
3、运行结果
PLEASEINPUTTHESTRING(先输入字符串):
ASDFAAD↙
INPUTTHEWORDYOUWANTTOCHECK(输入待查找字符):
A↙
THENUMBEROFTHEWORDIS(数量为):
3↙
PLEASEINPUTTHESTRING(先输入字符串):
ASDFAAD↙
INPUTTHEWORDYOUWANTTOCHECK(输入待查找字符):
9↙
THENUMBEROFTHEWORDIS(数量为):
0↙
PLEASEINPUTTHESTRING(先输入字符串):
ASDFAAD↙
INPUTTHEWORDYOUWANTTOCHECK(输入待查找字符):
S↙
THENUMBEROFTHEWORDIS(数量为):
1↙
4、程序改进
循环次数的改进
原来的程序:
MOVCX,19
改进原因:
此程序表明无论输入的字符串多长,即使没有达到限定的最大字符串的长度,也要循环19次。
改进后的程序:
MOVCL,ACTCHAR
XORCH,CH
改进结果:
ACTCHAR即所输入的字符串的实际长度,因此,实际为置循环次数CX=字符串长度,这样可以提高运行速度
删除多余语句
原来的程序:
LP1:
CMPAL,[BX];将字符与字符串逐个比较
JZLP2;相等则转入LP2
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
CMPCX,0000H;若还有未比较的字符
JNZLP1;继续循环LP1
JMPFINI;若全部比较完毕,跳转FINI
LP2:
INCCNT;计数器增一
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
CMPCX,0000H;若还有未比较的字符
JNZLP1;跳转LP1
改进原因:
DEC为自减一,若减为0,它会自动影响其标志位ZF,所以不用把CX再与00H比较,判断CX是否为零。
改进后的程序:
(删除CMPCX,0000H)
LP1:
CMPAL,[BX];字符串从头开始与键入字符AL比较
JZLP2;相等则转入LP2
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
JNZLP1;若还有未比较的字符,继续循环LP1
JMPFINI;若全部比较完毕,跳转FINI
LP2:
INCCNT;计数器增一
INCBX;指针指向字符串下一个字符
DECCX;循环次数减一
JNZLP1;若还有未比较的字符,跳至LP1
(二)编程实现把键盘输入的两位BCD码,在屏幕上用16进制数显示出来。
1流程图
初始化
键入字符
判断是否在0到9之间
转化为十进制数
除以16
将整数部分和余数部分转化为ASIIC码,并送显
返回DOS
2、实验程序及注释
CODESEGMENT
ASSUMECS:
CODE
START:
CALLDECIBIN;调用十进制转二进制子程序
CALLCRLF;调用添加回、换行符子程序
CALLBINIHER;调用二进制转十六进制并显示子程序
CALLCRLF;调用添加回、换行符子程序
MOVAH,4CH
INT21H
DECIBINPROC
MOVBX,0;BX清零
MOVCL,2;限定输入两位BCD码
NEW:
MOVAH,1;DOS调用,键入字符并回显
INT21H
SUBAL,30H;比较键入字符是否在0到9之间
JLNEW1;小于零,即不在范围内,就跳到NEW1
CMPAL,9
JGNEW1;左>右则转移
CBW;将一个字节转化为字
XCHGAX,BX;交换两个寄存器之间的内容
MOVCX,10;十进制数10入CX
MULCX;表达式的值与AX内容相乘,并将结果存于AX
XCHGAX,BX
ADDBX,AX
POPCX
DECCL
JNCNEW
RET;返回到原来调用指令的下一条指令
NEW1:
PUSHCX;NEW1为固定光标程序,直到输入0-9
MOVAH,3数字,光标才会移动
INT10H
MOVAH,2
DECDL
INT10H
POPCX
JMPNEW
DECIBINENDP
BINIHERPROC
MOVCH,4;记录转换后的十六进制位数
RORATE:
MOVCL,4;利用CL当计数器,记录寄存器数位移动次数
ROLBX,CL;循环左移四位,相当于除以16
MOVAL,BL;把BX低八位BL内数据转移至al
ANDAL,0FH;高四位清零
ADDAL,30H
CMPAL,3AH
JLNEXT;AL小于等于3AH转移
ADDAL,7H
NEXT:
MOVDL,AL;把ASCII码装入DL
MOVAH,2;DOS调用,显示字符
INT21H
DECCH;CH减一,减到零时,零标志置1
JNZRORATE
RET
BINIHERENDP
CRLFPROC;实现换行功能
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
3、运行结果
输入数字12↙
此时屏幕显示000C
4、程序改进
问题原因:
程序只有输入0-9才能正常运行,若输入其他的,无法继续执行程序,例如字母等等。
改进后的程序:
在判断是否是0-9后,加入跳转程序
方法一:
SUBAL,30H;比较键入字符是否在0到9之间
JLEXIT;小于零,即不在范围内,就跳到EXIT
CMPAL,9D
JGEXIT
EXIT:
PROCNEAR;返回DOS
MOVAH,4CH
INT21H
EXIT1ENDP
方法二:
SUBAL,30H;比较键入字符是否在0到9之间
JLNEW1;小于零,即不在范围内,就跳到NEW1
CMPAL,9
JGNEW1;左>右则转移
NEW1:
PUSHCX;NEW1为固定光标程序,直到输入0-9
MOVAH,3数字,光标才会移动
INT10H
MOVAH,2
DECDL
INT10H
POPCX
JMPNEW
第二部分:
微机接口实验
一、实验目的
实验内容是配合理论课的教学,掌握、了解一些基本接口芯片的使用和基本工作原理。
二、实验题目
(一)串行接口实验题目
1、实验内容
编程实现讲主机键盘输入的字符加1后在屏幕上显示,按ESC键(键值27)推出唱戏返回DOS。
(讲8250设成自收自发方式)
2、实验目的
了解串行通讯的基本原理,掌握串行接口芯片8250的工作原理和编程方法。
3、流程图
4实验连线
连线见下图,8250芯片插在40芯的通用插座上。
CS接2B8H-2BFH。
5实验程序及注释
name8250
datasegment;定义数据段
dividdw0ch;对应9600波特率的除数
dataends;数据段结束
stack1segmentparastack;定义栈
db100dup(?
);定义100字节
stack1ends
codesegment;代码段
assumecs:
code,ds:
data,es:
data,ss:
stack1
sub1procfar;标准程序头
start:
pushds;8250初始化
movax,0;8位数据位,一个停止位
pushax
moval,80h;设dlab=1
movdx,2bbh
outdx,al
MOVAX,DIVID;取除数
MOVDX,2B8H
OUTDX,AL;写入除数低字节
MOVAL,AH
MOVDX,2B9H
OUTDX,AL;写入除数高字节
MOVAL,0AH
MOVDX,2BBH;写入线路控制寄存器
OUTDX,AL
MOVAL,13H
MOVDX,2BCH;写入MODEM控制寄存器
OUTDX,AL
MOVAL,0
MOVDX,2B9H;写入中断允许寄存器
OUTDX,AL
WAIT_FOR:
MOVDX,2BDH;读线路允许寄存器
INAL,DX
TESTAL,1EH;出错否
JNZERROR
TESTAL,1;接收数据就绪否
JNZRECEIVE;转接收
TESTAL,20H;发送器空否
JZWAIT_FOR;返回等待
MOVAH,1
INT16H;读键盘
JZWAIT_FOR;无按键返回等待
MOVAH,0;读按键
INT16H
MOVDX,2B8H;发送
OUTDX,AL
JMPWAIT_FOR;返回等待
RECEIVE:
MOVDX,2B8H;读接受数据
INAL,DX
ANDAL,7FH;保留7位数据
CMPAL,1BH;是ESC否
JNZCHAR
MOVAX,4C00H;返回DOS
INT21H
CHAR:
ADDAL,1;加一送显
PUSHAX;备查
MOVAH,14;显示接受字符
INT10H
POPAX
CMPAL,0DH;是否回车符
JNZWAIT_FOR;不是返回等待
MOVAL,0AH;是回车则加换行
MOVAH,14
INT10H
JMPWAIT_FOR
ERROR:
MOVDX,2B8H;出错则清除
INAL,DX
MOVAL,'?
';显示’?
’
MOVAH,1
INT10H
JMPWAIT_FOR
SUB1ENDP
CODEENDS
ENDSTART
6运行结果
输入5屏幕显示6
输入A屏幕显示B
按下Esc键返回未来汇编界面
7遇到问题及解决方法
写除数寄存器时,8250接2MHZ,若选波特率为9600,波特率因子为16,由于有:
发送波特率=2MHZ÷除数寄存器值÷16,可计算出除数寄存器值为13(M÷9600÷16=13),即寄存器低字节送13(0DH),高字节送0。
(二)并行接口实验题目
题目一:
编程实现从键盘上输入一个数字(0-9),将数字在七段数码管上显示出来。
按数字键外的任意键退出并返回DOS。
1、实验目的
了解并行通讯的基本原理,掌握并行接口芯片8255的工作原理和编程方法。
2、七段数码管的字形代码表
显示字形
g
e
f
d
c
b
a
段码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
1
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
3、实验连线
将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V,S0、dp接地,CS接288H~28FH。
4、流程图
5、实验程序及注释
DATASEGMENT;数据段
ENTERDB0AH,0DH,'$'
MSG0DB0AH,0DH,'PLEASEINPUTANUMBER(0--9):
','$'
DATAENDS
STACKSEGMENTPARASTACK;栈区设置
S1DB40DUP(0);开辟一块栈区
STACKENDS
CODESEGMENT;代码段
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA;标准程序头
MOVDS,AX
MOVDX,028BH
MOVAL,80H
OUTDX,AL
INPUT:
MOVDX,OFFSETMSG0;显示提示语:
请输入一个数字
MOVAH,09H;从键盘输入数字
INT21H
MOVAH,01H;将数字送显
INT21H
CMPAL,30H;将数字和30h(0)作比较
JCFINISH;若al小于0(ascii值为48)
;则跳转到finish
CMPAL,39H;将数字和39h(9)作比较
JAFINISH;若al大于9(ascii值为57)
则跳转到finish
CMPAL,30H;将al和0作比较
JZZERO;若相等则跳转到ZERO
CMPAL,31H;将al和1作比较
JZONE;若相等则跳转到ONE
CMPAL,32H;将al和2作比较
JZTWO;若相等则跳转到TWO
CMPAL,33H;将al和3作比较
JZTHREE;若相等则跳转到THREE
CMPAL,34H;将al和4作比较
JZFOUR;若相等则跳转到FOUR
CMPAL,35H;将al和5作比较
JZFIVE;若相等则跳转到FIVE
CMPAL,36H;将al和6作比较
JZSIX;若相等则跳转到SIX
CMPAL,37H;将al和7作比较
JZSEVEN;若相等则跳转到SEVEN
CMPAL,38H;将al和8作比较
JZEIGHT;若相等则跳转到EIGHT
JMPNINE;以上都不是跳转到NINE
ZERO:
MOVDX,0288H;存入输出口地址
MOVAL,3FH;置入0的字型代码
OUTDX,AL;送出0,七段数码管显示
JMPINPUT;跳回INPUT
ONE:
MOVDX,0288H;存入输出口地址
MOVAL,06H;置入1的字型代码
OUTDX,AL;送出1,七段数码管显示
JMPINPUT;跳回INPUT
TWO:
MOVDX,0288H;存入输出口地址
MOVAL,5BH;置入2的字型代码
OUTDX,AL;送出2,七段数码管显示
JMPINPUT;跳回INPUT
THREE:
MOVDX,0288H;存入输出口地址
MOVAL,4FH;置入3的字型代码
OUTDX,AL;送出3,七段数码管显示
JMPINPUT;跳回INPUT
FOUR:
MOVDX,0288H;存入输出口地址
MOVAL,66H;置入4的字型代码
OUTDX,AL;送出4,七段数码管显示
JMPINPUT;跳回INPUT
FIVE:
MOVDX,0288H;存入输出口地址
MOVAL,6DH;置入5的字型代码
OUTDX,AL;送出5,七段数码管显示
JMPINPUT;跳回INPUT
SIX:
MOVDX,0288H;存入输出口地址
MOVAL,7DH;置入6的字型代码
OUTDX,AL;送出6,七段数码管显示
JMPINPUT;跳回INPUT
SEVEN:
MOVDX,0288H;存入输出口地址
MOVAL,07H;置入7的字型代码
OUTDX,AL;送出7,七段数码管显示
JMPINPUT;跳回INPUT
EIGHT:
MOVDX,0288H;存入输出口地址
MOVAL,7FH;置入8的字型代码
OUTDX,AL;送出8,七段数码管显示
JMPINPUT;跳回INPUT
NINE:
MOVDX,0288H;存入输出口地址
MOVAL,6FH;置入9的字型代码
OUTDX,AL;送出9,七段数码管显示
JMPINPUT;跳回INPUT
FINISH:
MOVAH,4CH;结束
INT21H
CODEENDS;代码段结束
ENDSTART;程序结束
6、程序改进
原来的程序:
CMPAL,39H;将al和9作比较
JZNINE;若相等则跳转到NINE
改进原因:
程序可以再简化
改进后的程序:
JMPNINE;以上都不是跳转到NINE
题目二:
交通灯控制实验编程使六个发光二极管按交通灯变化规律亮灭,有任意键按下退出程序,返回DOS。
试验提示:
十字路口交通灯的变化规律要求:
南北路口的绿灯、东西路口的红灯同时量30秒左右;
南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮;
南北路口的红灯、东西路口的绿灯同时量30秒左右;
南北路口的红灯继续亮、同时东西路口的黄灯闪烁若干次;
转1重复,到按下任意键结束。
1、实验目的
掌握8255并行口的使用
2、实验连线
3、流程图
参考流程图:
实际编写流程图:
开始
设置8255C口输入,A口输出
设置循环次数,置CL=5
从C口给PC0写入1
从A口输出,控制PA0灯亮灭
延迟
按上述方法分别给C口的PC1——PC7写入1,是A口的8个灯顺序亮灭
判断CL=0?
返回DOS
4、实验程序及注释
;初始化程序
STACKSEGMENTSTACK;STACK段,定位类型无
DW100DUP(0);长度为100字节
STACKENDS;STACK段结束
DATASEGMENT;定义数据段
DATAENDS;数据段结束(此程序可以不需定义数据段)
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAL,10000000B;控制字,方式0,A口、B口、C口输出
MOVDX,28BH;送控制寄存器的口地址
OUTDX,AL;送控制字
MOVAL,10000100B;C口输出,PC7=PC2=1,两红灯亮
MOVDX,28AH
OUTDX,AL
MOVCX,1;循环次数=1
CALLDELAY;调用DELAY过程
AGAIN:
MOVAL,00100100B;C口输出,PC5=PC2=1,南北路口绿灯亮,东西路口红灯亮
OUTDX,AL
MOVCX,10;循环次数=10,长延迟
CALLDELAY;调用DELAY过程
ANDAL,00001111B;C口输出,PC5=0,PC2=1,南北路口绿灯灭,东西路口红灯亮
OUTDX,AL
;南北路口黄灯闪3次,东西路口红灯亮
MOVBX,3;置