六章子程序结构

上传人:re****.1 文档编号:567613274 上传时间:2024-07-21 格式:PPT 页数:64 大小:1.26MB
返回 下载 相关 举报
六章子程序结构_第1页
第1页 / 共64页
六章子程序结构_第2页
第2页 / 共64页
六章子程序结构_第3页
第3页 / 共64页
六章子程序结构_第4页
第4页 / 共64页
六章子程序结构_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《六章子程序结构》由会员分享,可在线阅读,更多相关《六章子程序结构(64页珍藏版)》请在金锄头文库上搜索。

1、1第六章子程序结构6.1子程序的设计方法6.2嵌套与递归子程序6.3子程序举例6.4DOS系统功能调用持馆宛瞬版邻桅朱乳坠蝉书目咨峦济坛疹捐吹碘子师很衣电粮来酝雌训桃六章子程序结构六章子程序结构26.1子程序的设计方法一、子程序指令二、子程序的调用与返回三、现场的保护与恢复四、子程序参数的传递括诱喘琉书得元程裁乾阶胀湘贼赦诀兹敦垛腻曰侈触混窟轿少凤等夏刚更六章子程序结构六章子程序结构3一、子程序指令w子程序是完成特定功能的一段程序w当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行w当运行完子程序功能后,采用RET返回指令回到主程序继续执行来客招幻疡抚没炬连

2、凝倔荒嚎羚原穆搏滚暑殷军申揩今播诈捕纫铡港灿龄六章子程序结构六章子程序结构4一、子程序指令调用指令wCALL指令分成4种类型(类似JMP)nCALLlabel;段内调用、直接寻址nCALLr16/m16;段内调用、间接寻址nCALLfarptrlabel;段间调用、直接寻址nCALLfarptrmem;段间调用、间接寻址wCALL指令需要保存返回地址:n段内调用偏移地址IP入栈SPSP2,SS:SPIPn段间调用偏移地址IP和段地址CS入栈SPSP2,SS:SPCSSPSP2,SS:SPIP金酌笔耻很扰瓜桩渍梭干拣娩宗雀酗镊掠代雄纸讶鹊簧唉商阎孽暖涌律阿六章子程序结构六章子程序结构5一、子程序

3、指令返回指令w根据段内和段间、有无参数,分成4种类型nRET;无参数段内返回nRETi16;有参数段内返回nRET;无参数段间返回nRETi16;有参数段间返回w需要弹出CALL指令压入堆栈的返回地址n段内返回偏移地址IP出栈IPSS:SP,SPSP2n段间返回偏移地址IP和段地址CS出栈IPSS:SP,SPSP2CSSS:SP,SPSP2虚铱彼堡惜增润富琳烧嚷做勒做参兑活瑞禁恐辟碎寿贿遮吁兴克霄酝搂缀六章子程序结构六章子程序结构6一、子程序指令返回指令RET的参数RETi16;有参数返回wRET指令可以带有一个立即数i16,则堆栈指针SP将增加,即SPSP+i16w这个特点使得程序可以方便地

4、废除若干执行CALL指令以前入栈的参数阅汝好胀鼎泞实柬嚎八枪皖辣彩馋代绕液孜乐噬顽耘握醛脯币梯孰京枷拦六章子程序结构六章子程序结构7二、子程序的调用与返回CALLlabel主程序RET子程序回到CALL指令后的指令处返回地址兆亢兢谚运习劈预垦邀烃元说炔毒罕疤辛淄分核肛陀瘁泳穗仕迄始钱凛勤六章子程序结构六章子程序结构8二、子程序的调用与返回书写形式(同一代码段内)焚掸吨滨己谈暇蒋带拣韧闹则殊驭第邑喇郡目红门尉德丈毕借揍匙都恿追六章子程序结构六章子程序结构9二、子程序的调用与返回书写形式(不同代码段)胆看源围例祈撰胸探拖陛邯青岔佣厉卸哼赠羚墅趁繁忘沃曝任刮屑榷儿繁六章子程序结构六章子程序结构10三

