南昌大学汇编语言程序设计实验5-子程序设计实验_第1页
南昌大学汇编语言程序设计实验5-子程序设计实验_第2页
南昌大学汇编语言程序设计实验5-子程序设计实验_第3页
南昌大学汇编语言程序设计实验5-子程序设计实验_第4页
南昌大学汇编语言程序设计实验5-子程序设计实验_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证√综合□设计□创新实验日期:12.15实验成绩:实验5子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。4.掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。程序代码:publicmaindatasegmentbufdw12,68,56,57,34,1,46,7,45,54countdb1,2,3,4,5,6,7,8,9,10waitdb',$'dataendscodesegmentassumecs:code,ds:datamain:movax,datamovds,axmovdx,0movcx,0movsi,0movdi,0again:movbx,buf[si]addsi,2callhexacleadx,waitcalldispmovdl,count[di];将count首地址单元内容给dl来记数incdicmpdi,10;显示所有数后dx为10跳出jeexitjmpagainexit:movah,4chint21hhexacprocnear;二进制转换为十六进制输出子程序movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7hprintit:movdl,alcalldisp;近调用dispdecchjnzrotateret;返回doshexacendpdispprocnear;输出单个字符子程序movah,02hint21hretdispendpcodeendsendmain运行结果:流程图:2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。程序代码:publicmain_1dotasegmentmess1db'pleaseinputyourstring,overedbypressenter:$',0ah,0dhmess2db0ah,0dh,'timesofthe"b"appearedis:$'mess7db0ah,0dh,'sorry,thecountsofthe"b"havemorethan15,pleasetryagain$'tabledb50,?,100dup(?),'$'dotaendscodesegmentassumecs:code,ds:datamain_2:movax,datamovds,axleadx,mess1;显示mess1,提醒输入字符movah,09hint21hleadx,tablemovah,0ah;输入字符串int21hleasi,table;si指向串首址tablemovcl,[si+1]movch,0;cx中为字符串长度incsiincsimoval,'b'movah,0pushsipushcxpushax;si,cx,ax依次入栈callcomparepopax;ax出栈,统计个数在al中movcl,alcmpcl,10hjlerrorleadx,mess2;显示mess2,输出统计个数movah,09h;将个数转换为十六进制int21hmovdl,clanddl,0fh adddl,30hcmpdl,39hjlecountsadddl,07herror:leadx,mess3movah,09hint21hcounts:movah,02hint21h;显示统计个数exit:movah,4chint21hcodeendscode_1segment;比较子程序assumecs:code_1compareprocfarpushbp;bp进栈movbp,sp;栈顶地址给bpmovsi,[bp+10];字符串的第一个字符地址给simovcx,[bp+8];将堆栈中字符串长度给cxmovax,[bp+6];将“b"给axxorah,ahagain:cmpal,[si]jnenext incah;统计b个数next:incsiloopagainmoval,ahmov[bp+10],axpopbp;bp出栈ret4compareendpcode_1endsendmain_2运行结果:流程图:3.请编写一个程序来实现简单的程序菜单显示。(采用多模块程序设计方法)显示一个菜单要求用户从下表中选择:(1) HEXACGAME(对应-->程序1)(2) CHARSTATISTICSPROGRAM(对应-->程序2)(3) PRESS“ESC”TOQUIT用户作出选择1~3时,显示输出要执行操作的名字,如“Yourselectionis1,theprogramwillexecuteHEXACNUMBERGAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“willyoucontinueprogramreally?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。若用户选择3,要求程序显示提示信息“PleasepressESCkeytoexit!”,并能按要求正确退出。程序代码:dsegsegmentbufdw53,56,78,45,89,65,32,14,12,75countdb1,2,3,4,5,6,7,8,9,10spacedb',$'tabledb50,?,50dup(?),'$'mess0db0dh,0ah,'error!pleaseinputagain!',0dh,0ah,'$'mess1db'pleaseinputyourstring,overedbypressenter:$',$',0ah,0dh,'$'mess2db0ah,0dh,'timesofthe"b"appearedis:$'mess7db0ah,0dh,'sorry,thecountsofthe"b"havemorethan15,pleasetryagain$'mess3db0dh,0ah,'yourselectionis1,theprogramwillexecutehexacnumber.$',0dh,0ah,'$'mess4db0dh,0ah,'yourselectionis2,theprogramwillexecutecharstatisticsprogram$',0dh,0ah,'$'mess5db0dh,0ah,'pleasepressesckeytoexit!$',0dh,0ahmess6db0dh,0ah,'willyoucontinueprogramreally:(y:n)$',0dh,0ahmenusdb0dh,0ah,'menus:',0dh,0ahdb'(1)hexacgames',0dh,0ah db'(2)charstatisticsprogram',0dh,0ah db'(3)press"esc"toquit',0dh,0ah db'pleaseinput1~3:','$'dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axleadx,menuscalldisp2movax,0movbx,0movcx,0movdx,0movsi,0movdi,0main:subax,axmovah,01hint21hcmpal,33hjzthreecmpal,32hjztwocmpal,31hjzonejmperrone:leadx,mess3calldisp2again:movbx,buf[si]addsi,2callhexacleadx,spacecalldisp2movdl,count[di];将count首地址单元内容给dl来记数incdicmpdl,10;显示所有数后dx为10跳出jesureexitjmpagaintwo:leadx,mess4calldisp2leadx,mess1;显示mess1,提醒输入字符calldisp2leadx,tablemovah,0ah;输入字符串int21hleasi,table;si指向串首址tablemovcl,[si+1]movch,0;cx中为字符串长度incsiincsimoval,'b'movah,0pushsipushcxpushax;参数送堆栈callcomparepopax;统计个数在al中movcl,alleadx,mess2;显示mess2,输出统计个数calldisp2;将个数转换为十六进制movdl,clanddl,0fh adddl,30hcmpdl,39hjlebelowadddl,07hbelow:movah,02hint21h ;显示统计个数jmpsureexitsureexit:leadx,mess6calldisp2movah,01hint21hcmpal,'n'jeexitcmpal,'y'jestartjmperrthree:leadx,mess5calldisp2movah,01hint21hcmpal,27jeexitjmperrerr:leadx,mess0calldisp2jmpstartexit:movah,4chint21hcseg1segment;比较子程序assumecs:cseg1compareprocfarpushbpmovbp,spmovsi,[bp+10];字符串的第一个字符地址给simovcx,[bp+8];将堆栈中字符串长度给cxmovax,[bp+6];将“b"给axxorah,ahloop1:cmpal,[si]jnenext incah;统计b个数next:incsilooploop1moval,ahmov[bp+10],axpopbpret4compareendpcseg1endshexacprocnear;二进制转换为十六进制输出子程序movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7hprintit:movdl,alcalldisp1;近调用disp1decchjnzrotateret;返回doshexacendpdisp1procnear;输出单个字符子程序movah,02hint21hretdisp1endpdisp2procnearmovah,09hint21hretdisp2endpcsegendsendstart运行结果:流程图:三.实验要求1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。2.第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3.第二个程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论