北京理工大学汇编实验五实验报告文档格式.docx
《北京理工大学汇编实验五实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验五实验报告文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
过程名PROC[near/far]过程体
RET
过程名ENDP
2.子程序结构形式一个完整的子程序一般应包含下列内容:
1.)子程序的说明部分
在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.
说明时,应含如下内容:
.子程序名:
命名时要名中见意.
.子程序的功能:
说明子程序完成的任务;
.子程序入口参数:
说明子程序运行所需参数及存放位置;
.子程序出口参数:
说明子程序运行结果的参数及存放位置;
.子程序所占用的寄存器和工作单元;
.子程序调用示例;
2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
.段内调用与返回:
调用子程序指令与子程序同在一个段内。
因此只修改IP;
.段间调用与返回:
调用子程序与子程序分别在不同的段,因此在返回时,需同时修改
CS:
IP。
3.)子程序的现场保护与恢复保护现场:
在子程序设计时,CPU内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:
过程名PROC[NEAR/FAR]
PUSHAX
PUSHBX
.
PUSHDX
POPDX
POPAX
4.子程序的参数传递方法
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,9INT21H
C)表的处理知识要点:
表的处理在实际数据处理中应用较为广泛,主要有排序、搜索、插入和删除等操作。
有
一些常用的冒泡法、对分搜索法等需要掌握。
四、实验内容与步骤
1、从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某一字符或删除某一字符,并显示操作后的字符串。
程序流程图他如下:
源代码如下:
DATASSEGMENT
STR1DB'
inputstrings:
$'
STR2DB'
1toDelete0toinsert:
STR3DB'
inputstring:
STR4DB'
address:
BUF1DB?
BUF2DB?
ADB11
DB?
DB11DUP('
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
mainprocfar
MOVAX,DATAS
MOVDS,AX
LEADX,STR1
CALLoutput
LEADX,A
MOVAH,10
INT21H;
输入字符串保存在A中
callCR
LEADX,STR2
CALLoutput;
MOVAH,01
INT21H
CMPAL,'
0'
JZinsert
JNZdelete
insert:
LEADX,STR3
MOVBUF1,AL;
输入要插入的字符
LEADX,STR4
MOVBUF2,AL;
要插入位置
callinsert1
JMPL1
delete:
MOVBUF2,AL;
要删除的位置
callCR
calldelete1
L1:
LEADX,A[2]
MOVAH,4CH
INT21H
mainendp
CRprocnear
MOVDL,0DH
MOVAH,02H
MOVDL,0AH
ret
CRendp;
回车换行
outputprocnear
MOVAH,9
outputendp;
输出
insert1procnear
MOVBX,0
SUBBUF2,30H
MOVBL,A[1]
MOVSI,BX
INCBX
SUBBL,BUF2
MOVCX,BX
L3:
MOVBL,A[SI+1]
MOVA[SI+2],BL
DECSI
LOOPL3
MOVBL,BUF1
MOVAH,0
MOVAL,BUF2
MOVSI,AX
MOVA[SI+1],BL
insert1endp;
插入子函数
delete1procnear
MOVCX,BX
MOVBL,BUF2
INCSI
L4:
MOVA[SI],BL
INCSI
LOOPL4
MOVA[SI+1],'
delete1endp;
删除子函数
CODESENDS
ENDSTART
选择插入功能,运行结果如下:
选择删除功能,运行结果如下:
2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。
程序源代码和流程图如下:
DATASSEGMENT
num2DB0,0,0,0
num22DW0
tempioDB0
tempDW0
tabDB'
0123456789abcdef'
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
assumeDS:
DATAS,SS:
CODES,CS:
CODES
MOVAX,DATAS
MOVDS,AX
MOVAX,0
LEASI,num2
CALLinput
MOVAL,tempio
SUBAL,'
MOVDS:
[SI],AL
CALLnewline
MOVCX,4
MOVDX,0AH
cmpDS:
[SI],DL
jbL2
MOVAL,DS:
[SI]
SUBAL,7
L2:
loopL2
MOVAH,DS:
shlAH,CL
MOVBL,DS:
ADDAH,BL
shlAL,CL
ADDAL,BL
MOVnum22,AX
MOVDX,0
MOVCX,2710h
DIVCX
MOVtemp,DX
ADDAX,'
MOVtempio,AL
CALLoutput
MOVAX,temp
MOVCX,3e8h
MOVCX,64h
MOVCX,0AH
MOVAH,4ch
int21h
inputprocnear
MOVAH,1
ret
inputendp;
输入函数
newlineprocnear
MOVAH,2
MOVDL,0dh
MOVDL,0AH
newlineendp;
MOVDL,tempio
输出函数
CODESENDS
运行程序如下:
经验证结果正确
3、从键盘输入(显示提示)十个2位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。
流程图及源代码如下:
DATASSEGMENT
BUFDB40
DB?
DB40DUP(0)
SHUZIDB10DUP(0)
BIAODW0
STRINGDB'
input10numbers:
STACKSSEGMENT
STADW20HDUP(0)
STACKSENDS
STACKS
MOVAX,STACKS
MOVSS,AX
LEABX,STRING;
CALLHUICHE
CALLinput;
输入10个十进制数
CALLchange;
将ASCII码转换
CALLpaixu;
将其排序
LEASI,BUF
ADDSI,5
MOVDI,10
ABC:
MOVAL,[SI]
CALLoutput16;
将16进制数输出
CALLkongge
ADDSI,3
DECDI
JNZABC
outputprocnear;
输出字符串
MOVDX,BX
MOVAH,09H
RET
outputendp
inputprocnear;
输入字符串
LEADX,BUF
MOVAH,0AH
inputendp
HUICHEprocnear;
HUICHEendp
changeprocnear;
ASCII码转换
ADDSI,2
MOVCX,10
ANDBYTEPTR[SI],0FH
LOOPL1;
变成十进制
MOVBL,10
MULBL;
变成实际数字
ADDAL,[SI+1]
MOV[SI],AL
LOOPL2
changeendp
paixuprocnear;
排序
LEADI,BUF
ADDDI,5
MOVDI,CX
MOVBX,2
MOVAL,BUF[BX]
CMPAL,BUF[BX+3]
JBECONTINUE
XCHGAL,BUF[BX+3]
MOVBUF[BX],AL
CONTINUE:
ADDBX,3
MOVCX,DI
paixuendp
output16procnear;
显示16进制数字
MOVCL,4
MOVDL,AL
SHRDL,CL
MOVBIAO,AX
CALLexchange
MOVAX,BIAO
ANDDL,0FH
output16endp
exchangeprocnear
CMPDL,9
JANOTDIG
ORDL,30H
JMPFINAL
NOTDIG:
ADDDL,37H
FINAL:
exchangeendp
konggeprocnear;
输出空格
MOVDL,20H
konggeendp
ENDSTART
运行结果如下:
4、英文人名排序。
从终端键入20个人名,当所有人名都键入后,按字母上升的次序将人名排序,并在屏幕上显示已经排好序的人名。
流程图如下:
buf4DB460dup('
)
bp4DW20dup(0)
markDB'
@@'
num2DW20
num3DW19
ASSUMEDS:
STACKS,CS:
MOVES,AX
MOVAX,STACKS
MOVSS,AX
LEASI,buf4
LEADI,bp4
MOVCX,20
MOVAL,20
MOVDX,SI
ADDDX,2
MOVES:
[DI],DX
INCDI
CALLgets
ADDSI,23
loopL1
LEASI,bp4
MOVAX,19
MOVnum3,AX
MOVDI,DS:
[SI+2]
MOVtemp,SI
MOVAX,DS:
MOVSI,AX
repecmpsb
jsskip
MOVSI,temp
xchgAX,DS:
[SI],AX
skip:
MOVCX,num3
decCX
MOVnum3,CX
INCCX
loopL3
MOVCX,num2
MOVnum2,CX
MOVtemp,CX
MOVSI,ES:
[DI]
CALLputs
MOVCX,temp
loopL4
int21h
getsprocnear
MOVAH,10
getsendp
putsprocnear
MOVAH,9
putsendp
newlineprocnear
MOVdl,0dh
MOVdl,0AH
newlineendp
五、思考与练习
1.字符串在内存中是如何存储的?
2.屏幕有多个字符串显示时,如何换行?
答:
1.以8位ASCII码的形式连续存储
2.先输出换行符(10),然后输出回车符(13)
六、实验感悟
本次实验难度较大,综合了前几次实验的内容,编程很复杂。
但是综合设计让我们对汇编语言的整体了解有了更大的提升。