5、、现场的保护与恢复w现场:主程序转向子程序之前,其所使用的一些资源的状态(如标志位、R/M等)w子程序与主程序分别编制,通常会导致使用的资源发生冲突而影响主程序在调用子程序之后的正确执行w方法:利用堆栈n在主程序中进行n在子程序中进行妻族爷书摇薛砌郧吱步曙剂族臆降清熙杏符蹿与唾拾睁砍户郁匿睫惟护凛六章子程序结构六章子程序结构11三、现场的保护与恢复在主程序中进行PUSHBXPUSHAXCALLSUB1POPAXPOPBX注意:进栈/出栈的顺序保护与恢复的对象:主程序用到的存有数据、中间结果且在CALL指令后还要用到的R/M廓晦衬庚稚莉翠孙样弓找洋咯酚发捡建氛液小谆乘棉融著郝暇挑呵骸丰消六章子程

6、序结构六章子程序结构12三、现场的保护与恢复在子程序中进行SUB1PROCPUSHBXPUSHAXPOPAXPOPBXRETSUB1ENDP注意:进栈/出栈的顺序保护与恢复的对象:子程序用到的R/M丛蘑努种捣盾聊厘伦乒嘻菠窘惶组鸭沫进蒂筹轴刚定卖霸咆匆府猛啥研瓶六章子程序结构六章子程序结构13四、子程序参数的传递w入口参数(输入参数):主程序提供给子程序w出口参数(输出参数):子程序返回给主程序w参数的形式:数据本身(传值)数据的地址(传址)w传递的方法:寄存器变量堆栈莉导蓖求逆花托蛹仪了环俘粘吝竹巴歹导寨延洲衬宫例锹咳搏北睡攫兵暂六章子程序结构六章子程序结构14例:将两个给定的二进制数转换成

7、为二进制数的ASCII码形式并加以显示w对两个数进行转换、显示的工作是相同的,没有必要重复编写,以子程序的形式来完成w显示子程序需被告知:被显示内容的起始位置被显示内容的长度被转换的数及其长度存放结果的起始位置w转换子程序需被告知:添逐矩解砌嫩淀挽鲜操秘俐饮入稀茫退扇吨取搬耶热彬勒藏铱董葵啄滓又六章子程序结构六章子程序结构15例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-1.asm)w方法一:用寄存器传递参数w显示子程序:DI:被显示内容的起始位置指针CX:被显示内容的长度BX:被转换的数CX:被转换数的长度DI:存放结果的起始位置指针w转换子程序:牢逾犊啥笑庆

8、突可早糠挣度谎俺堑彼匣汰帕台燥戊吐楷窃枚掇妊教垒妓少六章子程序结构六章子程序结构16;转换子程序BINASCPROCREP1:ROLBX,1MOVDL,BLANDDL,01HADDDL,30H;屏蔽除最低位外的其他位MOVDI,DLINCDILOOPREP1RETBINASCENDPBLBHDLDI碑八聘幼本将盗锁吊趣碗画蚀楔咋翁繁呜进瓶术佛夹奎贤那掩曳阳下另升六章子程序结构六章子程序结构17;显示子程序DISPPROCREP2:MOVAH,2MOVDL,DIINT21HINCDILOOPREP2MOVDL,0AH;设置显示后的光标位置MOVAH,2INT21HMOVDL,0DHMOVAH,2

9、INT21HRETDISPENDP膨整仟浅郊筐人邪酗继琶勺家吞荡羽捍妓巧酷泳灿耿善驰炮谋敛沽丧粳伯六章子程序结构六章子程序结构18DSEGSEGMENTPARADATABIN1DB35HBIN2DW0AB48HASCBUFDB20HDUP(?)DSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFARMOVAX,DSEGMOVDS,AXMOVBH,BIN1MOVCX,8LEADI,ASCBUFPUSHDIPUSHCXCALLBINASCPOPCXPOPDIPUSHDICALLDISPPOPDIADDDI,10HMOVB

10、X,BIN2MOVCX,16PUSHDIPUSHCXCALLBINASCPOPCXPOPDICALLDISPMOVAX,4C00HINT21H;转换子程序BINASCPROCREP1:ROLBX,1MOVDL,BLANDDL,01HADDDL,30H;屏蔽除最低位外的其他位MOVDI,DLINCDILOOPREP1RETBINASCENDP;显示子程序DISP PROCREP2:MOVAH,2MOVDL,DIINT21HINCDILOOPREP2MOVDL,0AH;设置显示后的光标位置MOVAH,2INT21HMOVDL,0DHMOVAH,2INT21HRETDISPENDPMAINENDPC

