8086汇编语言程序设计实验指导书.docx

上传人:b****5 文档编号:5691908 上传时间:2022-12-31 格式:DOCX 页数:31 大小:123.59KB
下载 相关 举报
8086汇编语言程序设计实验指导书.docx_第1页
第1页 / 共31页
8086汇编语言程序设计实验指导书.docx_第2页
第2页 / 共31页
8086汇编语言程序设计实验指导书.docx_第3页
第3页 / 共31页
8086汇编语言程序设计实验指导书.docx_第4页
第4页 / 共31页
8086汇编语言程序设计实验指导书.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

8086汇编语言程序设计实验指导书.docx

《8086汇编语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计实验指导书.docx(31页珍藏版)》请在冰豆网上搜索。

8086汇编语言程序设计实验指导书.docx

8086汇编语言程序设计实验指导书

8086汇编语言程序设计实验指导书

汇编语言上机实验指导书

一、概述

上机实验总学时为16学时,其中综合性实验为2学时。

实验共有6项暂定为8次,每次2学时。

1.实验辅导的主要内容

实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。

开始的实验介绍较细,后面的实验简要介绍。

2.实验的软硬件要求

关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。

软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。

3.加强实践能力的培养

实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。

其中包括:

实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等;

开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。

对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。

实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性)

1.实验目的:

(1) 熟悉汇编语言运行环境和方法

(2)了解如何使用汇编语言编制程序

(3) 熟悉DEBUG有关命令的使用方法

(4) 利用DEBUG掌握有关指令的功能

(5) 利用DEBUG运行简单的程序段

2.实验内容

(1)学会输入、编辑汇编语言程序

(2)学会对汇编语言程序进行汇编、连接和运行

(3)进入和退出DEBUG程序

