8086汇编语言程序设计实验指导书Word下载.docx
《8086汇编语言程序设计实验指导书Word下载.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计实验指导书Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
masmabc
不断修改错误,直至汇编通过为止。
用连接程序link产生执行文件exe.例:
linkabc
执行程序
可直接从DOS执行程序,即在DOS环境中,输入文件名即可。
(3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。
5.实验报告要求
(1)源程序清单。
(2)如何启动和退出EDIT程序。
(3)如何对源程序进行汇编及编辑。
(4)如何启动和退出DEBUG程序。
(1)
预习输入输出程序设计的特点和方法。
(2)
仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
5.实验步骤
建立源文件,并通过汇编和连接,产生可执行文件。
运行程序,观察常规字符键及功能键按下时程序的反应,
6.实验报告要求
给出程序框图,包括主程序框图、中断处理程序框图。
(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.
实验内容
编写一个可以进行光标左右移动和插入字符的简单字处理程序。
复习相关内容
(2)了解键盘的扫描码、ASCII码及其显示字符(如果存在可显示字符形式)之间的对应关系。
4.实验步骤
建立源文件,汇编、连接产生可执行文件。
运行程序,使得可以输入字符和光标左右移动及字符的插入。
5.
实验报告要求
由参考程序,画出简单字处理程序框图。
讨论如何实现光标的上下移动和字符的删除。
源程序清单
实验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:
LAB4:
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
LOOPLAB4
MOVDL,0DH
MOVDL,0AH
LEADI,X
LAB7:
MOVCX,16
LAB8:
XORDL,DL
ROLBX,1
RCLDL,1
LOOPLAB8
MOVDL,'
B'
'
LOOPLAB7
RET
MAINENDP
CSEGENDS
ENDSTART
其中斜体字部分为以二进制输出。
(2)编写一个程序S22,判别键盘上输入的字符;
若是1-9字符,则显示之;
若为A-Z或a-z字符,均显示“c”;
若是回车字符<
CR>
(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
S22.ASM
CODESEGMENT
CODE
START:
MOVAH,1
INT21H;
等待键入字符,送AL
CMPAL,0DH;
是否是回车符?
JZDONE;
是则转DONE退出程序
CMPAL,'
0'
JBNEXT
9'
JACHARUP
MOVDL,AL
MOVAH,2
INT21H
JMPSTART
CHARUP:
CMPAL,41H
CMPAL,5AH
JACHRDN
DISPC:
MOVDL,'
c'
INT21H
NEXT:
CHRDN:
CMPAL,61H
CMPAL,7AH
JANEXT
JMPDISPC
DONE:
MOVAH,4CH
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
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPAGAIN
MOVAH,4CH
HEXASCPROCNEAR
PUSHAX
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
CALLDISP;
显示高位HEX数
POPAX
ANDDL,0FH
CALLDISP
RET
HEXASCENDP
DISPPROC
CMPDL,9
JBENEXT
ADDDL,7
ADDDL,30H
MOVAH,2
INT21H;
显示
DISPENDP
(2)编写一个主程序S32,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
DATASEGMENT
CHARDB'
b'
BUFDB50H,?
50HDUP(?
)
CRLFDB0DH,0AH,'
$'
DATAENDS
MCODESEGMENT
MCODE,DS:
LEADX,BUF
MOVAH,0AH
LEADX,CRLF
MOVAH,9
LEASI,BUF
MOVCL,[SI+1]
MOVCH,0;
CX中为字符串长度
INCSI
INCSI;
SI指向串首址TABLE
MOVAL,CHAR
MOVAH,0;
AX中为待查字符
PUSHSI
PUSHAX;
参数送堆栈
CALLFARPTRCHECK
MOVDL,CHAR
INT21H
POPAX;
统计个数在AL中,个数不能超过一位16进制数
ANDDL,0FH
CMPDL,9
JBENEXT
ADDDL,7
ADDDL,30H
INT21H;
显示统计个数
MCODEENDS
SCODESEGMENT
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
CMPAL,[SI]
JNENEXT1
INCAH
NEXT1:
INCSI
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
实验3.2
(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序S33用另一个模块编写。
EXTRNDNTOUP:
FAR
PUBLICSTRING1,STRING2
STRING1DB'
thIsisAbook'
'
STRING2DB80DUP(?
MOVDS,AX
CALLFARPTRDNTOUP
MOVAH,4CH
DNTOUP.SM为子模块的文件名
PUBLICDNTOUP
EXTRNSTRING1:
BYTE,STRING2:
BYTE
DNTOUPPROCFAR
MOVBX,0
CYCLE:
MOVAL,STRING1[BX]
CMPAL,24H;
是否是STRING1结尾
是"
$"
转DONE
CMPAL,61H;
是小写字母吗?
JBNEXT;
不是转NEXT
CMPAL,7AH
SUBAL,20H;
转为大写字母
MOVSTRING2[BX],AL
INCBX
JMPCYCLE
MOVAL,'
MOVSTRING2[BX],AL;
补一个$
MOVDL,0DH
MOVAH,2
MOVDL,0AH
显示回车换行
LEADX,STRING1
MOVAH,9
显示源串内容
回车换行
MOVDX,OFFSETSTRING2
显示转换后的大写串
RET
DNTOUPENDP
ENDDNTOUP
(2)编写一个子程序,将主程序S34指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。
S34.ASM为主模块程序名
EXTRNFINDC:
PUBLICSTRN
STRNDB'
LINKDISPLAYSUBROUTING$'
ADDRDW?
MOVAH,1
INT21H
CALLFARPTRFINDC
MOVADDR,DI
FINDC.ASM为子模块程序名
PUBLICFINDC
EXTRNSTRN:
FINDCPROCFAR
LEADI,STRN
CMPBYTEPTR[DI],'
JZDONE
CMPAL,[DI]
JNZNEXT
DONE1:
INCDI
JMPAGAIN
MOVDI,0FFFFH;
找不到返回0FFFFH
JMPDONE1
FINDCENDP
实验4
S4利用pc机键盘,编写一个读入并显示键盘输入的演示程序。
该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。
在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。
有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。
PUBLICSCANTAB,BUFFER,BUFPT1,BUFPT2,KBFLAG
STACK1SEGMENT
DB256DUP(?
STACK1ENDS
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
ZXCVBNM,./'
0
DB20H,0,0,0,0,0,0,0,0,0,0,0,0,0;
由于不同键盘按键及分布各不相同,因此在调试时可能产生按键和显示有差异
DB'
789-456+1230.'
EVEN
OLDIP9DW?
OLDCS9DW?
EXTRNKBINT:
FAR;
外部引用说明
;
主程序段
CODE,DS:
MOVDS,AX
建立自行设计的中断服务程序,写自行设计的中断处理程序入口偏移量到矢量表中
CLI;
关中断,以防引起混乱
MOVAX,3509H;
取类型9的中断向量
INT21H
MOVOLDCS9,ES
MOVOLDIP9,BX
PUSHDS
LEADX,KBINT
MOVAX,SEGKBINT
MOVAX,2509H;
设置类型9的中断向量
POPDS
INAL,21H
ANDAL,0FDH;
允许定时器和键盘中断的控制字送8259
OUT21H,AL
LEADX,PROMPT;
在屏幕上显示---kbd_ioprogrambegin---
MOVAH,9
STI;
开中断
程序功能:
读键盘并显示字符
FOREVER:
CALLKBGET;
读缓冲区字符
TESTKBFLAG,80H;
如果输入任意功能键,则使KBFLAG=80,退出
JNZENDINT
CALLDISPCHAR;
显示接收字符
POPAX
CMPAL,'
A'
JZENDINT;
输入A结束程序
CMPAL,0DH;
是回车符吗?
JNZFOREVER;
不是再接收
MOVAL,0AH
是,换行
JMPFOREVER;
接收下一行字符
ENDINT:
MOVDX,OLDIP9
MOVAX,OLDCS9
MOVAH,25H
MOVAL,9
KBGET1取缓冲区字符->
(返回)
KBGETPROCNEAR
PUSHBX
CLI
MOVBX,BUFPT1
CMPBX,BUFPT2
JNZKBGET2;
缓冲区不空,转KBGET2,取字符
CMPKBFLAG,0
JNZKBGET3
POPBX
JMPKBGET;
当输入缓冲区为空,且没有按键时循环等待
取缓冲区字符
KBGET2:
MOVAL,[BUFFER+BX];
取缓冲区字符
INCBX;
首指针加1
CMPBX,16;
到缓冲区尾吗?
JCKBGET3;
未到,转,KBGET3
MOVBX,0;
到,指向缓冲区首
KBGET3:
MOVBUFPT1,BX;
保护首指针
POPBX;
恢复BX寄存器
KBGETENDP
CHAR字符显示子程序
DISPCHARPROCNEAR
PUSH