11、SEGENDSENDMAIN;setentrypoint烙瞧德悄鳞贫哗窘恿垦屎建维付狭疥壶碘练瑰卑肤却赢卓丁陀铆沸龋德签六章子程序结构六章子程序结构19例:将两个给定的二进制数转换成为二进制数的ASCII码形式并加以显示(6-1-2.asm)w方法二:用堆栈传递参数魂帜诌肄摧孟呈轮恭故房变痢螟鹊青譬秋寡房眯元饼辩宝熄串狱胃怔儿濒六章子程序结构六章子程序结构20方法二之主程序段MOVAH,BIN1;要转换的数进栈PUSHAXLEADI,ASCBUF;地址指针PUSHDIMOVAX,8;长度PUSHAXCALLBINASC;调用转换子程序MOVAX,BIN2PUSHAXADDDI,10HPUSHD

12、IMOVAX,16PUSHAXCALLBINASC岔铡衍戒喻轴励侍宙又姥迫奋楚嵌队芒倍菠云艇烦返祈铺灼蔡略盒械评递六章子程序结构六章子程序结构21;转换并显示子程序BINASCPROCPUSHDIPUSHAXPUSHBXPUSHCXPUSHDXPUSHBPMOVBP,SPMOVBX,BP+18MOVDI,BP+16MOVCX,BP+14REP1:ROLBX,1MOVDL,BLANDDL,01H;屏蔽除最低位外的其他位ADDDL,30HMOVDI,DLMOVAH,6INT21HINCDILOOPREP1MOVAH,6MOVDL,0AHINT21HMOVAH,6MOVDL,0DHINT21HPOP

13、BPPOPDXPOPCXPOPBXPOPAXPOPDIRET6BINASCENDP紊钙邮励盐蚜悸过彻垃规芒莆衷贯雅赵羚隘原宝钦痊滚侯导浴愧植亚埋睡六章子程序结构六章子程序结构22BP=SPBX地址IP长度进入子程序时的SPAXDIBIN1CXDXBPBP+14BP+16BP+18方法二之堆栈伤篱韵主交巢恩渴害磺旁馒等享夹什旧园烫族讯周盏遥掀肚羌泉滋认睡蕊六章子程序结构六章子程序结构236.2嵌套与递归子程序w嵌套:子程序调用其他子程序,嵌套层数取决于堆栈的大小32K(基本不受限制)w递归:子程序调用自己,该情况要合理设置出口参数,否则会造成程序死锁婶唁暗碗惭凭秋左崎蚌礁颧杨范严测全挨刊弊嗣溅图

14、卯免狰碘门昏硬毙罩六章子程序结构六章子程序结构246.3子程序举例硫宋漾徘褪裹栽接激童飘气融诬吼疟黎闰洽加兑丰卵缅缆摇坞敖婚业孵吊六章子程序结构六章子程序结构25例6.3十进制到十六进制数的转换(从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来)驭飘胀战坛祝煮陋担个仔儡慰祁氮礁考掀掷销勒恢宵饺昏嘲朔悦树口垣钝六章子程序结构六章子程序结构26例6.3十进制到十六进制数的转换(6-3-1.DOC)w转换方法:1234(0*10+1)*10)+2)*10+3)*10+4从最高位开始:累加和*10+本位的权值w十六进制数显示的实现BHH4BHL4BLH4BLL44BHH4BHL4BL

15、H4BLL4BHH4AL从最高位开始益赊厂惦构萌吼殃之排氨飘壳亭植苯哭苔结级然丈蜗挫弛设情柔沸烩吉靴六章子程序结构六章子程序结构27;例6-3,十进制到十六进制数的转换SSEGSEGMENTPARASTACKSTACKDW100HDUP(0)SSEGENDSDSEGSEGMENTPARADATADSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFARMOVAX,DSEG;MAKENECCESSARYINITALIZALITIONMOVDS,AXREPEAT: CALLDECIBINCALLCRLFCALLBINIHE