(4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。

对于U命令、N命令、W命令等,也应试一下。

3.实验准备

(1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。

(2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。

(3)编写一个程序:

比较2个字符串所含的字符是否相同。

若相同则显示’Match.’,否则显示’Nomatch!

’;

(1)仔细阅读有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。

4.实验步骤

(1)在DOS提示符下,进入MASM目录。

(2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。

调用edit输入、编辑源程序并保存在指定的目录中;例:

editabc.asm

用汇编程序masm对源程序汇编产生目标文件obj。

例:

masmabc

不断修改错误,直至汇编通过为止。

用连接程序link产生执行文件exe.例:

linkabc

执行程序

可直接从DOS执行程序,即在DOS环境中,输入文件名即可。

(3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。

5.实验报告要求

(1)源程序清单。

(2)如何启动和退出EDIT程序。

(3)如何对源程序进行汇编及编辑。

(4)如何启动和退出DEBUG程序。

(1) 预习输入输出程序设计的特点和方法。

(2) 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。

5.实验步骤

(1) 建立源文件,并通过汇编和连接,产生可执行文件。

(2) 运行程序,观察常规字符键及功能键按下时程序的反应,

6.实验报告要求

(1) 给出程序框图,包括主程序框图、中断处理程序框图。

(2)说明输入输出程序设计的特点。

(3)讨论:

将SHIFT键及右SHIFT 键也进行判别处理,它们的扫描码为42及54。

为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。

当程序工作时,应能显示上档键的字符。

实验五字符处理程序实验

1.实验目的

(1)熟悉串操作指令的功能与应用

(2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。

2.实验内容

(1)字符串统计。

自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。

(2)在给定的字符串中,删除重复的字符,其余的字符向前递补。

3.实验准备

(1)熟悉字符处理的方法和字符处理程序的设计;

(2)认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。

(3)按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。

4.实验步骤

(1)用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。

程序每次执行,都能得到不同的结果。

(2)编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。

5.实验报告要求

(1)对照参考程序,画出程序流程图。

(2)总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。

实验六BIOS和DOS中断调用应用程序设计

1. 实验目的

(1)了解DOS、BIOS调用的基本功能、调用参数、返回参数。

以及数据定义 掌握中断通信程序的设计方法。

(2)掌握如何利用扫描码进行功能控制。

2. 实验内容

编写一个可以进行光标左右移动和插入字符的简单字处理程序。

3.实验准备

(1) 复习相关内容

(2)了解键盘的扫描码、ASCII码及其显示字符(如果存在可显示字符形式)之间的对应关系。

4.实验步骤

(1) 建立源文件,汇编、连接产生可执行文件。

(2) 运行程序,使得可以输入字符和光标左右移动及字符的插入。

5. 实验报告要求

(1) 由参考程序,画出简单字处理程序框图。

(2) 讨论如何实现光标的上下移动和字符的删除。

源程序清单

实验2

(1)编写一个程序S21,将内存中一组有符号的字数组按递增的序列排序,并将其中的二进制数以十六进制的形式显示在屏幕上。

;S21.ASM

DSEGSEGMENT

XDW234H,32FH,90DH,123EH,-78EH,0ACFH,-234H,98H,-23DFH

COUNTDW9

DSEGENDS

CSEGSEGMENT

ASSUMECS:

CSEG,DS:

DSEG

MAINPROCFAR

START:

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX

MOVCX,COUNT

LAB0:

MOVBX,1

DECCX

JZLAB3

PUSHCX

LEADI,X

LAB1:

MOVAX,[DI]

CMPAX,[DI+2]

JLELAB2

XORBX,BX

XCHGAX,[DI+2]

MOV[DI],AX

LAB2:

ADDDI,2

LOOPLAB1

POPCX

CMPBX,0

JZLAB0

LAB3:

LEADI,X

MOVCX,COUNT

LAB4:

PUSHCX

MOVCH,4

MOVBX,[DI]

LAB5:

MOVCL,4

ROLBX,CL

MOVDL,BL

ANDDL,0FH

CMPDL,9

JBELAB6

ADDDL,7

LAB6:

ADDDL,30H

MOVAH,2

INT21H

DECCH

JNZLAB5

MOVDL,20H

MOVAH,2

INT21H

ADDDI,2

POPCX

LOOPLAB4

MOVDL,0DH

MOVAH,2

INT21H

MOVDL,0AH

MOVAH,2

INT21H

LEADI,X

MOVCX,COUNT

LAB7:

MOVBX,[DI]

PUSHCX

MOVCX,16

LAB8:

XORDL,DL

ROLBX,1

RCLDL,1

ADDDL,30H

MOVAH,2

INT21H

LOOPLAB8

MOVDL,'B'

MOVAH,2

INT21H

MOVDL,''

MOVAH,2

INT21H

ADDDI,2

POPCX

LOOPLAB7

RET

MAINENDP

CSEGENDS

ENDSTART

其中斜体字部分为以二进制输出。

(2)编写一个程序S22,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

;S22.ASM

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAH,1

INT21H;等待键入字符,送AL

CMPAL,0DH;是否是回车符?

JZDONE;是则转DONE退出程序

CMPAL,'0'

JBNEXT

CMPAL,'9'

JACHARUP

MOVDL,AL

MOVAH,2

INT21H

JMPSTART

CHARUP:

CMPAL,41H

JBNEXT

CMPAL,5AH

JACHRDN

DISPC:

MOVDL,'c'

MOVAH,2

INT21H

NEXT:

JMPSTART

CHRDN:

CMPAL,61H

JBNEXT

CMPAL,7AH

JANEXT

JMPDISPC

DONE:

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

实验3.1

(1)编写程序S31,将BUF开始的10个字节单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXASC实现,在转换过程中,通过子程序DISP实现显示。

;S31.ASM

DATASEGMENT

BUFDB0ABH,0CDH,0DEH,01H,02H,03H

DB3AH,4BH,5CH,6FH

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVCX,10

LEABX,BUF

AGAIN:

MOVAL,[BX]

CALLHEXASC

INCBX

LOOPAGAIN

MOVAH,4CH

INT21H

HEXASCPROCNEAR

PUSHAX

MOVDL,AL

PUSHCX

MOVCL,4

SHRDL,CL

POPCX

CALLDISP;显示高位HEX数

POPAX

MOVDL,AL

ANDDL,0FH

CALLDISP

RET

HEXASCENDP

DISPPROC

CMPDL,9

JBENEXT

ADDDL,7

NEXT:

ADDDL,30H

MOVAH,2

INT21H;显示

RET

DISPENDP

CODEENDS

ENDSTART

(2)编写一个主程序S32,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

DATASEGMENT

CHARDB'b'

BUFDB50H,?

50HDUP(?

CRLFDB0DH,0AH,'$'

DATAENDS

MCODESEGMENT

ASSUMECS:

MCODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEADX,BUF

MOVAH,0AH

INT21H

LEADX,CRLF

MOVAH,9

INT21H

LEASI,BUF

MOVCL,[SI+1]

MOVCH,0;CX中为字符串长度

INCSI

INCSI;SI指向串首址TABLE

MOVAL,CHAR

MOVAH,0;AX中为待查字符

PUSHSI

PUSHCX

PUSHAX;参数送堆栈

CALLFARPTRCHECK

MOVDL,CHAR

MOVAH,2

INT21H

POPAX;统计个数在AL中,个数不能超过一位16进制数

MOVDL,AL

ANDDL,0FH

CMPDL,9

JBENEXT

ADDDL,7

NEXT:

ADDDL,30H

MOVAH,2

INT21H;显示统计个数

MOVAH,4CH

INT21H

MCODEENDS

SCODESEGMENT

ASSUMECS:

SCODE

CHECKPROCFAR

PUSHBP

MOVBP,SP

MOVSI,[BP+10]

MOVCX,[BP+8]

MOVAX,[BP+6]

XORAH,AH

AGAIN:

CMPAL,[SI]

JNENEXT1

INCAH

NEXT1:

INCSI

LOOPAGAIN

MOVAL,AH

MOV[BP+10],AX

POPBP

RET4

CHECKENDP

SCODEENDS

ENDSTART

实验3.2

(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序S33用另一个模块编写。

EXTRNDNTOUP:

FAR

PUBLICSTRING1,STRING2

DATASEGMENT

STRING1DB'thIsisAbook','$'

STRING2DB80DUP(?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

CALLFARPTRDNTOUP

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

;DNTOUP.SM为子模块的文件名

PUBLICDNTOUP

EXTRNSTRING1:

BYTE,STRING2:

BYTE

CODESEGMENT

DNTOUPPROCFAR

ASSUMECS:

CODE

MOVBX,0

CYCLE:

MOVAL,STRING1[BX]

CMPAL,24H;是否是STRING1结尾

JZDONE;是"$",转DONE

CMPAL,61H;是小写字母吗?

JBNEXT;不是转NEXT

CMPAL,7AH

JANEXT

SUBAL,20H;转为大写字母

NEXT:

MOVSTRING2[BX],AL

INCBX

JMPCYCLE

DONE:

MOVAL,'$'

MOVSTRING2[BX],AL;补一个$

MOVDL,0DH

MOVAH,2

INT21H

MOVDL,0AH

INT21H;显示回车换行

LEADX,STRING1

MOVAH,9

INT21H;显示源串内容

MOVDL,0AH

MOVAH,2

INT21H;回车换行

MOVDX,OFFSETSTRING2

MOVAH,9

INT21H;显示转换后的大写串

RET

DNTOUPENDP

CODEENDS

ENDDNTOUP

(2)编写一个子程序,将主程序S34指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。

;S34.ASM为主模块程序名

EXTRNFINDC:

FAR

PUBLICSTRN

DATASEGMENT

STRNDB'LINKDISPLAYSUBROUTING$'

ADDRDW?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVAH,1

INT21H

CALLFARPTRFINDC

MOVADDR,DI

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

;FINDC.ASM为子模块程序名

PUBLICFINDC

EXTRNSTRN:

BYTE

CODESEGMENT

ASSUMECS:

CODE

FINDCPROCFAR

START:

LEADI,STRN

AGAIN:

CMPBYTEPTR[DI],'$'

JZDONE

CMPAL,[DI]

JNZNEXT

DONE1:

RET

NEXT:

INCDI

JMPAGAIN

DONE:

MOVDI,0FFFFH;找不到返回0FFFFH

JMPDONE1

FINDCENDP

CODEENDS

ENDSTART

实验4

S4利用pc机键盘,编写一个读入并显示键盘输入的演示程序。

该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。

在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。

有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。

PUBLICSCANTAB,BUFFER,BUFPT1,BUFPT2,KBFLAG

STACK1SEGMENT

DB256DUP(?

STACK1ENDS

DATASEGMENT

BUFFERDB16DUP(0);定义10个字节的键盘缓冲区

BUFPT1DW0;指向键盘缓冲区的起点,头取

BUFPT2DW0;指向键盘缓冲区的终点,尾存

;注意当BUFPT1=BUFPT2时,表明缓冲区空

KBFLAGDB0

PROMPTDB'---kbd_ioprogrambegin---',0DH,0AH,'$'

SCANTABDB0,0,'1234567890-=',8,0

DB'QWERTYUIOP[]',0,0

DB'ASDFGHJKL',3BH,27H,0DH

DB'ZXCVBNM,./',0

DB20H,0,0,0,0,0,0,0,0,0,0,0,0,0;由于不同键盘按键及分布各不相同,因此在调试时可能产生按键和显示有差异

DB'789-456+1230.'

EVEN

OLDIP9DW?

OLDCS9DW?

DATAENDS

EXTRNKBINT:

FAR;外部引用说明

CODESEGMENT

;主程序段

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

;建立自行设计的中断服务程序,写自行设计的中断处理程序入口偏移量到矢量表中

CLI;关中断,以防引起混乱

MOVAX,3509H;取类型9的中断向量

INT21H

MOVOLDCS9,ES

MOVOLDIP9,BX

PUSHDS

LEADX,KBINT

MOVAX,SEGKBINT

MOVDS,AX

MOVAX,2509H;设置类型9的中断向量

INT21H

POPDS

INAL,21H

ANDAL,0FDH;允许定时器和键盘中断的控制字送8259

OUT21H,AL

LEADX,PROMPT;在屏幕上显示---kbd_ioprogrambegin---

MOVAH,9

INT21H

STI;开中断

;程序功能:

读键盘并显示字符

FOREVER:

CALLKBGET;读缓冲区字符

TESTKBFLAG,80H;如果输入任意功能键,则使KBFLAG=80,退出

JNZENDINT

PUSHAX

CALLDISPCHAR;显示接收字符

POPAX

CMPAL,'A'

JZENDINT;输入A结束程序

CMPAL,0DH;是回车符吗?

JNZFOREVER;不是再接收

MOVAL,0AH

CALLDISPCHAR;是,换行

JMPFOREVER;接收下一行字符

ENDINT:

MOVDX,OLDIP9

MOVAX,OLDCS9

MOVDS,AX

MOVAH,25H

MOVAL,9

INT21H

MOVAH,4CH

INT21H

;KBGET1取缓冲区字符->(返回)

KBGETPROCNEAR

PUSHBX

CLI

MOVBX,BUFPT1

CMPBX,BUFPT2

JNZKBGET2;缓冲区不空,转KBGET2,取字符

CMPKBFLAG,0

JNZKBGET3

STI;开中断

POPBX

JMPKBGET;当输入缓冲区为空,且没有按键时循环等待

;取缓冲区字符

KBGET2:

MOVAL,[BUFFER+BX];取缓冲区字符

INCBX;首指针加1

CMPBX,16;到缓冲区尾吗?

JCKBGET3;未到,转,KBGET3

MOVBX,0;到,指向缓冲区首

KBGET3:

MOVBUFPT1,BX;保护首指针

POPBX;恢复BX寄存器

RET

KBGETENDP

;CHAR字符显示子程序

DISPCHARPROCNEAR

PUSH

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1