汇编语言综合实验Word格式.docx
- 文档编号:20843423
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:17
- 大小:43.24KB
汇编语言综合实验Word格式.docx
《汇编语言综合实验Word格式.docx》由会员分享,可在线阅读,更多相关《汇编语言综合实验Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
hong1macro;
------------------定义回车换行的宏!
!
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
Endm
hong2定义的功能是提示信息和输入的功能,这个宏的定义主要用在对学生成绩
的输入上,和相关信息的显示,而且这个宏用到了传参因为在调用10号功能和9号
功能都能用这一个程序。
hong2macroopr1,opr2;
------------------定义输入输出!
leadx,opr1
movah,opr2
int21h
endm
其中opr1是传递的缓冲区的亚元,opr2是传递功能号的亚元。
Hong3定义空格的宏,这个宏的定义是为了在学生成绩输出时能显示的更加美
观一些。
hong3macro;
-------------------定义空格!
movdl,20h
movah,2
hong4定义的清楚回车键的宏,因为信息输入用的是10号功能,在信息输入结
束时是以回车键结束的,而且程序中涉及到了信息的转存,如果将回车键也一同转
存到新的存储单元中,在用2号功能实现对学生信息的显示时碰到回车键,就会出现
终止的错误,因此在转存前就先对缓冲区里的回车键进行清空。
hong4macroopr1,opr2;
------------------清楚缓冲区里的回车键!
moval,0pr1
addal,2
movah,0
movsi,ax
movbuff1[si],0
因为定义了姓名、分数、学号三个缓冲区,因此应定义带有参数的宏,以方便对三
个不同的缓冲区时只需用不同的参数就能实现相同的功能。
Hong5定义的转存的宏,程序中有将缓冲区里的数据转存到一个大的存储单元
中,以方便实现成绩的比较和最后学生所有信息的输出,因为姓名、成绩、学号都
需转存,而且转存后还要进行对缓冲区的内容进行清空,这些都是操作的代码出了
存储区和计算单元的个数其他的内容都是相同因此定义这个宏会减少很多代码的输
入。
hong5macroopr1,opr2,opr3,opr4
movcx,opr1
leasi,opr2;
传送姓名
leadi,opr3
adddi,opr4
cld
repmovsb
movax,0
宏的引用虽然能够减少大量的代码但是在调用宏时应注意对应位置参数的传递
以免出现错误导致程序不能正常运行。
其次是在程序不能将程序都用宏调用,如果
那样在读代码时就会造成理解困难因为只有变量、缓冲区和存储单元再有就是宏。
读者不能明白其中的格式,因此在调用宏时用该保留一个具体的程序段以方便读者
了解具体的代码格式也方便查找错误。
⑶功能实现的过程
①输入过程
用宏定义调用9号功能提示信息“inputname”,接着调用10号功能将输入的姓
名存入缓冲区buff1,这就完成了姓名的输入,用同样的方法和调用宏完成分数和学
号的输入分别存入buff2、buff3,这就完成了一个学生信息的输入,其中要记得将
回车键清0,然后调用转存的子程序。
再执行LOOP循环完成一定量学生信息的输入。
②转存实现的是将输入的姓名、分数、学号存入到定义好的足够长的存储单
元中,再转存时需要注意单元地址的计算,其中包括首地址的计算和传递两个字符
串时之间的间隔,转存不逊要循环,因为没输入一次程序会自动调用转存的子程序
完成转存的功能,但是在转存的同时需要注意对缓冲区的清0的操作因为如果没有及
时的对缓冲区清0,下一次向缓冲区里输入信息时,原有信息将会被覆盖,如果输入
的字符长度小于上一次输入字符的长度,那么这次转存的数据将是刚刚输入的数据
和上一次没有被覆盖的数据这就会时输出错误。
因此转存时,关键注意的就是地址
的计算和对缓冲区清0的操作。
③对存储单元里的分数进行排序,采用的排序的方法是冒泡排序,存储单元
里的数据没有转换为十进制的两位数,因此在执行比较时就只能将他看做是十位和
个位分别进行比较。
我定义的分数的单元三个,因此比较时单元地址的间隔为三,
而且是单元地址从0开始,如果十位相等,就对地址加1进行各位的比较,一次进行,
然后对满足条件的单元进行互换,采用xchg伪指令,这时也要执行相关数据的姓名
和学号,在开始时就饿首先给di、si赋给初值为0,然后和分数的地址单单元一起进
行循环,但是这两个寄存器循环时相加的值非别是10和3,因为姓名的间隔是10个单
元,而学好的间隔是3个单元,在进行循环时应该注意到计数器cx的保存,因为在执
行分数的交换时会用到cx这时cx赋给的值是P-1而在进行姓名和学好进行交换时,c
X分别赋给的值是数据的单元间隔就是10和3此时对CX的保护就会用到入栈,
出栈。
但是比较的程序要进行循环因为冒泡排序只能比较相邻两个数字的大小,因
此此时会涉及到外循环,就是对计数器CX的保护,采用入栈出栈的方式。
这样才
能保证程序的顺利进行。
这个子程序主要用到的就是交换的指令代码如下:
MOVAL,SCORE[BX]
xchgal,score[bx+3]
movscore[bx],al
moval,score[bx+1]
在进行姓名和学好的交换过程中也只用到这段代码,只是将其中的存储单元的名和
中括号里的寄存器改变成为不一样的就能够执行了。
④学生信息的输出,这段子程序主要用到的就是2号功能,虽然2号功能每
次只能显示一个字符,但是经过多次的循环显示会达到与9号功能一样的效果,这
段程序中需要注意的也是地址的计算,只是单纯的从存储单元里显示出来不需要什
么计算地址从0开始循环相应的存储区单元的个数即可,程序中还加上了名次,方
法比较简单执行循环每次加1用2好功能显示,就能达到想要的结果。
(4)排序流程图
(5)程序运行结果图
(6)总结与体会
在这次的综合实验中,遇到了很多细节问题,首先就是在进行循环没有及时的对CX计数器进行入栈保存,以至于在输出时显示的不是学生的信息而是乱码,其次就是对寄存器CX的值没有能够正确的把握,因为在循环中没有给计数器赋予正确的值则在转存、比较、输出时都会出现错误,而且这些错误不容易发现,因此在编程时应仔细计算循环的次数,即计数器的初值。
遇到的最大的问题就是对姓名和学号的交换,因为姓名和学号的循环是基于分数交换的基础上的,因此在分数交换的同时进行姓名和学号的交换成为了这个程序的关键,这里出现的问题也是最不好解决的的,最后终于实现了在分数交换的同时姓名和学好也一切跟着进行了交换。
这次试验我学到了很多的知识,首先就是对书上的一些基础知识进行了巩固,指令、伪指令、宏、子程序的运用在程序中都用到了。
全面的对学过的知识进行了综合性的复习。
而且在边学程序时也会锻炼思维能力,因为很多的地址单元和寄存器的值都是通过计算才能保证程序正常运行的,还有就是培养动脑的能力,因为同样的功能可以有集中不同的方法,就像分数的比较上,可以先将它们转化为十进制的两位数再进行比较,也可以通过一位一位的比较实现对两位数大小的比较。
最后就是为了减少程序中的代码量。
适当的调用宏,既能够使读程序的人易于理解,也
能方便自己修改。
总之,这次综合实验是自己获益匪浅。
教师评价
评定项目
A
B
C
D
算法正确
操作熟练
程序结构合理
实验结果正确
功能完善
文字流畅、报告规范
其他:
评价教师签名:
2017年12月3日
源代码:
DATASSEGMENT
mess0db0ah,0dh,'
numnamescorexuehao$'
;
mess1db0ah,0dh,'
inputname:
$'
mess2db0ah,0dh,'
inputscore:
mess3db0ah,0dh,'
inputxuehao:
mess4db'
xueshengchengjipaixu$'
pequ3;
输入的人数
buff1db10,?
10dup(0);
姓名缓冲区,加$符号以便输出时使用
buff2db3,?
3dup(0);
成绩缓冲区
buff3db4,?
4dup(?
)
snamedbpdup(10dup(0));
保存姓名
scoredbpdup(3dup(0));
保存成绩
xuehaodbpdup(4dup(0))
sing1dw0
sing2dw0
sing3dw0
countdb'
1'
;
计数
此处输入数据段代码
DATASENDS
STACKSSEGMENT
此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
hong1macro;
定义回车换行的宏
movdl,0ah
movah,2
int21h
movdl,0dh
endm
hong2macroopr1,opr2;
定义输入输出
leadx,opr1
movah,opr2
hong3macro;
定义空格
movdl,20h
hong4macroopr1,opr2;
清楚缓存区里的回车键
moval,opr1
addal,2
movah,0
movsi,ax
movopr2,0
hong5macroopr1,opr2,opr3,opr4;
movcx,opr1
leasi,opr2
leadi,opr3
adddi,opr4
cld
repmovsb
movax,0
endm
START:
MOVAX,DATAS
MOVDS,AX
moves,ax
movbx,0;
movcx,0
hong2mess4,9
hong1
callinput;
调用子程序1
callbijiao
callprint
movah,4ch
int21h;
子程序1,输入姓名、成绩,学号
inputproc
incbx;
输入次数统计
cmpbx,p;
输入次数>
p?
jaexit
hong2mess1,9;
宏调用提示和输入姓名
leadx,buff1;
显示提示1
movah,10
moval,buff1+1;
实际输入个数放入AL
addal,2;
+2,包含buff1的0,1单元号
movsi,ax;
回车0d所在位置,跟在最后一个字符后
movbuff1[si],0;
将0d换为0,便于输出显示
hong2mess2,9;
宏调用提示和输入分数
hong2buff2,10
hong4buff2+1,buff2[si];
宏调用清空回车键
hong2mess3,9;
宏调用提示和输入学号
hong2buff3,10
hong4buff3+1,buff3[si];
cmpbx,1
jzlet5
addsing1,10
addsing2,3
addsing3,4
let5:
callzhuancun
jmpinput
exit:
ret
inputendp
转存子程序
zhuancunproc
movcx,10
leasi,buff1+2;
leadi,sname
adddi,sing1
movcx,10;
将缓存区清空
leadi,buff1+2
repstosb
hong53,buff2+2,score,sing2
hong54,buff3+2,xuehao,sing3
zhuancunendp
比较子程序
bijiaoproc
movcx,p
loop1:
pushcx;
保存外循环
movdi,0
movsi,0
movbx,0
movcx,p-1
bj1:
moval,score[bx];
比较十位
cmpal,score[bx+3]
jlebj2
addbx,3
addsi,10
adddi,4
deccx
jnzbj1
jmpout1
bj2:
jlbj3;
比较个位
moval,score[bx+1]
cmpal,score[bx+4]
jlbj3
bj3:
进行交换两个数字的位置
xchgal,score[bx+3]
movscore[bx],al
xchgal,score[bx+4]
movscore[bx+1],al
pushsi
pushcx
lp1:
moval,sname[si]
xchgal,sname[si+10]
movsname[si],al
incsi
jnzlp1
pushdi
movcx,4
lp2:
moval,xuehao[di]
xchgal,xuehao[di+4]
movxuehao[di],al
incdi
looplp2
popdi
popcx
popsi
out1:
popcx
jnzloop1
bijiaoendp
输出子程序
printproc
hong2mess0,9
rept1:
输出名次
movdl,count
inccount
movcx,7
l1:
hong3
loopl1
let1:
输出姓名
movdl,sname[bx]
incbx
looplet1
movcx,3
let2:
输出分数
movdl,score[si]
looplet2
movcx,5
l2:
loopl2
let3:
movdl,xuehao[di]
looplet3
looprept1
printendp
CODESENDS
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 综合 实验