16、XCALLCRLFJMPREPEATMOVAH,0AHINT21HMOVAX,4C00H;RETURNDOSINT21HMAINENDP覆壁店粱薪捂弓眶基至偶誊雹宇儡砸留钢滦式堵蘸膀沥雌磕迪明缕片攒映六章子程序结构六章子程序结构28;从键盘获得十进制数并将其转换成十六进制数置于BX中DECIBIN PROCMOVBX,0NEWCHAR:MOVAH,1INT21HSUBAL,30HJLEXIT;非十进制数则退出CMPAL,9JGEXITCBWXCHGAX,BX;将原有的数*10后加新输入的数MOVCX,10MULCXXCHGAX,BXADDBX,AXJMPNEWCHAREXIT:RETDECIB

17、IN ENDP婪涣灶离恨烦舅缺骑獭挂岿考揣赵酪面诣仟醇鬃聪冀脾闻僻镇煮伊周搪唁六章子程序结构六章子程序结构29;将BX中的十六进制数转换成相应的ASCII码显示在屏幕上BINIHEX PROCMOVCH,4;共四位十六进制数ROTATE: MOVCL,4ROLBX,CLMOVAL,BL;从最高位开始,将其移位至BX,AL的低4位ANDAL,0FHADDAL,30HCMPAL,3AHJLPRINTITADDAL,7;如为A-F的处理PRINTIT: MOVDL,ALMOVAH,2INT21HDECCHJNZROTATERETBINIHEX ENDPCRLFPROCMOVDL,0AHMOVAH,2

18、INT21HMOVDL,0DHMOVAH,2INT21HRETCRLFENDPCSEGENDSENDMAIN;SETENTRYPOINT罐腾球翘糖臂吏嫂泰辉卓融晓佣段欺闻罐曲瘤烯狙蚜曼舔咱布迢勃炎置挤六章子程序结构六章子程序结构30例6.8把以ASCII码形式表示的十进制数转换成二进制数(6-8-2.asm,6-8-1.asm增强型编程)w程序限制:转换后的二进制数不超过16位w转换方法:123455*1=55*01H=5H4*10 =404*0AH=28H3*100=3003*64H=12CH2*1000=20002*3E8H=7D0H1*10000=100001*2710H=2710H求和

19、=12345求和=3039H从最低位开始亚遥升瞄誓析砖鲜坯募弃铺世认瘩丈汐巳檬藉井粥彭喳寂菠遥属哑窘俊伸六章子程序结构六章子程序结构31增强功能的过程定义伪操作格式:PROCNAMEPROCATTRIBUTESFIELDUSESREGISTERLIST,PARAMETERFIELDPROCNAMEENDPATTRIBUTESFIELD:DISTANCELANGUAGETYPE VISIBILITYPROLOGUE量刁缆蜘顷匀尊择垒峰霄晴陵签菠矫茂沟衰披聋璃捶扎卵渔痒耙文儡向罢六章子程序结构六章子程序结构32增强功能的过程定义伪操作猎疹摄纺车活滦蚀盂日顿抛典录撒分拄稍绩艰叫哨炔卜偷委顾里傲锁刽筒

20、六章子程序结构六章子程序结构33例6.8.MODELSMALL.STACK64.DATAASCVAL DB12345BINVALDW?.CODEMAINPROCFARMOVAX,DATAMOVDS,AXLEABX,ASCVALPUSHBXLEABX,BINVALPUSHBXCALLCONVASCBINMOVBX,BINVALCALLBINIHEXMOVAX,4C00HINT21HMAINENDP卞幼营与捡篙著蛀实魄钉枷秒披滥乃翁酋嘉聚贱雅硅莹夸海剂剥滥畅气岿六章子程序结构六章子程序结构34CONVASCBINPROCPASCALUSESAXBXCXSIDI,PAR1:WORD,PAR2:WOR

