您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 子程序与模块化程序设计
课程实验报告课程名称:汇编语言程序设计实验名称:实验地点:南一楼804室指导教师:李专专业班级:学号:姓名:同组学生:报告日期:成绩:计算机科学与技术学院目录1实验目的与要求.........................................................12实验内容...............................................................13实验过程...............................................................23.1实验目的.............................................................................................................................23.1.1设计思想..............................................................................................................23.1.2源程序代码...........................................................................................................23.2实验目的.............................................................................................................................63.2.1设计思想...............................................................................................................63.2.2源程序代码...........................................................................................................63.3实验结果...........................................................................................................................124实验体会..............................................................12汇编语言程序设计实验报告11实验目的与要求(1)掌握子程序参数传递的3种方式,特别是利用堆栈传递参数的方法;(2)掌握模块化程序设计的方法;(3)进一步熟悉TD的使用,并加深对常用DOS功能调用的理解;2实验内容任务:编写程序实现类似C语言函数scanf()和printf()的功能:先从键盘输入一个N1进制的有符号字符串,再以N2进制的形式显示出来,N1和N2由键盘输入。例如:InputN1:16↙InputN2:10↙Inputstring:-7FFF↙Output:-32767(屏幕显示)提示:首先需要一个子程序将N1进制的字符串转换为二进制数,然后还需要一个子程序将二进制数转换为N2进制的字符串。要求:(1)用子程序scanfAsm实现将N1进制的字符串转换为二进制的有符号数:子程序参数:DS:[SI]指向字符串的首地址(可能有正负号,字符串以0结尾)BASE=N1(BASE是由主程序在数据段中用DB定义的变量)(AX)=转换结果(2)用子程序printAsm实现将二进制有符号数转换为N2进制的字符串,调用printAsm的方法如下:PUSH需要转换的二进制数PUSHN2;将二进制数转换为该数制的字符串PUSH缓冲区段地址;转换结果保存在该缓冲区中PUSH缓冲区偏移地址CALLFARPTRprintAsmADDSP,8汇编语言程序设计实验报告2(3)主程序、子程序scanfAsm、子程序printAsm分别定义在模块mainIO.asm、scanfAsm.asm、printAsm.asm中;(4)画出2个子程序流程图,给出寄存器、存储单元的分配方法;(5)对于每种数制,至少输入正负数字符串各一个进行测试。3实验过程3.1实验目的用子程序scanfAsm实现将N1进制的字符串转换为二进制的有符号数3.1.1设计思想用一个check函数检查输入的字符串中是否存在非法的字符,如果全部通过,则通过一个循环将其转换为二进制的字符,保存在ax中。3.1.2源程序代码.386datasegmentuse16tip1db'InputError!'rfdb0ah,0dh,'$'markdb?basedw?dataendsstacksegmentuse16stackdb20dup(?)stackends;check,寄存器传参,判断输入字符是否符和进制数;cl为进制,ch为字符,;正确时,返回ch为实际数,;错误时,输出tip1,并返回doscodesegmentuse16assumecs:code,ds:data,ss:stackcheckprocfarsubch,'0'cmpch,10汇编语言程序设计实验报告3jgel1;不是数字字符跳转l4:;比较ch是否在0-clcmpch,0jgel2jmpexit2;输入字符小于0l2:cmpch,cljgel3jmpexit1l3:;输入字符大于进制数jmpexit2l1:;输入字符为字母时subch,'A'-'0';判断是否为字母cmpch,0jgel6jmpexit2;不为字母l6:cmpch,26;26个大写字母jgel5;输入字符不是大写字母addch,10;'A'代表10jmpl4l5:;判断字符是否为小写字母subch,'a'-'A'cmpch,0jgel7jmpexit2l7:cmpch,26jll8jmpexit2l8:addch,10jmpl4exit1:;正确时调用ret汇编语言程序设计实验报告4exit2:;错误时调用movax,datamovds,axleadx,tip1movah,9int21hpopcx;清除栈ipmovah,4chint21hcheckendppubliccheck;scanfAsm,堆栈传参,入栈顺序,ds,si,wordptrbase;DS:[si],指向字符串首地址,可有正负号,字符串以0结尾;Base=n1(db);输出ax为转换结果scanfAsmprocfarpushbpmovbp,sppushsipushcxpushbxpushdspushesmovax,datamovds,ax;获取参数movcx,[bp+6]movsi,[bp+8]movax,[bp+10]moves,axxorax,axmovbase,cxmovmark,0;用于判断是否为负数;获取第一个字符,判断是否为符号汇编语言程序设计实验报告5;不是符号则继续,是符号则跳过movch,byteptres:[si]cmpch,'-'jnesl1incsimovmark,1jmpsl3sl1:cmpch,'+'jnesl3incsisl3:;循环转换movch,byteptres:[si]cmpch,0jnesl4jmpsl5sl4:callfarptrcheckmovsxbx,chimulbaseaddax,bxincsijmpsl3sl5:cmpmark,1jnesl2negaxsl2:popespopdspopbxpopcxpopsipopbpretscanfAsmendppublicscanfAsm汇编语言程序设计实验报告6codeendsend3.2实验目的用子程序printAsm实现将二进制有符号数转换为N2进制的字符串3.2.1设计思想先通过一个一个循环,将余数逆序保存在一个缓存区中,然后顺序替换目标缓存区的值。3.2.2源程序代码.386numequ20datasegmentuse16tabdb'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'bufdbnumdup(?),'$'basedw?dataendsstacksegmentuse16stackdb20dup(?)stackendscodesegmentuse16assumecs:code,ds:data,ss:stack;调用方法如下;PUSH需要转换的二进制数;PUSHN2;将二进制数转换为该数制的字符串;PUSH缓冲区段地址;转换结果保存在该缓冲区中;PUSH缓冲区偏移地址;CALLFARPTRprintAsm;ADDSP,8printAsmprocfarpushbpmovbp,sppushaxpushbxpushespushsi汇编语言程序设计实验报告7pushdxpushdspushdimovax,datamovds,axmovsi,[bp+6]movax,[bp+8]moves,axmovbx,[bp+10]movbase,bxmovax,[bp+12]xordx,dxmovdi,num-1;判断是否为负数,是时输出一个负号cmpax,0jgel1negaxmovbyteptres:[si],'-'incsil1:;循环输出字符xordx,dxdivbasemovbx,dxmovdl,tab[bx];movbyteptres:[si],dlmovbuf[di],dldecdicmpax,0jeexitjmpl1exit:movdl,buf[di+1]movbyteptres:[si],dlincdiincsicmpdl,'$'汇编语言程序设计实验报告8jneexit;movbyteptres:[si],'$'popdipopdspopdxpopsipopespopbxpopaxpopbpretprintAsmendppublicprintAsmcodeendsEndmainIO.asm设计思想:通过堆栈调用函数的形式调用scanfAsm和printAsm即可。代码如下:.386extrncheck:farextrnscanfAsm:farextrnprintAsm:fardatasegmentuse16tip1db'InputN1:$'tip2db'InputN2:$'tip3db'InputString:$'tip4db'Output:$'rfdb0ah,0dh,'$'n1db?n2db?tendw10inStringdb10lendb?db10dup(?)outStringdb20dup(?)dataendsstacksegmentuse16stack汇编语言程序设计实验报告9db200dup(?)stackendscodesegmentuse16assumecs:code,ds:data,ss:stackstart:movax,datamovds,axleadx,tip1movah,09hint21hleadx,inStringmovah,0ahint21hleadx,rfmovah,09hint21hcallstonmovn1,alleadx,tip2movah,09hint21hleadx,inStringmovah,0ahint21hleadx,rfmovah,09hint21hcallstonmovn2,alleadx,tip3movah,09hint21h汇编语言程序设计实验报告10leadx,inStringmovah,0ahint21hleadx,rfmovah,09hint21hxorbx,bxmovbl,inStrin
本文标题:子程序与模块化程序设计
链接地址:https://www.777doc.com/doc-2484962 .html