欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第6章 子程序结构(精品).ppt

    • 资源ID:71978251       资源大小:134.50KB        全文页数:42页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第6章 子程序结构(精品).ppt

    第第6章章子程序结构子程序结构子程序又称为过程,相当于高级子程序又称为过程,相当于高级语言中的过程和函数,引入过程的目语言中的过程和函数,引入过程的目的是为了减少相同功能的程序段在程的是为了减少相同功能的程序段在程序中的重复出现,提高代码的可重用序中的重复出现,提高代码的可重用性,也是模块化的程序设计的基础。性,也是模块化的程序设计的基础。611过程定义伪操作过程定义伪操作过程定义的一般形式:过程定义的一般形式:过程名过程名PROC属性属性过程名过程名ENDP其中:其中:过程名为标识符,它又是子程序的入口地址,它的写法和标识符的写法相同。过程名为标识符,它又是子程序的入口地址,它的写法和标识符的写法相同。属性是指类型属性,它可以是属性是指类型属性,它可以是NEAR或或FAR说明:说明:1过程是位于代码段中的子程序,由调用程序通过过程是位于代码段中的子程序,由调用程序通过CALL指令调用。指令调用。2过程的最后一个语句是过程的最后一个语句是RET语句。语句。3当调用程序和过程在同一个代码段中时,定义过程为当调用程序和过程在同一个代码段中时,定义过程为NEAR属性属性4当调用程序和过程不在同一个代码段中时,定义过程为当调用程序和过程不在同一个代码段中时,定义过程为FAR属性属性6.1子程序的设计方法子程序的设计方法例例61调用程序和子程序在同一代码段中。调用程序和子程序在同一代码段中。MAINPROCFARCALLSUBR1RETMAINENDP;SUB1PROCNEARRETSUB1ENDP或定义成或定义成MAINPROCFARCALLSUBR1RET;SUB1PROCNEARRETSUB1ENDPMAINENDP也也就就是是说说,调调用用过过程程与与被被调调用用过过程程之之间间,可可以以是是的的并并列列的的定定义义形形式式,也也可可以以是是嵌嵌套套的定义形式,即一个过程定义中可以包括多个过程定义。的定义形式,即一个过程定义中可以包括多个过程定义。SEGXSEGMENTSUBTPROCFARRETSUBTENDPCALLSUBTSEGXENDS;SEGYSEGMENTCALLSUBTSEGYENDS例例62调调用用程程序序和和子子程程序序不不在在同同一代码段内一代码段内SUBT为为一一个个过过程程,它它有有两两处处被被调调用用,一一处处是是与与它它在在同同一一段段的的SEGX段段内内,另另一一处处是是在在另另一一段段SEGY段段内内,为为此此它它必必须须声声明明具具有有FAR属属性性以以适适应应SEGY段段调调用用的的需需要要。SUBT既既有有FAR属属性性,则则不不论论在在SEGX和和SEGY段段对对SUBT的的调调用用就就都都具具有有FAR属属性性了了,这这样样不不会会发发生生什什么么错错误误,反反之之,如如果果这这里里的的SUBT使使用用了了NEAR属属性性,则则SEGY段段能能者者多多劳劳它它调调用用就会出错了。就会出错了。612子程序的调用和返回子程序的调用和返回过程的正确执行是由子程序的正确调用及正确返回保证的。过程的正确执行是由子程序的正确调用及正确返回保证的。调用指令调用指令CALL返回指令返回指令RET执执行行CALL时时,系系统统会会根根据据被被调调用用的的子子程程序序的的属属性性自自动动将将CALL语语句句的的下下一一语语句句地地址址压压栈栈。而而执执行行RET语语句句时时,会会从从当前栈顶中弹出返回地址更新当前栈顶中弹出返回地址更新IP或或CS:IP。因因此此,为为了了保保证证其其正正确确性性,除除PROC的的属属性性要要正正确确外外,还还应应该该注注意意子子程程序序运运行行期期间间的的堆堆栈栈状状态态,如如果果在在子子程程序序中中有有对对堆堆栈栈操操作作的的语语句句,如如有有PUSH和和POP等等,但但因因其其个个数数不不等等,从从而而导导致致在在程程序序执执行行RET前前SP并并未未指指向向进进入入子子程程序序时时的的返返回回地地址址,则则必必然然会会导导致致运运行行出出错错,所所以以子子程程序序中中对对堆堆栈栈的的使使用用应应该该特特别别小小心心,以免发生错误。以免发生错误。613保存与恢复寄存器保存与恢复寄存器由由于于调调用用程程序序(又又称称主主程程序序)和和子子程程序序经经常常是是分分别别编编制制的的,所所以以它它们们所所使使用用的的寄寄存存器器往往往往会会发发生生冲突。冲突。如如果果主主程程序序在在调调用用子子程程序序以以前前的的某某个个寄寄存存器器内内容容在在从从子子程程序序返返回回后后还还有有用用,而而子子程程序序又又恰恰好好使使用用了了同同一一寄寄存存器器,造造成成破破坏坏了了寄寄存存器器的的原原有有内内容容,那那就就会会造造成成程程序序运行错误,这是不允许的。运行错误,这是不允许的。为为了了避避免免这这种种错错误误的的产产生生,在在一一进进入入子子程程序序后后就就应应该该把把子子程程序序所所需需要要用用到到的的寄寄存存器器内内容容保保存存在在堆堆栈栈中中,而而在在退退出出子子程程序序前前把把寄寄存存器内容恢复原状。例如:器内容恢复原状。例如:SUBTPROC NEARPUSHAXPUSHBXPUSHCXPUSHDXPOPDXPOPCXPOPBXPOPAXRETSUBTENDP在在子子程程序序设设计计时时,应应该该仔仔细细考考虑虑哪哪些些寄寄存存器器是是必必须须保保存存的的,哪些寄存器是不必要或不应该保存的。哪些寄存器是不必要或不应该保存的。一般说来,子程序中用到的寄存器是应该保存的。但是,一般说来,子程序中用到的寄存器是应该保存的。但是,如果使用寄存器来在主程序和子程序之间传送参数的话,如果使用寄存器来在主程序和子程序之间传送参数的话,这种寄存器就不一定需要保存,特别是用来向主程序回送这种寄存器就不一定需要保存,特别是用来向主程序回送结果的寄存器,就更不应该保存和恢复寄存器而破坏了应结果的寄存器,就更不应该保存和恢复寄存器而破坏了应该向主程序传送的信息。该向主程序传送的信息。614子程序的变量传送子程序的变量传送调调用用程程序序在在调调用用子子程程序序时时经经常常需需要要传传送送一一些些参参数数给给子子程程序序;子子程程序序运运行行完完成成后后也也经经常常要要回回送送一一些些信信息息给给调调用用程程序序。这这种种调调用用程程序序和和子子程程序序之之间间的的信信息息传传送送称称为为变变量量传传送送(或或称称为为参参数数传传送送或或过程通信)。变量传送方式有以下几种:过程通信)。变量传送方式有以下几种:1.通过寄存器传送参数;通过寄存器传送参数;2.如如果果过过程程和和调调用用程程序序在在同同一一程程序序模模块块中中,则则直直接接访访问问模模块块中中的变量;的变量;3.通过地址表传送参数地址;通过地址表传送参数地址;4.通过堆栈传送参数或参数地址;通过堆栈传送参数或参数地址;5.多多个个模模块块之之间间的的参参数数传传送送问问题题可可通通过过对对引引用用符符号号的的说说明明后后在在连接过程中解决。连接过程中解决。1.通过通过寄存器传送变量寄存器传送变量例例6.3十十进进制制到到十十六六进进制制数数转转换换程程序序。程程序序要要求求从从键键盘盘取取得得一一个个十十进进制制数数,然然后后把把该该数数以以十十六六进进制制形形式式在在屏幕上显示出来。屏幕上显示出来。程序结构程序结构开始通用DECIBIN通用CRLF通用BINIHEX通用CRLF结束从键盘收得十进制数保存在BX中显示回车换行用十六制数形式显示BX中的数;DECIHEX-主程序主程序;将键盘输入的十进制数转换成十六进制数送屏幕输出将键盘输入的十进制数转换成十六进制数送屏幕输出decihex segmentassumecs:decihex;程序的主要内容程序的主要内容,包括过程包括过程mainprocfarrepeat:calldecibin;将键盘所送的十进制数转换成二进制数存入将键盘所送的十进制数转换成二进制数存入BXcallcrlf;屏幕输出回车换行屏幕输出回车换行ANDBX,BXJZDONEcallbinihex;将将BX中的二进制数转换成十六进制数送屏幕输出中的二进制数转换成十六进制数送屏幕输出callcrlf;屏幕输出回车换行屏幕输出回车换行jmprepeatDONE:MOVAX,4C00HINT21Hmainendp;过程名过程名:DECIBIN:DECIBIN;功能功能 :将键盘所送的十进制数转换成二进制数将键盘所送的十进制数转换成二进制数;出口出口 :转换结果在转换结果在BXBX寄存器中寄存器中decibindecibin proc procnearnearmovmovbx,0 ;BXbx,0 ;BX赋初值赋初值;从键盘读得十进制数字从键盘读得十进制数字,转换成二进制数转换成二进制数newchar:movnewchar:movah,1 ah,1 ;读键盘系统调用读键盘系统调用,ASCII,ASCII在在ALAL中中intint21h21hsubsubal,30h ;al,30h ;转换成数字转换成数字0-90-9的二进制数的二进制数jljlexitexitcmpcmpal,9dal,9djgjgexitexitcbwcbw ;扩充到一个字扩充到一个字,刚才输入的一位数字现在刚才输入的一位数字现在AXAX寄存器中寄存器中;将将BXBX中的中间结果乘以中的中间结果乘以1010 xchgxchgax,bxax,bx;取上次的中间结果到取上次的中间结果到AX,AX,本次输入数转换结果到了本次输入数转换结果到了BXBXmovmovcx,10d ;cx,10d ;中间结果中间结果*1010mulmulcxcxxchgxchgax,bxax,bx ;结果暂存结果暂存BXBX中中,AX,AX为本次输入数的转换结果为本次输入数的转换结果;再加上再加上AXAX中刚转换的一位十进制数中刚转换的一位十进制数addaddbx,axbx,ax ;中间结果中间结果*10+d,10+d,结果存入结果存入BXBXjmpjmpnewcharnewcharexit:exit:retretdecibindecibin endpendp;过程名过程名:BINIHEX:BINIHEX;功能功能 :将将BXBX中的二进制数转换成十六进制数送屏幕输出中的二进制数转换成十六进制数送屏幕输出;入口入口 :BX:BX中有待转换的二进制数中有待转换的二进制数binihexbinihex proc procnearnearmovmovch,4ch,4;数据位数数据位数rotate:rotate:movmovcl,4cl,4;循环移位次数循环移位次数rolrolbx,clbx,cl;向左循环移位向左循环移位,将高四位移到低四位将高四位移到低四位movmoval,blal,bl;取低字节到取低字节到ALALandandal,0fhal,0fh;屏蔽高四位屏蔽高四位,截取低四位截取低四位addaddal,30hal,30h;加加30H,30H,转换成十进制数的转换成十进制数的ASCIIASCIIcmpcmpal,3ahal,3ah;jljlprint print addaddal,7hal,7h;如果是十六进制数如果是十六进制数A-F,A-F,则再加则再加7 7print:print:movmovdl,aldl,al;转存到转存到DLDLmovmovah,2ah,2;显示功能调用显示功能调用intint21h21h;decdecchch ;位数减位数减1 1jnzjnzrotate ;rotate ;非非0 0则转换完则转换完,继续继续retret;返回返回binihexbinihex endpendp ;过程名过程名:CRLF;功能功能:输出回车换行输出回车换行crlfprocnearmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpdecihex endsendmain2.如子程序和调用程序在同一个源文件中,则可以直接访问模块中的变量如子程序和调用程序在同一个源文件中,则可以直接访问模块中的变量例例6.4主程序主程序MAIN和过程和过程PROADD在同一源文件中,要求用过程在同一源文件中,要求用过程PROADD累加数组中的所有元素,并把和(不考虑溢出的可能性)累加数组中的所有元素,并把和(不考虑溢出的可能性)送到指定存储单元中去。送到指定存储单元中去。datasegment;定义数据段定义数据段arydw100,200,300,400,9000;其和为十进制数其和为十进制数10000十六进制数十六进制数2710Hcountdw($-ary)/2;数据个数数据个数sumdw?;和存放单元和存放单元dataendscodesegment;定义代码段定义代码段mainprocfarassumecs:code,ds:datastart:pushdssubax,ax;建立返回堆栈建立返回堆栈pushaxmovax,data;DS指向数据段指向数据段movds,axcallnearptrproadd;调用调用proadd子程序子程序movbx,sumcallbinihex;将和输出显示将和输出显示retmainendpproaddprocnearpushax;保护寄存器保护寄存器pushcxpushsileasi,ary;SI置为数组首址置为数组首址movcx,count;CX为数组长度为数组长度xorax,ax;累加器清累加器清0next:addax,si;相加相加addsi,2;SI指向下一数指向下一数loopnext;未完继续未完继续movsum,ax;存和存和popsipopcxpopax;恢复寄存器恢复寄存器retproaddendp;功能功能:将将BX的内容按的内容按4位十六进制数格式位十六进制数格式输出输出;入口条件入口条件:BX中存放待输出的数据中存放待输出的数据binihexprocnearpushax;保护寄存器保护寄存器pushcxpushdxmovch,4;数据位数数据位数rotate:movcl,4;循环移位次数循环移位次数rolbx,cl;向左循环移位向左循环移位,将高四位移到低四位将高四位移到低四位moval,bl;取低字节到取低字节到ALandal,0fh;屏蔽高四位屏蔽高四位,截取低四位截取低四位addal,30h;加加30H,转换成十进制数的转换成十进制数的ASCIIcmpal,3ah;jlprintaddal,7h;如果是十六进制数如果是十六进制数A-F,则再加则再加7print:movdl,al;转存到转存到DLmovah,2;显示功能调用显示功能调用int21h;decch;位数减位数减1jnzrotate;非非0则转换完则转换完,继续继续popdxpopcxpopax;恢复寄存器恢复寄存器ret;返回返回binihexendp;codeendsendstart除此以外,还可以通过地址表传送参数地址和通过堆栈传送参数或参数地址。除此以外,还可以通过地址表传送参数地址和通过堆栈传送参数或参数地址。3.多个模块之间的参数传送问题多个模块之间的参数传送问题 多个模块和程序之间的参数连接时,并不一定要把所有的代码段或数据段放在一起形多个模块和程序之间的参数连接时,并不一定要把所有的代码段或数据段放在一起形成一个大代码段。通常,各程序模块可有各自的分段,通过模块之间的调用来进行工作。成一个大代码段。通常,各程序模块可有各自的分段,通过模块之间的调用来进行工作。(1)外部符号)外部符号在某一个模块中定义,而在另一个模块中引用的符号称为外部符号,在某一个模块中定义,而在另一个模块中引用的符号称为外部符号,包括变量,标号,过程名等。包括变量,标号,过程名等。相对而言,在本模块中定义又在本模块中引用的符号称为局部符号。相对而言,在本模块中定义又在本模块中引用的符号称为局部符号。有两个伪操作与外部符号有关。有两个伪操作与外部符号有关。PUBLIC伪伪操作:操作:格式:格式:PUBLICsymbol,.作用:用于说明本模供其他模块调用的符号。作用:用于说明本模供其他模块调用的符号。EXTRN伪操作:伪操作:格式:格式:EXTRNsymbolname:type,.其中,其中,type对变量而言可以是对变量而言可以是byte,word,dword等,等,而对标号而言,可以是而对标号而言,可以是near或或far。作用:用于说明本模供要引用的在其他模块定义的符号。作用:用于说明本模供要引用的在其他模块定义的符号。这两个伪操作就提供了模块之间相互访问的可能性。使用时,要注意两者的匹配。这两个伪操作就提供了模块之间相互访问的可能性。使用时,要注意两者的匹配。例例6.5三个模块中的外部符号定义。三个模块中的外部符号定义。;sourcemodule1extrn var2:word,lab2:farpublic var1,var4,lab1data1 segmentvar1 db?var3 dw?var4 dw?data1 endscode1 segmentassumecs:code1,ds:data1main proc farstart:mov ax,data1mov ds,ax;.lab1:;.mov ax,4c00hint21hmain endpcode1 endsend start;sourcemodule2extrnvar1:byte,var4:wordpublicvar2data2segmentvar2dw0var3db5dup(?)data2endscode2segmentassumecs:code2,ds:data2;.code2endsend;sourcemodule3;extrnlab1:farpubliclab2,lab3;code3segmentassumecs:code3;.lab2:movax,1234h;.lab3:pushax;.code3endsend;例例6.9HEXIDEC是一个把十六进制数转换成十进制数程序是一个把十六进制数转换成十进制数程序,要求从键盘输入的要求从键盘输入的;0-FFFFH的十进制正数转换为十进制数并从屏幕上显示出来的十进制正数转换为十进制数并从屏幕上显示出来.;HEXIDEC-主程序主程序;将由键盘输入的十进制数转换成十进制数送屏幕输出将由键盘输入的十进制数转换成十进制数送屏幕输出;EQU语句语句displayequ2h;显示输出显示输出key_inequ1h;键盘输入键盘输入doscallequ21h;DOS调用号调用号;*hexidec segment;-mainprocfarassumecs:hexidecstart:6.3子程序举例子程序举例;建立返回堆栈建立返回堆栈pushdssubax,axpushax;repeat:callhexibin;将键盘输入的十六进制数转换成二进制数将键盘输入的十六进制数转换成二进制数ANDBX,BXJZDONEcallcrlf;回车换行回车换行callbinidec;二进制转换成十进制二进制转换成十进制callcrlf;回车换行回车换行jmprepeatDONE:retmainendphexibinprocnear;功能功能:将键盘输入的十六进制数字串转换成二进制数将键盘输入的十六进制数字串转换成二进制数;出口出口:结果在结果在BX寄存器中寄存器中subbx,bx;bx清清0;从键盘读取十六进制数从键盘读取十六进制数,转换成二进制数转换成二进制数newchar:movah,key_in;键盘输入功能号送键盘输入功能号送AHintdoscall;INT21H系统调用系统调用subal,30h;jlexit;小于小于0退出退出cmpal,10djladd_to;小于小于10为为0-9之间的数之间的数,有效有效;不是不是(0-9),可能是可能是(A-F)subal,07h;减减7cmpal,0ah;小于小于A无效无效jlexitcmpal,10h;大于大于F也无效也无效jgeexit;是十六进制数是十六进制数,加到加到BX中中add_to:movcl,4shlbx,cl;中间结果左移四位中间结果左移四位movah,0addbx,ax;加上刚输入的数加上刚输入的数jmpnewchar;继续继续exit:rethexibinendp;-binidecprocnear;功能功能:将将BX中的二进制数转换成十进制数中的二进制数转换成十进制数,并输出显示并输出显示;入口入口:BX中有待转换的二进制数中有待转换的二进制数movcx,10000d;除数设为一万除数设为一万calldec_divmovcx,1000d;除数设为一千除数设为一千calldec_divmovcx,100d;除数设为一百除数设为一百calldec_divmovcx,10d;除数设为十除数设为十calldec_divmovcx,1d;除数设为一除数设为一calldec_divret;-dec_div procnear;功能功能:用用CX去除去除BX,商送屏幕输出商送屏幕输出,余数更新余数更新BX;入口入口:BX中有被除数中有被除数movax,bx;将将BX中的数转存中的数转存DX,AXmovdx,0divcx;除以除以CX中的数中的数movbx,dx;余数转余数转BXmovdl,al;商转存商转存DL;将将DL的值在屏幕上输出的值在屏幕上输出adddl,30h;转换成十进制数的转换成十进制数的ASCIImovah,display;显示功能号送显示功能号送AHintdoscall;系统功能调用系统功能调用retdec_div endp;-binidecendp;-crlfprocnear;输出回车换行输出回车换行movdl,0dh;回车送显示回车送显示movah,displayintdoscallmovdl,0ah;换行送显示换行送显示movah,displayintdoscallretcrlfendphexidec endsendstartdatarea segmentthirtydb30;信息表信息表,每条信息长每条信息长30个字符个字符msg0dbIlikemyIBM_PC-msg1db8086programmingisfun-msg2dbTimetobuymorediskettes-msg3dbThisprogramworks-msg4dbTurnoffthatprinter-msg5dbIhavemorememorythamyou-msg6dbThePSPcanbeuseful-msg7dbBASICwaseasierthanthis-msg8dbDOSisindispensable-msg9dbLastmassageoftheday-;出错信息出错信息errmsgdberror!invalidparamenter!-datarea ends例例6.10一个简单的信一个简单的信息检索系统,在数据息检索系统,在数据区里,有区里,有10个不同的个不同的信息,编号为信息,编号为0-9,每个信息包括每个信息包括30个字个字符。现在要求编制一符。现在要求编制一个程序,从键盘接收个程序,从键盘接收09之间的一个编号,之间的一个编号,然后在屏幕上显示出然后在屏幕上显示出相应的编号的信息内相应的编号的信息内容。容。;*stacksegment stackdb256dup(?)stackends;*prognamsegment;-mainprocfarassumecs:prognam,ds:datarea,ss:stackstart:;建立返回堆栈建立返回堆栈pushdssubax,axpushax;设置设置DS指向当前数据段指向当前数据段movax,datareamovds,ax;MAINPARTOFPROGRAMGOESHERErepeat:movah,1;读键盘输入参数读键盘输入参数int21hsubal,0;确认是否为数字确认是否为数字0-9之间的数字之间的数字jcerrorcmpal,9jaerror;从信息表中选择对应的信息从信息表中选择对应的信息,即求相应信息在信息表中的起始地址即求相应信息在信息表中的起始地址movbx,offsetmsg0;BX指向信息表首址指向信息表首址multhirty;(AL)*30=所需信息相对偏移地址所需信息相对偏移地址addbx,ax;BX指向相应信息指向相应信息calldisplay;调用显示子程序调用显示子程序jmprepeat;对于输入无效数据对于输入无效数据(0-9之外之外)时时,输出出错信息输出出错信息error:movbx,offseterrmsgcalldisplayretdisplayprocnear;功能功能:显示显示30个字符的信息个字符的信息;入口入口:BX为信息在表中的首地址为信息在表中的首地址movcx,30;循环计数循环计数30disp1:movdl,bx;取一个字符取一个字符calldispchar;调用显示一个字符的子程序调用显示一个字符的子程序incbx;BX指向下一个字符指向下一个字符loopdisp1;未完继续未完继续movdl,0dh;回车符回车符calldispcharmovdl,0ah;换行符换行符calldispcharretdisplayendp;-dispcharprocnear;功能功能:显示一个字符显示一个字符;入口入口:待显示字符的待显示字符的ASCII在在DL中中movah,2;显示一个字符功能号显示一个字符功能号int21h;retdispcharendp;-mainendp;-prognamendsendstart例例6.116.11人人名名排排序序程程序序,先先从从终终端端输输入入最最多多3030个个人人名名,当当所所有有人人名名都都进进入入后后,按按字字母母上上升升的的次序将人名排序,并在屏幕上显示已经排好次序将人名排序,并在屏幕上显示已经排好序序的人名。的人名。;*;*.model small .model small .stack 40h .stack 40h;*;*.data .datanameparnamepar label labelbytebyte;串串输输入入缓缓冲区冲区maxnlenmaxnlen dbdb2121;最大串最大串长长度限定度限定为为2121个字符个字符namelennamelen dbdb?;实际输实际输入串入串长长度度namefldnamefld dbdb21 dup(?)21 dup(?);实际输实际输入的串内容入的串内容crlfcrlfdbdb13,10,$13,10,$;回回车换车换行串行串endaddrendaddr dwdw?;终终止地址止地址messg1messg1dbdbName?,$Name?,$;输输入姓名提示串入姓名提示串messg2 db Sorted names:,13,10,$messg2 db Sorted names:,13,10,$namectrnamectr dbdb0 0;姓名串表的串个数姓名串表的串个数nametabnametab dbdb30 dup(20 dup()30 dup(20 dup();姓名串表存姓名串表存储储空空间间namesavnamesav dbdb20 dup(?),13,10,$20 dup(?),13,10,$;姓名姓名输输出出缓缓冲区串定冲区串定义义swappedswapped dbdb0 0;交交换标换标志志;*;*.code.code;-;-beginbeginprocprocfarfar;主主过过程程;设设置置DSDS和和ESES指向当前数据段指向当前数据段 movmov ax,data ax,datamovmovds,axds,axmovmoves,axes,axcldcld;置方向置方向标标志志lealeadi,nametabdi,nametab;DI;DI指向姓名表首址指向姓名表首址a20loop:calla20loop:callb10readb10read ;调读调读入子程序从入子程序从键盘读键盘读入一个人名串到入一个人名串到输输入入缓缓冲区冲区cmpcmpnamelen,0namelen,0;刚输刚输入的串入的串长长度度为为0,0,则结则结束束jzjza30a30cmpcmpnamectr,30namectr,30;已已输输入串个数达入串个数达30,30,也也结结束束jejea30a30callcalld10stord10stor;调调存入子程序将串存入子程序将串输输入入缓缓冲区中的一个人名串存入串表中冲区中的一个人名串存入串表中jmpjmpa20loopa20loop;继续读继续读入下一个人名串入下一个人名串a30:a30:cmpcmp namectr,1 namectr,1 jbejbe a40 a40callcallg10sortg10sort;对对串表中的人名串表中的人名进进行排序行排序callcallk10dispk10disp;显显示排序示排序结结果果a40:a40:movmov ax,4c00h ax,4c00h intint 21h 21hbegin begin endpendp;-;-b10readb10read procprocnearnear;功能功能:从从键盘读键盘读取人名串到取人名串到输输入入缓缓冲区冲区;出口出口:所所读读串内容存在串内容存在namefldnamefld 为为首址的首址的缓缓冲区中冲区中,串串实际长实际长度在度在namelennamelen单单元元movmovah,09ah,09lealeadx,messg1dx,messg1intint21h21h;显显示示输输入姓名提示串入姓名提示串movmovah,0ahah,0ahlealeadx,namepardx,nameparintint21h ;21h ;从从键盘读键盘读人名串到人名串到输输入入缓缓冲区冲区movmovah,09ah,09lealeadx,crlfdx,crlfintint21h21h;输输出回出回车换车换行行;movmovbh,0bh,0movmovbl,namelenbl,namelen ;取取实际输实际输入的人名串入的人名串长长度度,并并扩扩成字存成字存BXBX中中movmovcx,21cx,21subsubcx,bxcx,bxb20:b20:movmovnamefldbx,20hnamefldbx,20h;将不足最大串将不足最大串长长的空的空间间用空格用空格补补足足incincbxbx;looploopb20 ;b20 ;retretb10read b10read endpendp;-;-;store name in tablestore name in tabled10stord10stor procprocnearnear;功能功能:将将输输入入缓缓冲区中的一个人名存入人名表中冲区中的一个人名存入人名表中,并并计计数数;入口入口:DI:DI指向人名表中可接收一个人名的起始位置指向人名表中可接收一个人名的起始位置;出口出口:一个人名已存入表一个人名已存入表;表中的人名个数加了表中的人名个数加了1;1;DI;DI指向人名表下一个可接收人名的起始位置指向人名表下一个可接收人名的起始位置.incincnamectrnamectrcldcldlealeasi,namefldsi,namefldmovmovcx,10cx,10;20;20个字个字节节即即1010个字个字reprepmovswmovswretretd10stor d10stor endpendp;-;-;sort names in table:sort names in table:g10sortg10sort procprocnearnear;功能功能:对对人名表中的人名按字典人名表中的人名按字典顺顺序排序序排序;入口入口:DI:DI指向人名表中的最后一个人名串之后的下一地址指向人名表中的最后一个人名串之后的下一地址;出口出口:排序后的排序后的结结果在原表中果在原表中subsubdi,40di,40;置最后一次比置最后一次比较时较时,前一串的首地址前一串的首地址movmovendaddr,diendaddr,di;因因为为串串长为长为2020字符字符,相相邻邻两串即两串即4040字字节节g20:g20:movmovswapped,0swapped,0;置交置交换标换标志志为为0 0lealeasi,nametabsi,nametab;SI;SI指向表首址指向表首址g30:g30:movmovcx,20cx,20;一个人名的最大一个人名的最大长长度度movmovdi,sidi,si;addadddi,20di,20;DI;DI指向下一个人名在表中的首址指向下一个人名在表中的首址movmovax,diax,di;movmovbx,sibx,si ;保存当前待比保存当前待比较较的两个人名在表中的首地址的两个人名在表中的首地址reperepecmpsbcmpsb ;比比较对应较对应字符字符jbejbeg40g40;前者小于或等于后者前者小于或等于后者,则则不用交不用交换换callcallh10 xchgh10 xchg;否否则则,调换调换子程序互子程序互换换其位置其位置g40:g40:movmov si,axsi,ax ;若一趟比若一趟比较较未完未完,则则SISI应应指向后人名串首址指向后人名串首址cmpcmpsi,endaddrsi,endaddr ;后一人名串的首串与原定的末地址作比后一人名串的首串与原定的末地址作比较较jbejbeg30g30;未超未超过过,则则本趟内循本趟内循环环尚未完尚未完毕毕SUBSUBENDADDR,20 ;ENDADDR,20 ;修改地址修改地址,因因为为一趟比一趟比较较完后完后,一定有一个串排到位一定有一个串排到位cmpcmpswapped,0swapped,0;查查交交换标换标志志jnzjnzg20 g20 ;若若非非0,0,则则说说明明上上一一趟趟比比较较至至少少发发生生过过一一次次交交换换,还还应应继继续续比比较较ret ;ret ;不不则则就就说说明已明已经经排好序了排好序了g10sort g10sort endpendp;-;-;exchange table entriesexchange table entriesh10 xchg proch10 xchg procnear ;near ;功能功能:将将SISI和和DIDI所指的两个人名串互所指的两个人名串互换换位置位置;入口入口:bxbx指向前一串指向前一串,ax,ax指向后一串指向后一串;出口出口:前后两串互前后两串互换换位置位置,交交换标换标志置志置1 1movmovcx,10cx,10lealeadi,namesavdi,namesavmovmovsi,bxsi,bxreprepmovswmovsw;将前一串将前一串转转存存输输出出缓缓冲区冲区movmovcx,10cx,10movmovdi,bxdi,bxreprepmovswmovsw;将后一串将后一串转转存原前一串的位置存原前一串的位置movmovcx,10cx,10lealeasi,namesavsi,namesavreprepmovswmovsw;再将再将输输出出缓缓冲区中的前一串冲区中的前一串转转存到原后一串位置存到原后一串位置movmovswapped,1 ;swapped,1 ;交交换标换标志置志置1 1retreth10 xchg h10 xchg endpendpk10disp prock10disp procnearnear;逐条从从名表中取出人名串送逐条从从名表中取出人名串送显显示示缓缓冲区冲区,用串用串显显示方式示方式显显示示.movmov ah,09 ah,09 lea dx,messg2 lea dx,messg2 intint 21h 21hlealeasi,nametabsi,nametabk20

    注意事项

    本文(第6章 子程序结构(精品).ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开