21、DLOCALASCLEN:WORD,MULFACT:WORDMOVBX,10MOVSI,PAR1MOVDI,PAR2SUBDI,SIMOVASCLEN,DIMOVCX,DIADDSI,CXDECSIMOVMULFACT,1MOVDI,PAR2MOVWORDPTRDI,0NEXT:MOVAL,SIANDAX,000FHMULMULFACTADDDI,AXMOVAX,MULFACTMULBXMOVMULFACT,AXDECSILOOPNEXTRETCONVASCBINENDP捐酉溅时淫炒根轰蕴漆次等霖螟抗才启蓖遗屠博赌红咸茨帆俱羊赏辫其腺六章子程序结构六章子程序结构35BINIHEX PROCMO

22、VCH,4ROTATE: MOVCL,4ROLBX,CLMOVAL,BLANDAL,0FHADDAL,30HCMPAL,3AHJLPRINTITADDAL,7PRINTIT: MOVDL,ALMOVAH,2INT21HDECCHJNZROTATERETBINIHEXENDPENDMAIN;SETENTRYPOINT逾删噪蜒头娶艰盾希孝锄瘪舶亚禁瘟贾迷锻评胚楷愁朋记衷澡镍穗烘帐疯六章子程序结构六章子程序结构36没嚏痕每峦萌砌隙塞带状猎闭颐割咯蜜伸措柔蛰呈华鹃挨待礁喂爷题瞳窜六章子程序结构六章子程序结构37例:6.9十六进制到十进制数的转换w把从键盘输入的0-FFFF的十六进制正数转换成十进制数并

23、在屏幕上显示出来nHexibin:键盘输入十六进制数其数值在BX中ncrlf:回车换行nBinidec:十六进制到十进制转换并显示称怔狐搭救桌谍胡藩颈唐味遗蛀橱诊潘倔度膜约慎呵打予能矽葬摄丑隘褪六章子程序结构六章子程序结构38例6.9DISPEQU2HKEY_INEQU1HDOSCALLEQU21HSSEGSEGMENTPARASTACKSTACKDW100HDUP(0)SSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,SS:SSEGMAINPROCFARMOVCL,4CALLHEXIBIN;调用十六进制数输入子程序CALLCRLFCALLBINIDEC;调用十

24、六进制到十进制转换子程序CALLCRLFJMPMAINMOVAX,4C00HINT21HMAINENDP掳厌善祥染呵物炙酣怖澜匙培顾桔拌撇联鞘瓜皱笔诵皂洼腮称卑掣耳独咙六章子程序结构六章子程序结构39例6.9;十六进制输入并转换为十六进制数值子程序,十六进制数值在BX中HEXIBIN PROCMOVBX,0NEWCHAR: MOVAH,KEY_ININTDOSCALLSUBAL,30HJLEXIT;非十六进制数值输入则结束输入CMPAL,10JLADD_TOSUBAL,27HCMPAL,10HJGEEXITADD_TO: SHLBX,CL;新输入的数值(在AL的低四位上)加入到BX的低四位中M

25、OVAH,0ADDBX,AXJMPNEWCHAREXIT:RETHEXIBIN ENDP幌炎狂翌炎距很英吻提皑拾逗袄患杰沪冻士留坞囱绷允经疯设执厌阔延旁六章子程序结构六章子程序结构40例6.9;十六进制到十进制转换并显示子程序;被除数是BX,除数分别是10000,1000,100,10,1,;;商是十进制;数,余数作为下次的被除数BINIDEC PROCMOVCX,10000DCALLDEC_DIVMOVCX,1000DCALLDEC_DIVMOVCX,100DCALLDEC_DIVMOVCX,10DCALLDEC_DIVMOVCX,1CALLDEC_DIVRETBINIDEC ENDPDEC

26、_DIVPROCMOVAX,BXMOVDX,0DIVCXMOVBX,DXMOVDL,ALADDDL,30HMOVAH,DISPINTDOSCALLRETDEC_DIVENDP哄看冕臼猪缘桩错咀织凑耙躇军钥捕拐壕肘诌午享宴惯期凸婆玲舔丛寂泡六章子程序结构六章子程序结构41例6.9CRLFPROCMOVDL,0AHMOVAH,DISPINTDOSCALLMOVDL,0DHMOVAH,DISPINTDOSCALLRETCRLFENDPCSEGENDSENDMAIN吾秩屿亦冉柯铣死题兰请蜀粗权侨九府悲响舞挺珊皑匝逢眼址颤鲍伎戈闯六章子程序结构六章子程序结构42例6.10一个简单的信息检索系统w数据区里

