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

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

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

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

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

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

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

当前位置:首页 > 工程科技 > 材料科学

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

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