8086汇编语言程序设计 微机实验报告.docx

上传人:b****3 文档编号:4736327 上传时间:2023-05-07 格式:DOCX 页数:30 大小:67.35KB
下载 相关 举报
8086汇编语言程序设计 微机实验报告.docx_第1页
第1页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第2页
第2页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第3页
第3页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第4页
第4页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第5页
第5页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第6页
第6页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第7页
第7页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第8页
第8页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第9页
第9页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第10页
第10页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第11页
第11页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第12页
第12页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第13页
第13页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第14页
第14页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第15页
第15页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第16页
第16页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第17页
第17页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第18页
第18页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第19页
第19页 / 共30页
8086汇编语言程序设计 微机实验报告.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

8086汇编语言程序设计 微机实验报告.docx

《8086汇编语言程序设计 微机实验报告.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计 微机实验报告.docx(30页珍藏版)》请在冰点文库上搜索。

8086汇编语言程序设计 微机实验报告.docx

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、七段数码管的字形代码表

显示字形

段码

3fh

06h

5bh

4fh

66h

6dh

7dh

07h

7fh

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;置

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2