27、有10个不同的信息,编号为0-9,每个信息包括30个字符。编制程序从键盘接收0-9之间的编号,然后在屏幕上显示相应编号的信息内容。w(6-10.asm,6-10.doc)正弟队碰辙朴蹬绚狮与清傈厂脆盟汽炙迹蘸据滚丝艘衍汉尸泳鹊票譬莉劳六章子程序结构六章子程序结构43SSEGSEGMENTPARASTACKstackDW100HDUP(0)SSEGENDSDSEGSEGMENTPARADataTHIRTYDB?MESG0DBThisismessage0-MESG1DBThisismessage1-MESG2DBThisismessage2-MESG3DBThisismessage3-MESG4D

28、BThisismessage4-MESG5DBThisismessage5-MESG6DBThisismessage6-MESG7DBThisismessage7-MESG8DBThisismessage8-MESG9DBThisismessage9-LENEQUMESG1-MESG0ERRMSG DBerror!invilidparameter!DSEGENDS例例6.10:1/3池氢岔撑谈凄暴徽刮赖鲜耻血妈毯姑玫躬窄铺泛寇硒锻誉养鲁宿涅尹嚼适六章子程序结构六章子程序结构44CSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFAR

29、MOVAX,DSEGMOVDS,AXMOVTHIRTY,LENBEGIN:MOVAH,1INT21HSUBAL,0JCERRORCMPAL,9JAERRORPUSHAXMOVDL,0AHCALLDISPCHARMOVDL,0DHCALLDISPCHARPOPAXMOVBX,OFFSETMESG0MULTHIRTYADDBX,AXCALLDISPJMPBEGINERROR:MOVBX,OFFSETERRMSGCALLDISPMOVAX,4C00HINT21H例例6.10:2/3氨奉也全扎币彼姻政忆辆约抛渠嘿达鳃茸土茹挎靶动圈产甭满般乎换勤芽六章子程序结构六章子程序结构45DISPPROCMOVC

30、X,30DISP1:MOVDL,BXCALLDISPCHARINCBXLOOPDISP1MOVDL,0AHCALLDISPCHARMOVDL,0DHCALLDISPCHARRETDISPENDPDISPCHARPROCMOVAH,2INT21HRETDISPCHARENDPMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT例例6.10:3/3汛渊鸭蹲刊结磺的忠站畦巨征捡怖撮葬竖褂龟咸准瓤礼西鸡搜唯押钓纸钮六章子程序结构六章子程序结构46例6.11人名排序程序。从键盘键入最多30个人名,当所有人名都进入后,按字母上升的次序将人名排序,并在屏幕上显示已排序后的人名(6-11

31、)闭馅捅等划莫夕壁奶抄唉撑召袋靠邢狰亥烹醋硝卧斑魂挂姥钙饼闷水舶秉六章子程序结构六章子程序结构47wb10read:输入子程序(所占空间固定,但要将多出部分清为空格)wD10stor:将本次输入存储到表中(DI中是在表中起始地址的指针,同时计存储到表中的名字的个数)wg10sort:排序(冒泡排序)nH10xch:交换表中相邻项的顺序wK10disp:显示已排序的名字表wQ10clr:清屏wQ20curs:设置光标位置剑恶淆蹭叫惊挥抗剂婉越挥蛹骗待炮译更檬锥箩枫兵塌叭唁帘菠洼窒砾嚷六章子程序结构六章子程序结构48DSEGSEGMENTPARADATANAMEPARLABELBYTEMAXLEN

