北京理工大学汇编第五次子程序设计实验设计性实验Word文档下载推荐.docx
《北京理工大学汇编第五次子程序设计实验设计性实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编第五次子程序设计实验设计性实验Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
子程序所占用的寄存器和工作单元;
子程序调用示例;
2)掌握子程序的调用与返回
在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
段内调用与返回:
调用子程序指令与子程序同在一个段内,因此只修改IP;
段间调用与返回:
调用子程序与子程序分别在不同的段,因此在返回时,需同时修改
CS:
IP。
3)子程序的现场保护与恢复
保护现场:
在子程序设计时,CPU内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:
过程名PROC[NEAR/FAR]
PUSHAX
PUSHBX
PUSHDX
POPDX
POPAX
3.子程序的参数传递方法
1.寄存器传递参数
这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数
这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;
子程序运
行时到约定存储位置读取参数;
子程序执行结束后将结果也放在约定存储单元中。
3.用堆栈传递参数
利用共享堆栈区来传递参数是重要的的方法之一。
B)字符、字符串输入输出知识要点:
在实际应用中,经常需要从键盘输入数据并将结果等内容显示到屏幕上,方便程序控制
及查看结果。
汇编语言的数据输入和输出分成两类,一是单个字符数据的输入输出,一是字
符串数据的输入输出,都可以通过DOS功能调用来实现,下面就分别介绍下用来实现数据输
入输出的功能调用的使用方法。
1.单个字符输入
单个字符输入可以利用DOS的1号功能调用来完成,使用方法为:
MOVAH,1
INT21H
这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCII码形式存储在AL寄存器中。
2.单个字符输出
单个字符输出可利用DOS2号功能调用来完成,使用方法为:
MOVDL,’?
’
MOVAH,2
单个字符输出需要把要输出字符的ASCII码放在DL寄存器中。
3.字符串输入
从键盘输入一串字符串可以利用DOS的10号功能调用来完成,使用方法为:
BUFDB50;
预定义可以输入的最大字符个数
DB?
;
实际输入字符个数,根据输入自动统计
DB50DUP(?
);
存放输入字符串数据缓冲区
LEADX,BUF
MOVAH,10
4.字符串输出
字符串输出可由DOS9号功能调用来完成,使用方法为:
STRINGDB‘HELLO$’
LEADX,STRING
MOVAH,9
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
MOVDX,OFFSETSTR2
MOVDX,OFFSETSTR
MOVAH,1
CMPAL,31H
JNZDELETE
CALLINSERT
JMPL
DELETE:
CALLDELE
L:
MOVDX,OFFSETCHAR
MOVAH,4CH
INSERTPROCNEAR
MOVAH,01H
SUBAL,30H
MOVPLACE,AL
MOVCHR,AL
MOVCX,0000H
MOVCL,[ACTHAR]
MOVSI,CX
MOVBX,OFFSETCHAR
MOVAL,'
MOV[BX][SI],AL
SUBCL,PLACE
INCCX
L1:
MOVAL,CHAR[SI]
MOVCHAR[SI+1],AL
DECSI
LOOPL1
INCSI
MOVAL,CHR
MOVCHAR[SI],AL
RET
INSERTENDP
DELEPROCNEAR
MOVSI,WORDPTRPLACE
MOVCX,0
MOVCL,ACTHAR
MOVDI,CX
MOV[CHAR][DI],AL
L2:
MOVCHAR[SI-1],AL
LOOPL2
DELEENDP
CODEENDS
ENDSTART
2)操作步骤
实例1:
-g使程序运行,输入字符串‘segmentdebug’,选择插入字符,在第8个字符处插入‘!
’。
程序运行的结果如下:
实例2:
-g使程序运行,输入字符创‘segment!
Debug’,选择删除字符,删除第8个字符。
程序运行结果如下:
2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。
NUM10DB5DUP(?
NUMDB6DUP(?
INPUTDB5
ACTUALDB?
CHARDB5DUP(?
NUM16DW?
MOVDX,OFFSETINPUT
MOVAH,0AH
INT21H
CALLFUNC
CALLPRINT
MOVAH,4CH
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
MOVBX,0AH
L2:
CMPAX,0
JZS
IDIVBX
MOVNUM10[SI],DL
JMPL2
S:
MOVCX,SI
MOVDI,0
S1:
MOVAL,NUM10[SI]
ADDAL,30H
MOVNUM[DI],AL
INCDI
LOOPS1
MOVAL,'
MOVDX,OFFSETNUM
MOVAH,09H
PRINTENDP
运行程序。
输入十六进制数8B9AH,十进制为35738
程序运行结果如下,结果正确。
3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。
NUMDDB3
CHARDB3DUP(?
NUMXDB10DUP(?
PRINTDB2DUP(?
CALLINPUT
CALLOUTPUT
INPUTPROCNEAR
MOVCX,10
MOVSI,0
MOVDX,OFFSETSTR1
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
LOOPL1
RET
INPUTENDP
OUTPUTPROCNEAR
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:
JMPK
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
LOOPL3
RET
OUTPUTENDP
ENDSTART
输入十个十进制数:
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,'
”,当需要换行的时候,输出这个字符串就可以了。