北京理工大学汇编语言实验报告实验五子程序设计实验.docx
- 文档编号:24208160
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:13
- 大小:286.84KB
北京理工大学汇编语言实验报告实验五子程序设计实验.docx
《北京理工大学汇编语言实验报告实验五子程序设计实验.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编语言实验报告实验五子程序设计实验.docx(13页珍藏版)》请在冰豆网上搜索。
北京理工大学汇编语言实验报告实验五子程序设计实验
北京理工大学汇编语言实验报告实验五子程序设计实验
实验五子程序设计实验(设计性实验)
一、实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言子程序设计方法;
3.熟悉利用汇编语言子程序参数传递方法;
4.熟悉汇编语言字符串处理基本指令的使用方法;
5.掌握利用汇编语言实现字符串的输入输出程序设计方法;
6.掌握数制转换程序实现方法。
二、软硬件环境
1、硬件环境:
计算机系统windows;
2、软件环境:
装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识
A)子程序知识要点:
1、掌握子程序的定义语句;
过程名PROC[near/far]
过程体
RET
过程名ENDP
2.子程序结构形式
一个完整的子程序一般应包含下列内容:
1.)子程序的说明部分
在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:
.子程序名:
命名时要名中见意.
.子程序的功能:
说明子程序完成的任务;
.子程序入口参数:
说明子程序运行所需参数及存放位置;
.子程序出口参数:
说明子程序运行结果的参数及存放位置;
.子程序所占用的寄存器和工作单元;
.子程序调用示例;
2、)掌握子程序的调用与返回
在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
.段内调用与返回:
调用子程序指令与子程序同在一个段内。
因此只修改IP;
.段间调用与返回:
调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:
IP。
3.)子程序的现场保护与恢复
保护现场:
在子程序设计时,CPU内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:
过程名PROC[NEAR/FAR]
PUSHBX
PUSHDX
POPDX
POPAX
RET
过程名ENDP
4.子程序的参数传递方法
1.寄存器传递参数
这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数
这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运
行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
3.用堆栈传递参数
利用共享堆栈区,来传递参数是重要的的方法之一。
B)字符、字符串输入输出知识要点:
在实际应用中,经常需要从键盘输入数据并将结果等内容显示到屏幕上,方便程序控制
及查看结果。
汇编语言的数据输入和输出分成两类,一是单个字符数据的输入输出,一是字符串数据的输入输出。
都可以通过DOS功能调用来实现,下面就分别介绍下用来实现数据输入输出的功能调用的使用方法。
1、单个字符输入
单个字符输入可以利用DOS的1号功能调用来完成,使用方法为:
MOVAH,1
INT21H
这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCII
码形式存储在AL寄存器中。
2、单个字符输出
单个字符输出可利用DOS2号功能调用来完成,使用方法为:
MOVDL,’?
’
MOVAH,2
INT21H
单个字符输出需要把要输出字符的ASCII码放在DL寄存器中。
3、字符串输入
从键盘输入一串字符串可以利用DOS的10号功能调用来完成,使用方法为:
BUFDB50;预定义可以输入的最大字符个数
DB?
;实际输入字符个数,根据输入自动统计
DB50DUP(?
);存放输入字符串数据缓冲区
LEADX,BUF
MOVAH,10
INT21H
4、字符串输出
字符串输出可由DOS9号功能调用来完成,使用方法为:
STRINGDB‘HELLO$’
LEADX,STRING
INT21H
C)表的处理知识要点:
表的处理在实际数据处理中应用较为广泛,主要有排序、搜索、插入和删除等操作。
有
一些常用的冒泡法、对分搜索法等需要掌握。
四、实验内容与步骤
1、从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某一字符或删除某一字符,并显示操作后的字符串。
·源代码如下:
DATASSEGMENT
BUFDB20
DB?
DB20DUP(0)
DB6DUP(0)
STRING0DB'PLEASEINPUTSTRINGS:
',0AH,0DH,'$'
STRING1DB'PLEASECHOOSEINSERTORDELETE:
1.INSERT2.DELETE',0AH,0DH,'$'STRING2DB'PLEASEINPUTTHEADDRESSTODELETE',0AH,0DH,'$'
STRING3DB'PLEASEINPUTTHEADDRESSTOINSERT',0AH,0DH,'$'
STRING4DB'PLEASEINPUTTHESYMBOLTOINSERT',0AH,0DH,'$'
BUF1DB20DUP(0),'$'
INSERDB0,0
DELEDB0
NUMBERDB0
DATASENDS
STACKSSEGMENT
DB256DUP(0)
STACKSENDS
CODESSEGMENT
assumeCS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LEABX,STRING0
CALLOUTPUTSTR;输出字符串0
CALLINPUTSTR;输入字符串
CALLHUICHE
MOVAL,[BUF+1]
MOVNUMBER,AL
LEABX,STRING1
CALLOUTPUTSTR;输出字符串1
MOVAH,01H;输入1或2
INT21H
CMPAL,'1'
CALLHUICHE
JZIN1
LEABX,STRING2;为2,执行删除操作CALLOUTPUTSTR
MOVAH,01H
INT21H
ANDAL,0FH
MOV[DELE],AL
CALLHUICHE
CALLDELETE
CALLMOVE1
LEABX,BUF1
CALLOUTPUTSTR
CALLHUICHE
JMPFINAL
IN1:
LEABX,STRING3;执行插入操作
CALLOUTPUTSTR
MOVAH,01H
INT21H
ANDAL,0FH
LEABX,STRING4
CALLOUTPUTSTR
MOVAH,01H
INT21H
MOV[INSER+1],AL
CALLHUICHE
CALLINSERT
CALLMOVE1
LEABX,BUF1
CALLOUTPUTSTR
FINAL:
MOVAH,4CH
INT21H
INPUTSTRPROCNEAR;输入函数LEADX,BUF
MOVAH,0AH
INT21H
RET
INPUTSTRENDP
HUICHEPROCNEAR;回车换行函数MOVDL,0DH
MOVAH,02H
INT21H
MOVDL,0AH
MOVAH,02H
INT21H
RET
HUICHEENDP
OUTPUTSTRPROCNEAR
MOVDX,BX;输出字符串函数
MOVAH,09H
INT21H
RET
OUTPUTSTRENDP
DELETEPROCNEAR;删除函数
LEABX,BUF
MOVDI,BX
ADDDI,2
MOVAL,DELE
XORAH,AH
ADDDI,AX
XORCH,CH
MOVCL,NUMBER
ADDBX,CX
ADDBX,1
MOVE:
CMPBX,DI
JELADE
MOVDH,[DI+1]
MOV[DI],DH
INCDI
CMPBX,DI
JNEMOVE
LADE:
MOVBYTEPTR[DI],'$'
DECNUMBER
RET
DELETEENDP
MOVE1PROCNEAR;移动复制函数LEASI,BUF
ADDSI,2
LEADI,BUF1
MOVCL,NUMBER
XORCH,CH
REPMOVSB
MOVBYTEPTR[DI],'$'
RET
MOVE1ENDP
INSERTPROCNEAR;插入函数
LEABX,BUF
MOVDI,BX
MOVAL,[INSER]
XORAH,AH
ADDDI,AX
INCDI
XORCH,CH
MOVCL,NUMBER
ADDBX,CX
ADDBX,1
INS1:
MOVDH,[BX]
MOV[BX+1],DH
DECBX
CMPBX,DI
JAINS1
INCBX
MOVAL,[INSER+1]
MOV[BX],AL
INCNUMBER
RET
INSERTENDP
CODESENDS
ENDSTART
·运行结果如下:
其中在最开始输入1是添加,紧接着输入位置和要添加的字符,功能2是删除,接着输入删除的位置,如上图所示
2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。
datassegment
num2db0,0,0,0
num22dw0
tempiodb0
tempdw0
tabdb'0123456789abcdef'
datasends
stackssegment
stacksends
codessegment
assumeds:
datas,ss:
stacks,cs:
codesstart:
movax,datas
movds,ax
movax,0
leasi,num2
callinput
moval,tempio
subal,'0'
movds:
[si],al
incsi
callinput
moval,tempio
subal,'0'
movds:
[si],al
incsi
callinput
moval,tempio
subal,'0'
movds:
[si],al
incsi
callinput
moval,tempio
subal,'0'
movds:
[si],al
callnewline
leasi,num2
movcx,4
movdx,0ah
l2:
cmpds:
[si],dl
jbl21
moval,ds:
[si]
subal,7
movds:
[si],al
l21:
incsi
loopl2
leasi,num2
movah,ds:
[si]
movcx,4
shlah,cl
incsi
movbl,ds:
[si]
incsi
moval,ds:
[si]movcx,4
shlal,cl
incsi
movbl,ds:
[si]addal,bl
movnum22,ax;1
movdx,0
movcx,2710hdivcx
movtemp,dxaddax,'0'movtempio,alcalloutputmovax,temp
;2
movdx,0
movcx,3e8hdivcx
movtemp,dxaddax,'0'movtempio,alcalloutputmovax,temp
;3
movdx,0
movcx,64h
divcx
movtemp,dxaddax,'0'movtempio,alcalloutputmovax,temp
;4
movdx,0
movcx,0ah
divcx
movtemp,dxaddax,'0'movtempio,alcalloutput
;5
addax,'0'movtempio,alcalloutputcallnewlinecallnewlinemovah,4ch
int21hinput:
movah,1
int21h
movtempio,alret
newline:
movah,2
movdl,0dh
int21h
movah,2
movdl,0ah
int21h
ret
output:
movah,2
movdl,tempioint21h
ret
codesendsendstart
运行结果如下:
3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。
·源代码如下:
DATASSEGMENT
BUFDB40
DB?
DB40DUP(0)
SHUZIDB10DUP(0)
BIAODW0
STRINGDB'PLEASEINPUT10NUMBERS:
$'
DATASENDS
STACKSSEGMENT
STADW20HDUP(0)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAX,STACKS
MOVSS,AX
LEABX,STRING;输出提示
CALLOUTPUTSTR
CALLHUICHE
CALLINPUT;输入10个十进制数
CALLHUICHE
CALLEXCHASC;将ASC码转换
CALLRANK;将其排序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 汇编语言 实验 报告 子程序 设计