北京理工大学汇编第五次子程序设计实验设计性实验.docx
- 文档编号:4369192
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:32.44KB
北京理工大学汇编第五次子程序设计实验设计性实验.docx
《北京理工大学汇编第五次子程序设计实验设计性实验.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编第五次子程序设计实验设计性实验.docx(15页珍藏版)》请在冰豆网上搜索。
北京理工大学汇编第五次子程序设计实验设计性实验
汇编第五次(子程序设计)实验(设计性实验)
一、实验要求和目的
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]
PUSHAX
PUSHBX
PUSHDX
POPDX
POPAX
RET
过程名ENDP
3.子程序的参数传递方法
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
MOVAH,9
INT21H
C)表的处理知识要点:
表的处理在实际数据处理中应用较为广泛,主要有排序、搜索、插入和删除等操作。
有一些常用的冒泡法、对分搜索法等需要掌握。
四、实验内容与步骤
1.从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某一字符或删除某一字符,并显示操作后的字符串。
1)代码
DATASEGMENT
BUFDB25
ACTHARDB?
CHARDB25DUP(?
)
DB'$'
STRDB'1.INSERT2.DELETE','$'
STR1DB'PLEASEINPUT:
','$'
STR2DB0DH,0AH,'$'
PLACEDB?
CHRDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTR1
MOVAH,09H
INT21H
MOVDX,OFFSETBUF
MOVAH,0AH
INT21H
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
MOVDX,OFFSETSTR
MOVAH,09H
INT21H
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
MOVAH,1
INT21H
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
CMPAL,31H
JNZDELETE
CALLINSERT
JMPL
DELETE:
CALLDELE
L:
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
MOVDX,OFFSETCHAR
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
INSERTPROCNEAR
MOVDX,OFFSETSTR1
MOVAH,09H
INT21H
MOVAH,01H
INT21H
SUBAL,30H
MOVPLACE,AL
MOVAH,01H
INT21H
MOVCHR,AL
MOVCX,0000H
MOVCL,[ACTHAR]
MOVSI,CX
MOVBX,OFFSETCHAR
MOVAL,'$'
MOV[BX][SI],AL
SUBCL,PLACE
INCCX
INCCX
L1:
MOVAL,CHAR[SI]
MOVCHAR[SI+1],AL
DECSI
LOOPL1
INCSI
MOVAL,CHR
MOVCHAR[SI],AL
RET
INSERTENDP
DELEPROCNEAR
MOVDX,OFFSETSTR1
MOVAH,09H
INT21H
MOVAH,01H
INT21H
SUBAL,30H
MOVPLACE,AL
MOVSI,WORDPTRPLACE
MOVCX,0
MOVCL,ACTHAR
MOVDI,CX
MOVAL,'$'
MOV[CHAR][DI],AL
INCCX
SUBCL,PLACE
L2:
MOVAL,CHAR[SI]
MOVCHAR[SI-1],AL
INCSI
LOOPL2
RET
DELEENDP
CODEENDS
ENDSTART
2)操作步骤
实例1:
-g使程序运行,输入字符串‘segmentdebug’,选择插入字符,在第8个字符处插入‘!
’。
程序运行的结果如下:
实例2:
-g使程序运行,输入字符创‘segment!
Debug’,选择删除字符,删除第8个字符。
程序运行结果如下:
2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。
1)代码
DATASEGMENT
NUM10DB5DUP(?
)
NUMDB6DUP(?
)
INPUTDB5
ACTUALDB?
CHARDB5DUP(?
)
DB'$'
NUM16DW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETINPUT
MOVAH,0AH
INT21H
CALLFUNC
CALLPRINT
MOVAH,4CH
INT21H
FUNCPROCNEAR
MOVCX,4
MOVAX,0
MOVDX,0
MOVSI,0
MOVBX,0
L1:
MOVBX,10H
MULBX
MOVBL,CHAR[SI]
CMPBX,41H
JSG1
SUBBL,37H
JMPG2
G1:
SUBBL,30H
G2:
ADDAX,BX
INCSI
LOOPL1
MOVNUM16,AX
RET
FUNCENDP
PRINTPROCNEAR
MOVAX,NUM16
MOVDX,0
MOVSI,0
MOVBX,0AH
L2:
CMPAX,0
JZS
IDIVBX
MOVNUM10[SI],DL
MOVDX,0
INCSI
JMPL2
S:
MOVCX,SI
MOVDI,0
S1:
DECSI
MOVAL,NUM10[SI]
ADDAL,30H
MOVNUM[DI],AL
INCDI
LOOPS1
MOVAL,'$'
MOVNUM[DI],AL
MOVDX,OFFSETNUM
MOVAH,09H
INT21H
RET
PRINTENDP
CODEENDS
ENDSTART
2)操作步骤
运行程序。
输入十六进制数8B9AH,十进制为35738
程序运行结果如下,结果正确。
3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。
1)代码
DATASEGMENT
NUMDDB3
ACTUALDB?
CHARDB3DUP(?
)
DB'$'
NUMXDB10DUP(?
)
DB'$'
PRINTDB2DUP(?
)
DB'$'
STR1DB'PLEASEINPUT:
','$'
STR2DB0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
CALLINPUT
CALLOUTPUT
MOVAH,4CH
INT21H
INPUTPROCNEAR
MOVCX,10
MOVSI,0
L1:
MOVDX,OFFSETSTR1
MOVAH,09H
INT21H
MOVDX,OFFSETNUMD
MOVAH,0AH
INT21H
MOVAX,0
MOVBX,0AH
MOVAL,[CHAR]
SUBAL,30H
MULBL
MOVBL,1[CHAR]
SUBBL,30H
ADDAL,BL
MOVNUMX[SI],AL
INCSI
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
LOOPL1
RET
INPUTENDP
OUTPUTPROCNEAR
MOVCX,10
L2:
MOVSI,0
MOVBX,CX
SUBBX,1
K:
CMPSI,BX
JZS
MOVAL,NUMX[SI]
MOVAH,NUMX[SI+1]
CMPAL,AH
JNSM
JMPN
M:
XCHGAL,AH
MOVNUMX[SI],AL
MOVNUMX[SI+1],AH
N:
INCSI
JMPK
S:
LOOPL2
MOVSI,0
MOVCX,10
MOVBX,10H
L3:
MOVAX,0
MOVAL,NUMX[SI]
DIVBL
CMPAL,0AH
JSM1
ADDAL,37H
JMPM2
M1:
ADDAL,30H
M2:
MOVPRINT,AL
CMPAH,0AH
JSM3
ADDAH,37H
JMPM4
M3:
ADDAH,30H
M4:
MOVPRINT[1],AH
MOVDX,OFFSETPRINT
MOVAH,09H
INT21H
MOVDX,OFFSETSTR2
MOVAH,09H
INT21H
INCSI
LOOPL3
RET
OUTPUTENDP
CODEENDS
ENDSTART
2)操作步骤
运行程序。
输入十个十进制数:
99、98、97、30、45、87、63、46、56、38。
程序运行结果如下,输出的十六进制数为:
1EH、26H、2DH、2EH、38、3FH、57H、61H、62H、63H。
结果正确。
五、思考与练习
1.字符串在内存中是如何存储的?
字符串在内存中以字节(byte)为单位存储,字符串包含多少字符就需要多少byte来存。
汇编中定义一个字符串如下:
myStringBYTE"ABCDEF",0;常以0作为字符串的结尾
内存中存储顺序如图所示,从箭头开始,依次向下。
假设第一个地址是0000h,下一个byte的地址就是00001h,依次类推。
内存中存储的是字符的二进制编码,比如A41h=01000001b。
2.屏幕有多个字符串显示时,如何换行?
在内存中定义一个字符串为:
“STR2DB0DH,0AH,'$'”,当需要换行的时候,输出这个字符串就可以了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京理工大学 汇编 第五 次子 程序设计 实验设计 实验