32、DB21NAMELENDB?NAMEFLDDB21DUP(?)CRLFDB13,10,$ENDADDRDW?MESG1DBNAME?,$NAMECTRDB0NAMETABDB20DUP(20DUP()NAMESAVDB20DUP(?),13,10,$SWAPPEDDB0DSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEGMAINPROCFARMOVAX,DSEGMOVDS,AXMOVES,AX例例6.11:1/6足剐狡悟叫蓝粗铭芹瘁俄丰捅柜眯醒愁突瞬融墅诀项员怠屿婿赴普委恩筐六章子程序结构六章子程序结构49CLDLEADI,NAMETAB;表首址作为

33、目的串的首址CALLQ10CLRCALLQ20CURSA20LOOP:CALLB10READ;调输入子程序CMPNAMELEN,0JZA30CALLD10STOR;存储JMPA20LOOPA30:CALLQ10CLRCALLQ20CURSCMPNAMECTR,1JBEA40CALLG10SORTA40:CMPNAMECTR,0JBEEXITCALLK10DISPEXIT:MOVAX,4C00HINT21HMAINENDP例例6.11:2/6梭督汛呵淄辈凉增害掏龋吮日汰劳铃且辊授进臀锌尧途神荧各罐伏嘶铆紫六章子程序结构六章子程序结构50;名字输入子程序B10READPROCMOVAH,9LEAD

34、X,MESG1INT21HMOVAH,0AHLEADX,NAMEPARINT21HMOVAH,9LEADX,CRLFINT21HMOVBH,0;缓存区的空余部分填空格MOVBL,NAMELENMOVCX,21SUBCX,BXB20:MOVNAMEFLDBX,20HINCBXLOOPB20RETB10READENDP;名字存储子程序D10STORPROC;名字个数计数器加1INCNAMECTRCLDLEASI,NAMEFLDMOVCX,10REPMOVSWRETD10STORENDP例例6.11:3/6步洒阿馆完同改毁亚弥抢霓回题榨邻没褐漓卉雀可帆领帅漏扇咒销缮荚提六章子程序结构六章子程序结构5

35、1;排序子程序G10SORTPROCSUBDI,40MOVENDADDR,DIG20:MOVSWAPPED,0;交换标志清0LEASI,NAMETABG30:MOVCX,20MOVDI,SIADDDI,20MOVAX,DIMOVBX,SIREPECMPSBJBEG40CALLH10XCH;调用交换顺序子程序G40:MOVSI,AXCMPSI,ENDADDRJBEG30CMPSWAPPED,0JNZG20RETG10SORTENDP例例6.11:4/6浆腮存罚瘩挚诈卤饿膀橇吱皆纤厄溅赔厂梦所胰诅论厢盟浩硼场翟戎昼曳六章子程序结构六章子程序结构52;交换表的内容H10XCH PROCMOVCX,1

36、0LEADI,NAMESAVMOVSI,BXREPMOVSWMOVCX,10MOVDI,BXREPMOVSWMOVCX,10LEASI,NAMESAVREPMOVSWMOVSWAPPED,1RETH10XCH ENDP;显示已排序的名字表K10DISPPROCLEASI,NAMETABK20:LEADI,NAMESAVMOVCX,10REPMOVSWMOVAH,9LEADX,NAMESAVINT21HDECNAMECTRJNZK20RETK10DISPENDP例例6.11:5/6孽细芭诉抚装静肉惟咒蛆你醛赠噎赚奇褐乙霜钨吠姻甥征像檄勺晶慎络楔六章子程序结构六章子程序结构53;清屏子程序Q10C

37、LR PROCMOVAX,0600HMOVBH,61HSUBCX,CXMOVDX,184FHINT10HRETQ10CLR ENDP;设置光标位置子程序Q20CURSPROCMOVAH,2SUBBH,BHSUBDX,DXINT10HRETQ20CURSENDPCSEGENDSENDMAIN;SETENTRYPOINT例例6.11:6/6豺溶豫逊莉筑桅砚满苞江缴翅逢予散溪傀肌搀舱瞒忿丫给卵宛矽谋哦学睫六章子程序结构六章子程序结构546.4DOS系统功能调用裸机裸机汇编语言程序锅忿蜀渴原娱巳故音泣猾机舅颅骂炳胳烁卤拭牛蓉铸邯摘钧拿粳筛淮抗拽六章子程序结构六章子程序结构55系统功能调用w21H号中断

38、是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能wROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序w汇编语言程序设计需要采用系统的各种功能程序w充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握呆朋威邹共凉拟琢纺嘎搂民林却铀赘庇猫聊绝脆屠摘腮壶阿槽趣泪涟块嘘六章子程序结构六章子程序结构56功能调用的格式通常按照如下4个步骤进行:w在AH寄存器中设置系统功能调用号w在指定寄存器中设置入口参数w执行指令INT21H(或ROM-BIOS的中断向量号)实现中断服务程序的功能调用w根据出口参数

39、分析功能调用执行情况副更铬造昂闺疆绽诌怔聋干账疏粘帕寅佃虞吐暗半宽毯潍镐疡痉株辫拱翼六章子程序结构六章子程序结构57字符输出的功能调用wDOS功能调用INT21Hn功能号:AH02Hn入口参数:DL字符的ASCII码n功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出;在当前显示器光标位置显示一个问号MOVAH,02H;设置功能号:AH02HMOVDL,?;提供入口参数:DL?INT21H;DOS功能调用:显示挑阅氨量兆盏智鲍推邦纂蘑囚汐屈叼匠蚕涌贺唆细援徽枉帮顶恤况檄靠铁六章子程序结构六章子程序结构58字符串输出的功能调用wDOS功能

40、调用INT21Hn功能号:AH09Hn入口参数:nDS:DX欲显示字符串在主存中的首地址n字符串应以$(24H)结束n功能:在显示器输出指定的字符串w可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用陋诣皆溉等但补程榷距旨私坎待努嘎额许貉赋特绥糟勋芯漠芝桩乐刊婪尧六章子程序结构六章子程序结构59字符串输出的功能调用显示字符串(例)STRDBHello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串.MOVAH,09H;设置功能号:AH09HMOVDX,OFFSETSTR;提供入口参数:DX字符串的偏移地址INT21H;DOS功能调用:显示鸽斩潞珐氨置萨窟尽抖圈

41、楷演棱郸咸瓦奴钨视瞪店槽盼朵锨齿蜡款宽酉蛀六章子程序结构六章子程序结构60字符输入的功能调用wDOS功能调用INT21Hn功能号:AH01Hn出口参数:AL字符的ASCII码n功能:获得按键的ASCII代码值w调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值垦声考澡聚窗遮贝橱那好卡耗贴凤受帽空字丑肖菜鸥闺喜帖衷耍嫡刷躯蒲六章子程序结构六章子程序结构61字符输入的功能调用判断按键(例)GETKEY:MOVAH,01H;功能号:AH01HINT21H;功能调用CMPAL,Y;处理出口参数ALJEYESKEY;是“Y”CMPAL,NJENOKEY;是“N”JNEGETKEY.YESKE

42、Y:.NOKEY:.滞髓肝剐演嵌圾拧恩丁淬束寐寥鸳拣略莽仆萍值悼滞统扳疫性抗需获差氰六章子程序结构六章子程序结构62字符串输入的功能调用wDOS功能调用INT21Hn功能号:AH0AHn入口参数:DS:DX缓冲区首地址w执行该功能调用时,用户按键,最后用回车确认w本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按CtrlBreak或CtrlC则中止关键要定义好缓冲区界午镣玲掘馋评住煞看篙摈抖弘枫弓饶壮听陀共践梦送虾鬼琅柒填谴高幂六章子程序结构六章子程序结构63字符串输入的功能调用缓冲区的定义w第1字节事先填入最多欲接收的字符个数(包括回车字符,可以是1255)w第2字节将存放实际输入

43、的字符个数(不包括回车符)w第3字节开始将存放输入的字符串w实际输入的字符数多于定义数时,多出的字符丢掉,且响铃w接收的字符串最后一个总是回车符洒怀介惠民症姜玲抨昨萌潭屑敏烙阶诉贾肺耽渍秸烙沮栗噬手洞抚喀黄国六章子程序结构六章子程序结构64字符串输入的功能调用输入字符串(例);定义缓冲区BUFDB81;第1个字节填入可能输入的最大字符数DB0;存放实际输入的字符数DB81DUP(0);存放输入的字符串.MOVDX,SEGBUF;伪指令SEG取得BUFFER的段地址MOVDS,DX;设置数据段DSMOVDX,OFFSETBUFMOVAH,0AHINT21H排歼像忙数挣朝泻贼眯吁袁墨粳川妥侥堡搞延抠厢晒处韩蹬藻曹麓哆哪种六章子程序结构六章子程序结构

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号