汇编实验报告汇总.docx
《汇编实验报告汇总.docx》由会员分享,可在线阅读,更多相关《汇编实验报告汇总.docx(15页珍藏版)》请在冰豆网上搜索。
汇编实验报告汇总
(此文档为word格式,下载后您可任意编辑修改!
)
湖北工程学院
计算机与信息科学学院
实验报告
2013—2014学年第二学期
课程名称:
汇编语言程序设计
班级:
学号:
姓名:
雷震
任课教师:
叶从欢
实验一:
顺序结构
一、实验目的:
1.加深对汇编的理解;
2.掌握汇编程序的设计方法;
3.学会使用顺序结构。
二、实验内容:
定义变量A、B、C、D,编写程序实现:
(a*b+c-70)/a。
并将最后的商保存在D中,余数保存在D+2中。
本实验中:
a=15,b=75,c=70。
程序中,定义字型变量A、B、C、D。
A、B、C分别保存算数表达式中的数值a、b、c,D保存算数运算的最终结果。
程序开始,先将变量A、B、C赋初值,计算A乘以B的值,将结果保存在DX、AX中,然后逐步计算A*B+C,A*B+C-70和(A*B+C-70)/A。
最后计算结果的商保存在AX中,余数保存在DX中,最终将AX赋值给D,DX赋值给D+2。
程序运行完毕,程序返回。
三、实验步骤
1.程序设计流程图
2.调试与运行
(1)首先进入DOS系统,进入目标文件所在的系统盘和文件夹;
(2)输入“MASMTEST”,此命令是调用宏汇编程序MASM对源文件TEST.ASM进行编译,TEST是文件的名称,生成目标文件TEST.OBJ;
(3)若汇编无错误,则用命令“LINKTEST”进行连接,生成可执行文件TEST.EXE;
(4)若连接成功,则用命令“TEST”运行。
四.总结与体会
通过这次实验,我初步了解了汇编程序设计的基本方法和步骤,掌握了汇编程序设计的顺序结构。
顺序结构是其他结构的基础,学好顺序结构对进一步学习汇编的好处不言而喻。
在本程序中,主要分为加法,减法,乘法,除法,本程序基本实现了四则运算的功能,该程序所完成的运算式为:
(a*b+c-70)/a。
并将运算结果存入变量D中,而余数存入D+2中。
改程序的不足之处是还没能实现除法运算中不能运算较大的数,会产生溢出现象。
完成了这次实验后,对汇编产生了兴趣,而且拥有的信心,以后的学习会再接再厉!
指导教师:
叶从欢___
实验二:
分支结构
1、实验目的
1.熟悉汇编语言程序设计结构;
2.了解汇编语言循环程序设计的基本流程;
3.熟悉汇编语言循环基本指令的使用方法;
4.掌握利用汇编语言实现分支程序设计方法;
5.熟悉汇编语言分支程序基本指令的使用方法;
6.掌握利用汇编语言的循环指令完成循环程序设计方法。
二、实验内容:
根据X的正、负、零来实现分支结构,最终分别输出不同的结果。
1.当X为正数时,将字符串变量Y中的内容“NAME~leizhen$”全部以大写字母输出;
2.当X为负数时,将字符串变量Y中的内容“NAME~leizhen$”全部以小写字母输出;
3.当X为0时,将字符串变量BUF中的内容“X:
0!
$”输出。
程序中,当X小于零时,转到A1标记,A1、A2、A3处理将Y中内容小写输出;当X大于等于0时,转到B1标记,在B1处判断X大于0还是等于0;当X等于0时,输出BUF中的内容;当X大于0时,程序跳转到C1标记,C1、C2、C3处理将Y中的内容大写输出。
三、实验步骤
1.程序设计流程图
YY
N
N
YN
N
2.调试与运行
编译运行文件test2.asm:
(1)将X的值设为正数,运行程序后,Y中“NAME~leizhen$”所有小写字母变为大写;
(2)将X的值设为负数,运行程序后,Y中“NAME~leizhen$”所有大写字母变为小写:
(3)将X的值设为0,运行程序后,输出BUF“X:
0!
$”。
四、总结体会
通过本次实验,让我更加了解了汇编语言的基本要求和步骤,深入了解指令执行的方式和不同的转移方式对应不同的机器码,提高自己动手能力。
本程序中利用利用X值的不同,从而对字符串BUF中的大小写进行相应的变换。
增加了程序的灵活性,让程序不在显得很死板。
这是程序设计的一个很大改善。
完成分支程序设计后,我对分支程序的结构也有了一定的理解,分支程序的结构很好的体现出了人对于问题的想法和解题思路,结构比较好理解和有条理。
这次实验也让我学到了许多汇编语言代码的意义和用法,为以后更加熟练操作编程提供方便。
指导教师:
叶从欢
实验三:
循环结构
一、实验目的
1.加深对循环结构的理解;
2.掌握循环程序的设计方法;
3.掌握程序接受用户从键盘输入数据的方法;
4.加深提示用户输入数据的这一习惯。
二、实验内容:
由用户从屏幕输入一个字符串,利用循环,将字符串中的大写转化为小写,小写转化为大写,然后逆序并输出。
程序中,INFO1和INFO2分别保存进行输入和输出的提示字符串;BUF保存输入字符串缓冲区的大小;LEN保存输入字符串的长度;STR1保存输入字符串的串首偏移地址;STR2保存装换后的字符串。
程序开始,进行9号调用输出提示信息INFO1,然后10号调用录入用户输入的字符串,然后换行。
将字符串长度保存在CL中,DI指向STR1的字符串尾,SI指向STR2的串首偏移地址,对读写字符进行控制。
CONT标号中利用循环逐一从STR1中取出字符,如果ASCLL码大于或等于‘a’,跳到BIG标号处,进行大写转小写操作,如果比‘a’小,而且大于或等于‘A’,则跳到SMALL标号处进行小写转大写操作,接着跳到FINAL对循环条件进行更改,如果CL不为0,则继续跳到CONT标号处进行循环。
最后先利用2号调用输出一个回车,然后9号调用输出STR2字符串,进入到EXIT标号,程序结束。
三、实验步骤
1.程序设计流程图
YN
Y
Y
N
2.调试与运行
编译运行文件test3.asm:
(1)编译运行源程序,出现提示用户输入的字符串;
(2)用户输入字符串:
(3)显示转换后的字符串:
四、总结体会
通过运行分析源程序,让我更加了解了循环程序的基本要求和步骤。
不仅如此,本程序还增加了输入输出提示功能,这在程序设计中是一个很重要的内容。
在设计的过程中,在换行上出现了不少的问题,比如本来要输出的字符串从本行开始覆盖了提示字符串,没有出现在它该出现的位置。
对此,我的解决方案是先输出一个换行,然后再输出一个回车,从而解决了我的问题。
在程序设计中,就要有这种独自探索的思想,发现问题,解决问题。
这次的实验让我更加了解了汇编,受益匪浅!
指导教师:
叶从欢
实验四:
双重循环结构
一、实验目的
1.加深对循环结构的理解;
2.掌握双重循环程序的设计方法;
3.掌握程序接受用户从键盘输入数据的方法;
4.加深提示用户输入数据的这一习惯;
5.加深对编程的独立探索能力。
二、实验内容:
由用户从屏幕输入连续的一串正整数,利用冒泡排序法,进行排序并输出。
程序中,INFO1和INFO2分别保存进行输入和输出的提示字符串;BUF保存输入字符串缓冲区的大小,BUF+1保存输入字符串的长度;BUF+2保存输入字符串的串首偏移地址。
程序开始,进行9号调用输出提示信息INFO1,然后10号调用录入用户输入的字符串,然后换行。
将字符串长度保存在CL中。
冒泡排序需要用到两层循环,均用CX对循环进行控制。
进入里层循环时,用BX保存当前CX的值。
循环开始,SI指向输入字符串的串首,逐一进行内循环将偏移地址SI中的内容与偏移地址SI+1中的内容进行比较,如果前者大于后者,则将两数进行交换;CX控制循环的次数,当CX减至0时,内层循环完成一次,此时将当前比较的字符中最大的移动到末尾。
退出内循环进入外层循环,将保存在BX中的数赋值给CX,若CX不为1,则继续进入到内循环执行。
否则循环执行完毕,冒泡排序结束。
最后先利用9号调用分别输出提示输出字符串和排好序的字符,程序结束。
三、实验步骤
1.程序设计流程图
YN
N
Y
Y
N
2.调试与运行
编译运行文件test4.asm:
(1)编译运行源程序,出现提示用户输入的字符串;
(2)用户输入字符串:
(3)显示冒泡排序后的字符串:
四、总结体会
通过运行分析源程序,让我更加了解了双重循环程序的基本要求和步骤。
本程序还增加了输入输出提示功能,这在程序设计中是一个很重要的内容,提高了程序设计的灵活、通用性。
除此之外,本程序实现了对用户输入的任意0~9间的字符进行排序。
因为要将排好序的数存放在原地址上,而且又是用户自己输入,所以,在一开始开辟内存单元时,就全部初始化为’$’符号,方便了最终程序利用9号调用对用冒泡排好序的字符进行输出。
在设计此程序时,不免失败了很多次,但是当最终成功的时候,那种快乐时用言语无所表达的。
这次的实验让我更加了解了汇编,受益良多!
指导教师:
叶从欢
实验五:
子程序
一、实验目的
1.加深对子程序的理解;
2.掌握子程序的设计方法;
3.学会使用while循环结构;
4.不同模块间程序的调用和调试;
5.学会利用子程序的特点减少程序的冗余度;
6.加深对编程的独立探索、创新能力。
二、实验内容:
利用子程序输出6行8列的平行四边形图形。
程序中,INFO保存输出提示字符串。
START标号指示代码段的开始;LOP标号指示调用BLANK子程序,输出空格;TAG标号指示调用GRAPH子程序,输出‘*’号;EXIT标号指示主程序的退出。
BLANK子程序中LOP1标号指示输出空格循环的开始,GRAPH子程序中LOP2标号指示输出星号循环的开始。
程序开始,进行9号调用输出提示信息INFO,然后换行。
用BX存放总的循环次数,5次。
将BX赋值给CX,CX控制BLANK子程序中输出空格的次数。
进入LOP标记,调用BLANK子程序,输出空格。
然后进入TAG标记,调用GRAPH子程序,输出星号。
输出一行图形后,对循环条件进行更改,将BX减1,如果BX小于0,则整个外层循环完成,程序退出。
否则将BX赋值给CX,继续跳转到LOP标记进行循环。
BLANK子程序中,利用while循环结构对空格进行输出。
首先将循环条件CX减1,对CX进行判断,如果CX小于0,则程序返回,否则就输出一个空格。
然后就继续跳转到BLANK中的LOP1标号进行循环。
GRAPH子程序中,保存主程序中用到的CX,并将CX赋值为8。
利用do-while循环,输出8个星号,然后输出换行,对进行下次图形输出做准备。
三、实验步骤
1.程序设计流程图
主函数流程图:
N
Y
BLANK函数流程图:
N
Y
GRAPH函数流程图:
Y
N
2.调试与运行
编译运行文件test5.asm:
编译运行源程序,屏幕出现平行四边形图案
四、总结体会
这次实验学习了子程序的编写以及主程序和子程序的调用,不同模块间程序的调用和调试方法,实践的过程中加深了对子程序调用的代码的使用,让我更加了解了子程序设计的基本格式和步骤。
本实验中用到了两个子程序,分别实现了输出空格和输出星号的功能。
在编写输出空格子程序时,由于当CX等于0时,仍然要执行一次循环,如果用do-while循环,则要将CX减1,则CX中存储的内容变成了-1的补码,也就是255,使得程序陷入死循环。
在此的处理办法是将do-while循环改写成while循环,执行循环内容之前先对条件进行判断,从而解决了这个难题。
好的程序都是调试出来的,而不是写出来的。
所以在编程过程中,我们应该有耐心去一步步的调试程序,发现问题,解决问题,最终走向成功。
指导教师:
叶从欢
实验六:
宏程序
一、实验目的
1.掌握宏的应用;
2.掌握宏的定义和使用;
3.加深对宏程序的理解;
4.掌握创建宏组和条件宏的方法;
5.加深对编程的独立探索、创新能力;
6.学会利用宏程序的特点减少程序的冗余度。
二、实验内容:
利用宏程序实现将输入的字符串逆序输出,要求尽可能提高时间复杂度。
本程序没有开辟一个新的空间来存储逆序后的字符串,而是直接在原存储区上对输入字符串进行改变。
不仅如此,本程序每次循环逐一将首尾字符进行交换,这样将时间复杂度由原来的O(N)提高到O(n/2)。
程序中,INFO1保存输入提示字符串,INFO2保存输出提示字符串。
BUF指示缓冲区的大小,LEN指示输入字符串的长度,STR指示输入的字符串。
程序开始,利用定义在MACRO.LIB中的定义的宏进行宏调用,RETURN输出回车换行符,PRINT输出字符变量INFO1,INPUT从键盘输入字符带缓冲区。
将输入字符串串首的偏移地址赋给SI,将AH,CH初始化为0,将输入字符串长度LEN赋给AL,然后将字符串长度加到SI中,此时SI指向输入字符串尾的后一个字节。
将BX赋值为2,将字符串长度除以2,将除得的商作为循环次数赋值给CX。
接着,将SI里面的数据减1,将输入字符串串首的偏移地址赋给DI。
此时,SI指向输入字符串的最后一个字符,DI指向输入字符串的第一个字符。
循环开始,将偏移地址SI中的字符赋给AL,交换AL和偏移地址DI中的字符,最后将AL中的字符赋给偏移地址为SI的内存单元,完成首尾字符的交换。
更改循环条件,将DI后移一个字符,SI前移一个字符,循环条件CX减1。
循环完成后,利用宏程序调用,RETURN输出回车换行符,PRINT输出字符串变量INFO2,PRINT输出变换后的字符串STR。
程序返回,执行完毕。
三、实验步骤
1.程序设计流程图
Y
N
2.调试与运行
编译运行文件test6.asm:
1.运行源程序,屏幕出现输入提示字符串:
2.按照提示输入字符串:
3.回车输出逆序后的字符串:
四、总结体会
这次实验学习了子程序的编写以及主程序和子程序的调用,不同模块间程序的调用和调试方法,实践的过程中加深了对子程序调用的代码的使用,让我更加了解了子程序设计的基本格式和步骤。
宏是源程序中一段有独立功能的代码,需要在源程序中定义一次,就可以多次调用,调用时只需要一个宏指令语句就行了。
在需要传送的数据较多的时候使用宏会变得更加有利。
注意事项:
1.宏指令库在编写时,要特别注意保存要有到的寄存器,并且对宏指令的执行逻辑要非常清晰,保证当形参被替换为实参时,展开的汇编语句是正确的,否则将会出现错误;
2.宏指令在定义时,一个好的习惯是在其代码前面加以说明,解释对应宏指令的功能和执行逻辑。
这样在使用时才能根据需要使用不同的宏指令,也方便代码阅读。
3.宏指令和子程序的用途可以简单的总结为:
通常宏指令被用在代码较短且参数较多的场合,而子程序则被用在代码较长的场合。
指导教师:
叶从欢
总结
通过这次汇编课程设计的学习,我在汇编语言方面收获了很多东西。
同C语言一样,汇编也有顺序、分支和循环结构,通过此次对汇编的学习,对基本的顺序、分支和循环结构有了更加深刻的了解。
与C语言所不同的是,汇编中还有子程序和宏程序结构,通过此次的学习在宏定义,宏调用和子程序定义,调用方面我学到了更多的知识,子程序和宏程序就像C语言中的函数一样,通过使用子程序和宏程序让程序更加简洁易懂,减少程序代码的重复性。
都说计算机的语言都是相同的,如此可见一斑。
此外,这次课程设计让我认识到了上课认真听讲的必要性,老师在课堂上讲解的许多知识都很重要,在本次课程设计中就充分体现了这一点,所以学好课堂老师讲解的知识是很有必要的。
从今往后,我会加倍努力学习汇编方面的知识,使自己的能力得以提高,以便未来能在本专业的道路上走的更远、更好。