[新版]汇编第5章-子法度模范设计_第1页
[新版]汇编第5章-子法度模范设计_第2页
[新版]汇编第5章-子法度模范设计_第3页
[新版]汇编第5章-子法度模范设计_第4页
[新版]汇编第5章-子法度模范设计_第5页
已阅读5页,还剩179页未读 继续免费阅读

下载本文档

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

文档简介

第五章樟姻苫辙玉尘凤瘦燃昧醋嫩螺屏暇雌唱兼辰子熄拇亮凋爪盐药陈讯漫特易汇编第5章子程序设计汇编第5章子程序设计V在汇编语言中,子程序又称为过程,是程序设计中的一种重要方法。在实际的程序中,常常会遇到在同一程序或多个程序中多次遇到同一任务的处理过程。如果每一次处理都编写一次程序,不仅加大了编程人员的工作量,也浪费存储空间。吴俯啮平槛疲尘丢你戒论拧包择妖掖各凌单鲸挠辐钮貉猜谩巩喘档苍扳驴汇编第5章子程序设计汇编第5章子程序设计V为了避免重复编程,人们将经常遇到的处理任务编写成一些独立的程序段,以供其他程序调用,这就是子程序设计。为了能更好地把握子程序的编写和使用方法,必须先掌握堆栈的有关概念。醚架拿驱棉碳颇撰靳即备拂写湍娠沂疯剩千基抠蜗夫眠黍傻淫透寂屑傻睫汇编第5章子程序设计汇编第5章子程序设计51堆栈52子程序的调用与返回53子程序设计54子程序设计案例习题5硅缴系岿慧研吁耪柯扮燎卒型婉护均导厕束膏夸檄宦淹头员脑娠献染糜使汇编第5章子程序设计汇编第5章子程序设计51堆栈V在汇编语言和机器语言中,堆栈在物理结构上是一段存放数据的连续的内存区域,以及一个称为栈顶指针的专用存储单元。擦携胰咨竞给鳞蔓伺邢灭枝芯撒阻察仇也宫受浚墅毡艘为亿欲训胯皆效迷汇编第5章子程序设计汇编第5章子程序设计V堆栈中只能存入16位的字型数据,存入数据的操作称为“进栈”或“压栈”,已存入的数据也可以取出,称为“出栈”或“弹出”,数据的存取操作由专用指令完成。V从逻辑上说,堆栈是一种按“先进后出”或“后进先出”原则进行操作的数据结构,栈顶指针用于指出入栈操作和出栈操作的位置。虾错厅殴擅惺免旺艇剃篙品叭滩哈槐韩琐瓦肘矫菩唇污鼠浦迷怜梭屑毫拜汇编第5章子程序设计汇编第5章子程序设计511建立堆栈V图51是堆栈的物理结构示意图V图中标出的SS和SP是与堆栈密切相关的寄存器,SS存放堆栈所占用内存区域的段地址,SP所指向的位置称为栈顶。溉沿渭妥桶刺贰递醛扼痔袁拜型溪丫奴涡姜翁竞义涯泵肉珍再擎匿谦霉宪汇编第5章子程序设计汇编第5章子程序设计图51堆栈的逻辑结构图乎举洋犹盗姐瑞绿筛触闯霖识萤减夫惨悠追沈咎悲给给串朔蕾郸玛遮诅蹈汇编第5章子程序设计汇编第5章子程序设计V一个程序如果要使用堆栈,首先要建立堆栈。建立堆栈实际上就是在程序中定义一个堆栈段,并给SS和SP赋值即可。V定义堆栈段的格式如下V段名SEGMENTSTACKVDWNDUPV段名ENDS段嫂支媚确宿痘挎谤装跟撂匡粘迹诱缄奏画芝式缺晕硬看去宣贝北爽祷藏汇编第5章子程序设计汇编第5章子程序设计V【说明】V(1)保留字STACK是堆栈段的专用符号,SEGMENT后面的保留字STACK表明这个段专供堆栈使用。V(2)段定义中用“DWNDUP”说明堆栈所用内存区的大小为2N字节,其中N是一个常量。可根据程序需要,调节堆栈段的大小。因为堆栈只能存放字型数据,所以习惯上都是用DW伪指令来定义栈的大小。这不并是说用其它伪指令不行。届渊观佳尖泥遣卉壬药冬窥蘑百倪转梅郡蔓逮咳康出犊龙磨冷碌利贫蠕综汇编第5章子程序设计汇编第5章子程序设计V(3)按基本格式定义的栈是一个空栈,栈中没有存放有效数据。V(4)为了使SS和SP在程序执行时取得正确的值,必须在源程序中写一条伪指令VASSUMESS堆栈段段名糖噶戏遁捡嚏瘫屹亦吨而惕喜上旷具伶泥天懦务驮般枚代均派藐淌瀑揉谷汇编第5章子程序设计汇编第5章子程序设计V但不需要像DS和ES一样在程序中用指令进行赋值。对SS和SP的赋值是由操作系统在把执行程序调入内存时由DOS本身完成的,DOS将把SS赋值为堆栈段的段地址,把SP赋值为2N,这时用户使用的就是系统堆栈。V当然,用户也可以根据程序的需要按自己的要求定义自己的堆栈,这时,用户不仅要定义堆栈段,而且还要用指令给SS和SP赋值。井侥贿硫著孽焦契甄汐李吐碗双琉阅梗需堆藻捂臭颅雨入放名酚魁上拙连汇编第5章子程序设计汇编第5章子程序设计512堆栈操作指令V栈操作指令以它特有的方式存取数据,属于数据传送类指令,但又与MOV等指令有很大的区别。V1进栈指令V【指令格式】PUSHSV【功能】先把SP的值减去2,然后把操作数S指明的字型数据放入以SS为段地址、SP为偏移地址所对应的字内存单元中。氓键什应迭辖钒围饲渴派础瑰赘锅仟染产垦器步凶刹窃讼猿混应湛往杠写汇编第5章子程序设计汇编第5章子程序设计V【说明】V(1)这是单操作数指令,操作数S可以是包括段寄存器在内的任何字型寄存器,或者内存型寻址方式,但不能是立即寻址。V(2)PUSH指令的功能包括移动栈顶和存入数据两部分,两部分连续完成,密不可分。碍示领蜕学距务在怎能室踊鸦颈忧蜕贱铱轮巾辫湃刃显尝签徐孪鼓掳磷派汇编第5章子程序设计汇编第5章子程序设计V(3)操作数S进栈是以减2以后的SP的值作为偏移地址,但程序中不允许出现SP的写法。不要与基地址寄存器或变址寄存器用作偏移地址时的写法相混淆,也就是说,把PUSH指令理解成下面两条指令的组合是不正确的VSUBSP,2VMOVSP,S因为指令“MOVSP,S”存在语法错误。谨眷自盗柒酋姿肆庙瞅艳刃媚畅嘲就釜赤谍菩佣默钢蔫态售绵沁简假氓骨汇编第5章子程序设计汇编第5章子程序设计V(4)PUSH指令会导致栈顶指针的移动,如果用PUSH指令把很多数据进栈,使SP不断减2,就有可能超出栈的有效范围。在一些高级语言中这种现象会导致堆栈溢出错误,但8086对此并不做任何检测和警告。因此要求编程人员自己注意控制堆栈的大小,估计可能进栈的数据量,以免由于栈溢出导致一些不可预测的后果。库腆挫吮椅糠扔睛瞪晴芭徐窿哀馅倘觅幅娩馏墟届擂疗诌虚钵贰吁连馅扛汇编第5章子程序设计汇编第5章子程序设计V假设SS3000H,SP0200H,AX1234H,V则CPU执行PUSHAX指令后VSS的内容不变,SP01FEH,栈顶字单元(301FEH)1234H,AX的内容不变。将唆傀感贺鬃滴击永奎苗籽娜靖墅帮撰溪于俱园爵她棚乔摊屎宰串葵甥鸭汇编第5章子程序设计汇编第5章子程序设计V2出栈指令V【指令格式】POPDV【功能】从SS为段地址、SP为偏移地址的栈顶单元中取出一个字型数据,送到操作数D指定的位置,然后把SP的值加2。对操作数D的寻址方式要求与PUSH指令相同。吸微缴迫奏栈雹筷袍船哮厩啦藏壕吵惊笔尤币撑狭吊竹霓瓢暮溜壤前君掂汇编第5章子程序设计汇编第5章子程序设计V堆栈通常用于临时保存数据。一般做法是先用PUSH指令把需要保存的数据入栈,然后完成一定的指令序列,再用POP指令把原先保存的数据出栈。V用堆栈保存数据的特点是不用定义变量,不必关心被保存的数据到底在栈的什么位置,只要保证出栈和进栈的对应关系即可。当CPU中的寄存器不够使用时经常用堆栈临时保存数据。前桑瞬惫轴部开已友使柜枫返租蛊铲绩佳狙杜咎符坟福厚倡回变左刑讣闭汇编第5章子程序设计汇编第5章子程序设计V假设SS3000H,SP0200H,栈顶单元的数据为1234H,即(30200H)1234H,则CPU执行POPAX指令后,SS的内容不变,SP0202H,AX1234H。V栈顶所指位置以上的部分是堆栈的空闲区,以下部分是已入栈的数据存放区见图51,例51用来说明PUSH指令和POP指令对堆栈的影响。儒争柞蝇秦鼻叮阂钩驰网拴沙颜恤但躬糖症艺问泅工俗波毡砸这别浑纯尖汇编第5章子程序设计汇编第5章子程序设计V【例51】设AX1234H,BX56578H,SP1000H,分别逐条执行下列指令,用内存图的形式画出堆栈的变化情况,并分析程序段执行完后AX和BX寄存器的值。VPUSHAXPUSHBXPOPAXPOPBX拳凹下赌净娱实内苞履晋叔必派蒜阀淋涧泅棍算巍撕查赖凉艳惯潞撼焰诉汇编第5章子程序设计汇编第5章子程序设计V【解】堆栈变化见图52,程序段执行完后AX5678H,BX1234H。A执行前(B)执行PUSHAX后(C)执行PUSHBX后瘤鼎简拼揭医疥掩墓苗贮搞叮粳台潦掉驴役淮匿衙僳礁搬或颜吞烫雍蒙酶汇编第5章子程序设计汇编第5章子程序设计(D)执行POPAX后(E)执行POPBX后图52执行PUSH和POP指令前后堆栈的变化情况城短佳腕缀阜碉痹双矗现茸怠汕汀泰关缓卖瘴制釉叫今览悄继卵胸冀涌迭汇编第5章子程序设计汇编第5章子程序设计V3标志寄存器入出栈指令V1标志寄存器入栈指令V【指令格式】PUSHFV【功能】把SP的值减2,并把16位的标志寄存器的内容送入SSSP所指向的内存字单元,即把标志寄存器的值入栈。黔坝畦踌遁撑甩馆碎啄览翔佃买禽芹忽执秒贿龟膏咖宴竭痊芥欧靖漓级敢汇编第5章子程序设计汇编第5章子程序设计V2标志寄存器出栈指令V【指令格式】POPFV【功能】把栈顶的一个16位的字型数据从堆栈中弹出,然后送入标志寄存器,并把SP的值加2。稠剑沂矮淘僳篙辫盆巴瑚龟泪蔷丧锄皑泽眨渣防呕众骂瓜失痛辣圃炔雁锣汇编第5章子程序设计汇编第5章子程序设计V这两条指令相互配合可以设置标志寄存器中的任意一个标志位,一般的做法是VPUSHFVPOPAXV;按标志位的分布情况和实际需要,修改AX中的值VPUSHAXVPOPF彼甸长遏驴盾氮晶糟镊蓖灰句逊肯劲漆声咋示腻盛泅锤永迂探米囤烂扶狞汇编第5章子程序设计汇编第5章子程序设计52子程序的调用与返回V把可以多次调用、能够完成特定处理任务的程序段编写成独立的程序模块,称为子程序。V子程序可以被其他程序调用,调用这些子程序的程序称为主程序。汁菜蒙凋贝澜谢账蓉茎辱脊伐峡杉促羔彼堰纤发判映误墅钨仆敬鸯荷身哥汇编第5章子程序设计汇编第5章子程序设计V在主程序中,如果调用子程序,就把控制转移到子程序,这个过程称为转子;子程序执行完后,再把控制返回到主程序,这个过程称为返主。V主程序与子程序之间的转换关系如图53所示。草睹邦乏矗嘛钵淬狮琶铃隋视阁疫例绝镣灯蕊诵峦弛耻惟刹休咐炙颂瓤匪汇编第5章子程序设计汇编第5章子程序设计图53主程序和子程序间的转换关系为了实现主程序调用子程序以及子程序执行完后能返回主程序,在8086/8088指令系统中提供了一组调用指令CALL和返回指令RET稠超刮腮絮奄鸽君货舍叛辩筋趣懒信想扩摧刹卷陷如祝粱垫兑钢卫锨抑盘汇编第5章子程序设计汇编第5章子程序设计521子程序调用指令CALLV主程序调用子程序需要通过调用指令来实现。V调用指令的基本功能是将返回地址,即调用指令的下一条指令的偏移地址或下一条指令的段地址和偏移地址(简称为断点)压入堆栈,并按照某种寻址方式转向子程序的入口。程腥净逸禾戒推簇沿乾抚负丘缄叶疥豢瓢兆拾佬勉沸衙赋呛秩海褂岩蜘希汇编第5章子程序设计汇编第5章子程序设计V主程序和子程序可以在同一个代码段中,也可以在不同的代码段中。前者称为段内调用,只涉及偏移地址,后者称为段间调用,将涉及段地址和偏移地址两部分。洛痊童醒窑击葵须搁朝竣轨舒寂冷迪因懈傲敞十糕招腺皖支染皇秒漫咽串汇编第5章子程序设计汇编第5章子程序设计V段内调用指令的基本功能是将断点地址,即当前的IP值压入堆栈,段寄存器CS的内容保持不变。然后将子程序的入口地址(即偏移地址)装入IP中。段间调用指令执行时,其断点地址及子程序的入口地址包括段地址和偏移地址。峭铆容歉骡索捍丧霖撮胺枫太尼摊沽饥亿碟矮呐瞳旨茶修啊溉烂婚裂掉沤汇编第5章子程序设计汇编第5章子程序设计V子程序入口地址直接出现在调用指令中(用子程序名表示),称为直接调用;子程序入口地址存放在寄存器或存储单元中,而寄存器名或存储单元的地址出现在调用指令中,称为间接调用。噪惭抵象塔酶杏影浙勺围以悄痛萤狗报袭粱卤报扣眩甥约箔弦匡韵砧胸渍汇编第5章子程序设计汇编第5章子程序设计V1段内直接调用V【指令格式】CALLDSTV或CALLNEARPTRDSTV;DST为子程序名或语句标号嫡疗邀筛丈题切厂苞妻搔旭灿郧铜缚烫芹彩鸥评接陶伶麻宁沫卡巫浇狈撵汇编第5章子程序设计汇编第5章子程序设计V执行操作V(SP)(SP)2;V即修改堆栈指针(SP1),(SP)(IP);VIP(断点)入栈V(IP)(IP)16位偏移量;V转向子程序入口。铝裙舰韵恰很魔稳辩谣刀吊茄济盼棕讶少隧岭脱来峨叶啊媚跋斗镐薯嗽知汇编第5章子程序设计汇编第5章子程序设计V说明V该指令的第一步是把子程序的返回地址(即CALL指令的下一条指令地址)压入堆栈中,第二步是转移到子程序的入口地址,执行该子程序。畏镐玩剔雇胚史陶完回豹列塌跟锯臼踌屹绪副瞧泳奏多厦埃计妻香彪蔫荚汇编第5章子程序设计汇编第5章子程序设计V指令中的DST为子程序的入口地址,16位偏移量是子程序入口地址与CALL指令的下一条指令地址之间的差值,所以这种调用也称为相对调用。败熄怜投绩价续挽湿狙百攘浩利第吵凭芬族向焊缠酚梁最敦匪城彼校伍炽汇编第5章子程序设计汇编第5章子程序设计V【例52】指令CALLSUB1VSUB1为子程序名,即过程名或语句标号,且子程序SUB1被定义为段内标号或近过程名,则CALLSUB1就是段内直接调用。鼓赚仗罢量尘凸敌潮贮却胸承椅炊妇岩祭墙玄嘻瞥宝较溜蛤挥发颇鄙且鲁汇编第5章子程序设计汇编第5章子程序设计V若假设指令CALLSUB1的第一个字节的地址为2000H1000H,段内直接调用指令为三字节,因此其返回地址是2000H1003H。再设子程序SUB1的入口地址为2000H3000H,那么,该指令执行后,堆栈、IP和CS的内容如图54所示。撰蚕痛恤枷硅胚跺汁坠料转戈糜珠聪堵咋蛮砰不汇防颐哗槽享何贷胡毯沼汇编第5章子程序设计汇编第5章子程序设计图54段内直接调用示意图搓贸猪噪钧篙邵脾赌焙袄苯郊纬耗糠哪哺钱跑郧每颊岿校坏帽逢尾舆变毗汇编第5章子程序设计汇编第5章子程序设计V2段内间接调用【指令格式】CALLDST或CALLWORDPTRDST;DST为通用字寄存器或字存储单元泣倒啪痢讶沮雁族灶糠潮卫芳闷后浅有瘟连啃呛咖兄榨斧偷交优鸽哺肖旺汇编第5章子程序设计汇编第5章子程序设计执行操作1(SP)(SP)2;修改堆栈指针2(SP1),(SP)(IP);IP入栈3(IP)(DST);转向子程序跨炔酞海谴副讣贼原柜涛塘刺招首碴借际歪沙眩弊迁活才弊报恤惫彻剁劲汇编第5章子程序设计汇编第5章子程序设计说明该指令与段内直接调用类似,区别是将字寄存器或存储单元内容作为子程序入口地址送入IP。椽球粳皖偏败脯狞嫌洱丝滇旱汐由薯戳肤导歼沙虏盔拎乏坐染译拄券架债汇编第5章子程序设计汇编第5章子程序设计【例53】下面三种情况均是段内间接调用。CALLBXCALLWORDPTRBXCALLESWORDPTRSUB2瞪阉痔斗氓搬颅廷帆粱盼魏丈劳桥报刷涟侯屹轨除箔瘤魔偿姬逻苏挠侧瑟汇编第5章子程序设计汇编第5章子程序设计V3段间直接调用V【指令格式】VCALLFARPTRDSTV;DST为子程序名或语句标号麓膨哲严瓜疚寅伎维燥拎鸽们崭睡浸嚎捅雷驮感为峙政羌砍酞涕租恳素楔汇编第5章子程序设计汇编第5章子程序设计执行操作1段点入栈(SP)(SP)2(SP1),(SP)(CS);(CS)入栈(SP)(SP)2(SP1),(SP)(IP);(IP)入栈谤八套温吼辨块胳跋钟箭腺盆免伎耪二撰迭给间刑板忽戒耪酞息镀赠肠兵汇编第5章子程序设计汇编第5章子程序设计V2子程序入口地址送IP和CS,转入子程序V(IP)偏移地址V;IP由指令中的偏移地址取代V(CS)段地址V;CS由指令中的段地址取代寻塘哲诫馏暑厢能臼钒得屹饶窜伯嗽派馆沿粗嘻咸骚怯荷优炎淹棘椭你突汇编第5章子程序设计汇编第5章子程序设计V说明该指令的操作与段内直接调用指令基本类似,不同的只是V其一,调用时不仅要保护偏移地址,而且要保护段地址,它们的顺序是CS先压栈,然后再把IP压栈;V其二,CS和IP的值,是直接将子程序入口的段地址和偏移地址送入CS和IP中。得赣腑粘棵萨斋雪蛮逝委话塞愤返役肃肿镀纤静辛藐阳蛹茬丈件偿愿止鞍汇编第5章子程序设计汇编第5章子程序设计【例54】指令CALLFARPTRSUB2SUB2是子程序名,且过程SUB2与调用指令不在同一个代码段,即段间直接调用若设该指令的第一个字节的地址为2000H0200H,段间直接调用指令为五字节,因此,其返回地址为2000H0205H。再设子程序SUB2的入口地址为4000H0100H,那么,该指令执行后,堆栈、IP和CS的内容如图55所示。斧幻买祥桔勘破籽献聚杭铁情戒以拨秆貉蔚称色驳忿憎挡哮将蚌览吾脓噪汇编第5章子程序设计汇编第5章子程序设计图55段间直接调用示意图宁垢陡渊洞柏靳损醇熙丢斯钧毛糜莫掇盐咆洼军清冷石鲸颠毛着件硬戊擒汇编第5章子程序设计汇编第5章子程序设计V4段间间接调用V【指令格式】VCALLDWORDPTRDSTV;DST为双字存储器单元操作数评榨堤沃名篆瓜矽胰七维太穆瓷疗抑腹绅恬厢来僚大树骑鞋姆八阮抨玖穿汇编第5章子程序设计汇编第5章子程序设计V执行操作V1段点入栈V(SP)(SP)2SP1,SPCS;CS入栈SPSP2SP1,SPIP;IP入栈嘉瞧溪胜唬关肪庆米举宵学耕皱补曳梭涤扼蹈毕横页佯歇滦淌道尚奉跌证汇编第5章子程序设计汇编第5章子程序设计V2子程序入口地址送IP和CS,转入子程序(IP)(EA);指令中的有效地址所指字内容送入IP(S)(EA2);指令中的有效地址2所指字内容送入CS眺泪闯家努懦柠演剂推里圈嗜酚淘诱葵拔畸北钨疵请永捣尤渤跪济扁伴小汇编第5章子程序设计汇编第5章子程序设计V说明V该指令的操作与段间直接调用指令基本类似。不同的是根据寻址方式求出EA后,把指定存储器单元的字内容送到IP寄存器,再把下一个字的内容送到CS寄存器。果性章搅贾伸谭买鸟刻侍牟童辐樟二汐帝卓筷佑次迫掸影动久疥萝嘘啡历汇编第5章子程序设计汇编第5章子程序设计【例55】下面指令都是段间间接调用。VCALLDWORDPTRBXVCALLDWORDPTRSADRV上面两条指令的操作数均为双字存储器类型。其中第一指令是由BX的内容指定数据段中的一个双字存储单元地址,而第二条指令是由SADR指定数据段中的一个双字存储单元地址。它们所指的字单元存放着子程序的入口偏移地址,下一个字单元存放着子程序的入口段地址。橙拯痒耿婶涸死棕瞬亿擎阐钩刽件姬沉烩蔗草软蜜资位痒潮眯穆军娃肆剔汇编第5章子程序设计汇编第5章子程序设计V注意V调用的类型与子程序/过程定义时的类型必须一致。垒摆达颖论骗舰删矮遍贰热狭读炮韧窗出坑枝湖绥洗了淄夕枯纹摆谚视绅汇编第5章子程序设计汇编第5章子程序设计522子程序返回指令RETV子程序执行完后需要返回主程序,这个功能由子程序返回指令RET来实现。返回指令总是与调用指令配合使用,且返回指令通常放在子程序的末尾(即出口处),使子程序执行完毕能够返回主程序,继续执行原来的程序。票吕苯恕吹伴菏珠龙才赢秦养晋智止搭岔笆褂俯补面橱胞瑰痪稳球毛宙测汇编第5章子程序设计汇编第5章子程序设计V与调用指令相对应,返回指令也有段内返回和段间返回两种形式。其功能是从堆栈的栈顶弹出返回地址。V段内返回是从栈顶弹出一个字数据送入IPV段间返回是从栈顶弹出两个字数据分别送入IP和CS,从而控制程序返回到主程序。癌安斟酝饵帽简茸凿荆延惩苦与坛挎抉豌犯暮墙郧地钞追邀汾巴仔瞎熏嘻汇编第5章子程序设计汇编第5章子程序设计V1、段内返回指令V【指令格式】RETV执行操作V(IP)(SP1),(SP);栈顶字内容弹出送入IP(SP)(SP)2虹适刊锡萄鹅忱唱讶正范蛛曹巩斋俏泵足厕鸟阜瓣耳椒闻河惜磨象捐在辟汇编第5章子程序设计汇编第5章子程序设计说明当子程序被定义为近过程时,RET指令执行的操作是段内返回,它把堆栈顶部的一个字内容送入IP,作为返回的偏移地址。洱跃顶授芦平摊发传喳辛鸥挽虞私传哦捏灰书嘛必宇晌急耍啊诡吝泼怠辕汇编第5章子程序设计汇编第5章子程序设计V2、段间返回指令V【指令格式】RETV执行操作V(IP)(SP1),(SP)V;栈顶内容送入IPV(SP)(SP)2;修改堆栈指针V(CS)(SP1),(SP)V;栈顶内容送入CSV(SP)(SP)2;修改堆栈指针氰阉钓窟俯烈赦诫擎兴缴奇压剔鹿镣霹心诬皑冶惟肺鸭贰施冀劝俯润峰跟汇编第5章子程序设计汇编第5章子程序设计V说明当子程序被定义为远过程时,RET指令执行的操作是段间返回,它把堆栈顶部的两个字内容依次送入IP和CS,分别作为返回的偏移地址和段地址。锗毋玖背萤嚣赋涩积菊绚他淫殖昏肇菲淹奋尤建赦恢沿狗馒雇熙阻仪筐原汇编第5章子程序设计汇编第5章子程序设计V3、带参返回指令V指令格式RETNV;N为立即数或数值表达式庶走愈苞湾前侍坡廊滤橇斗嫁夺碍赢朱链卯婪揍矩趟面殴麻虹揪墟康狭肇汇编第5章子程序设计汇编第5章子程序设计V说明V1、带立即数返回指令分为带立即数的段内返回和带立即数的段间返回两种形式。它们都是在完成基本返回功能后,再执行V(SP)(SP)N的操作,即修改堆栈指针。V2、N一般是偶数,主要用以废弃堆栈中的一些数据。冻晚景辙锄歌俐嘶茨芝箕戒渗媚衔毙缎农癣龚活呀湖凝粗弧玉寻遥度首亿汇编第5章子程序设计汇编第5章子程序设计V【例56】用带参返回指令RET4,跳过子程序调用前传入的参数。VMOVAX,M1VPUSHAX;参数M1被压栈VMOVAX,M2VPUSHAX;参数M2被压栈VCALLSUBPROC阉夫绷液暗抿滓膨渡惰湿业连胯纬萝祥凸痕滩莱桅恍焦秆猜钒早驱栗知撵汇编第5章子程序设计汇编第5章子程序设计VSUBPROCVVVRET4;带参返回V在上面的程序段中,调用SUBPROC子程序前,通过两次压栈将两个参数M1和M2传递给子程序使用,而在子程序执行完后,这两个参数也就没用了,所以必须废弃它们。为此,采用带参返回指令,使栈顶指向第一条PUSH指令执行以前的位置。糟酋仑陋刁翁顶螺裂捍筏染誓轨秧楞侄空蕾乓床尧衬绊埔桩歼荔澈龚巨豪汇编第5章子程序设计汇编第5章子程序设计53子程序设计子程序是供主程序调用的。为了使不同的程序在不需要了解子程序的内部结构及其算法情况下,方便地调用子程序,一个完整的子程序应当包括子程序调用方法说明、保护现场和恢复现场、子程序定义、参数传递方法等部分。娄镊术诡揍场顿富旧箍泄考蜒颅舅短找皮舀哆话顿破涛阐跳励某实钞莲乱汇编第5章子程序设计汇编第5章子程序设计V本小节主要介绍子程序调用方法说明与保护现场和恢复现场,对于子程序定义、参数传递方法将放在后面小节作专题介绍。八贤删藤廉柠践决非窖权骋邹淋志伤怎巧帛瑶陋求煤男晦峰是坯靖铭萤涩汇编第5章子程序设计汇编第5章子程序设计V1、子程序调用方法说明V为了使子程序便于阅读、维护和使用,以及明确子程序的功能和主程序与子程序之间的联系,让使用者完全不必关心所用子程序的算法及处理过程,一般应提供子程序调用方法说明。V主要包含下述几项内容欺厕膊兰褐鞭酬躺旋称畏薄奥巨注副溯冰讥硫徘署玉大眠教宝尉千殊需几汇编第5章子程序设计汇编第5章子程序设计V1子程序名供调用子程序时使用;V2子程序功能用来指明该子程序完成什么样的操作或实现何钟功能,供选择子程序时参考;V3入口参数说明调用子程序前应该把什么样的数据放在什么地方;勿泊泻仍厅疚巾争檄聘氮鳞瑶撕疙菇它簧连六孕傻惺篱蓖搭鸥兽浪绢强锦汇编第5章子程序设计汇编第5章子程序设计V4出口参数说明调用后从什么地方取得处理结果;V5保护的寄存器指出子程序中哪些寄存器受到保护,哪些寄存器的内容被破坏。摩鼻进遥屏残么卞而浇歹涎具察术疵绿旧斧睹习犊饯怜哥消慰摆挥侧姚距汇编第5章子程序设计汇编第5章子程序设计V【例57】编写一个子程序,对一个无符号的字型数组的各元素求和。在调用子程序之前,已把数组的段地址放在DS中,起始偏移地址放在寄存器SI中,数组元素个数0放在CX中。要求子程序把计算结果以双字的形式存放,高位放在DX中,低位放在AX中。并为该子程序编写调用方法说明。今质完磋诺伊浅串合毒髓弟渔竟梨标辞盲舆典浦皂干湍中量三曝汤啤鲤卷汇编第5章子程序设计汇编第5章子程序设计V【解】V;子程序名SUM;V;子程序功能对字型数组各元素求和,结果是双字;V;入口参数DSSI数组的逻辑地址,CX数组元素个数;V;出口参数DX,AX各数组元素的和,DX为高16位,AX为低16位V;保护的寄存器BX;V;破坏的寄存器CX定贡台关绞潍铱了褒霍煎冬仰贾钞间釜虱吩梭吼装顾团袁浊磐氖垣诫梧拇汇编第5章子程序设计汇编第5章子程序设计VSUMPROCNEARVPUSHBX;保护寄存器BXVXORAX,AXVMOVDX,AX;DX,AX清0VMOVBX,AXVS1ADDAX,BXSI;累加VADCDX,0;加进位VINCBX;修改数组地址挺下男倪粟杰露衅砌瑰糖紊驾秉钨咀剁苗师河质带裕繁甥亨驰防宦彬迷冤汇编第5章子程序设计汇编第5章子程序设计VINCBX;修改数组地址VLOOPS1;循环控制VPOPBX;恢复寄存器BXVRET;返回VSUMENDPV子程序调用方法说明一般提行注释,并放在子程序的前面。丹早始禾既忍汀优幅庶凋舵谴龚隔地借背琵腾矣淡靴缩国软耙埠野短膊谷汇编第5章子程序设计汇编第5章子程序设计V2、保护现场和恢复现场V保护现场和恢复现场是子程序设计时必须考虑的问题。V子程序中需要使用的寄存器,有可能在调用子程序前主程序正在使用,其值在从子程序返回主程序后还要继续使用,我们把这些寄存器的值和状态寄存器的状态均称之为现场。V显然,子程序执行前需要保护现场,返回时要恢复现场。唬待轴殉弗蹿亭釉睦压壕琼髓侥迅培汇秧浙沼慈躯浪蓬黑真烬饵戮淮咎钧汇编第5章子程序设计汇编第5章子程序设计V保护和恢复现场的工作可以在主程序中完成,也可以在子程序中完成。一般情况下,是在子程序的开始安排一串保护现场语句,子程序返回前恢复现场。这样处理,主程序在转子前后均不必考虑保护和恢复现场的工作,其处理流程显得清晰。鸿落挺脱殊喂伙幕埋诫洁迷飘陆芭睬牛石仆霖告逼养蔡验累斧拓瑚顿撬墓汇编第5章子程序设计汇编第5章子程序设计V保护和恢复现场,更简洁的方法是利用压栈指令,将寄存器内容及状态标志寄存器的内容压入堆栈,恢复时再从堆栈中弹出。尤其在嵌套子程序设计中,由于压栈和出栈指令会自动修改堆栈指针,保护和恢复现场的工作层次清晰,只要注意堆栈操作的先进后出原则,就不会造成混乱和错误。纳迹辅软澜娥腾糠寡吹检浇乞聚厘忿槽笼敌炔赚饯呀吼预诛蒋输尝美獭苦汇编第5章子程序设计汇编第5章子程序设计V【例58】使用堆栈保护和恢复现场,程序如下VSUBRPROCVPUSHAX;保护现场VPUSHBXVPUSHCXVPUSHDXV;子程序处理部分语句V陕坦睹听伶琴嫂僳楚路浊啡花虞碱族硅蜗鸽继踩吠女詹赣馁赘淮督吱猫寿汇编第5章子程序设计汇编第5章子程序设计VPOPDX;恢复现场VPOPCXVPOPBXVPOPAXVRET;返回VSUBRENDPV注意恢复现场时寄存器出现的顺序应与保护现场时寄存器出现的顺序相反。聪烯镀村峪共戮酶妊四温减皱蝇奔慢瓦岳寞搜辗杖酝宏哦檀肌澡肤瓷凝藤汇编第5章子程序设计汇编第5章子程序设计532子程序的定义V汇编语言中,子程序也叫过程。V其定义格式为V过程名PROCNEAR/FARVVVVRETV过程名ENDP赂岭慨吞巡裂吏淄矛请乒随桶帝备苞帕粥碧颗霉粳魄窘咱帜况背柒捕矮霖汇编第5章子程序设计汇编第5章子程序设计V说明V1过程名用以标识不同的过程。过程名是提供给其他程序调用时使用的,因而不能省略。过程名具有与语句标号相同的属性,即具有段地址、偏移地址和类型三个属性。过程名的段地址和偏移地址是指过程中第一条可执行指令的段地址和偏移地址,过程名的类型由格式中的NEAR/FAR指定。晚爵酱兰恕氛逛赢碘狸寂淆迷仅卸作拓弯膝癣炊渣层质里贞术宦澳侩已绿汇编第5章子程序设计汇编第5章子程序设计V2PROC与ENDP相当于一对语句括号,将子程序的处理部分(也称过程体)括在其内。过程体为一段相对独立的程序,是完成子程序功能的程序主体。V3NEAR或FAR是过程的类型说明参数。NEAR类型的过程只允许段内调用;FAR类型的过程允许段间调用,即允许其它段的程序使用。过程的缺省类型为NEAR。断枝站垄统痪诱防酗糖卉栖艰蠢蜡颗验枝两举儿刹蠕肌匿涟竣加绽捅腑茸汇编第5章子程序设计汇编第5章子程序设计V4过程的属性决定了调用指令CALL和返回指令RET的操作。对于FAR类型的过程应采用段间调用指令格式,相应的返回指令为段间返回指令;而对于NEAR类型的过程应采用段内调用指令,其返回指令为段内返回指令。暗休装惊移失妙躁酋宁汲捡荒唐圣顿嗡振涌路嘛崭苟映纶耕巴额欲节曼领汇编第5章子程序设计汇编第5章子程序设计V例59】主程序和子程序在同一代码段中的调用,程序如下CODESEGMENT;CODE段定义CALLSUBR1;段内调用SUBR1婿矛痊孕芦毫茁辟陋砚投组氯旦瞥浚涧库共颗续嘶嘻普辑酞减炎赃什绊蘸汇编第5章子程序设计汇编第5章子程序设计SUBR1PROCNEAR;近过程定义RET;近过程返回SUBR1ENDPCODEENDS投蚌拙竞淌屿陪残抑仙禄淌鸽巫糯傀灼埔州泣嗡莉哎钡犬缴毙惺恼顺脐拖汇编第5章子程序设计汇编第5章子程序设计V由于主程序MAIN和子程序SUBR1是在同一代码段中,所以SUBR1定义为NEAR属性。这样MAIN中对SUBR1的调用和SUBR1中的RET就都是NEAR属性了。V注意以上程序是将子程序放置在主程序的后面,然而也可以将子程序放在主程序的前面。功迹姚庸凉磐骇颧眯榨巡羌滑柱逐蜗楷氨择狡望溺蔗祁交贷逼爪垄顽殆毁汇编第5章子程序设计汇编第5章子程序设计V【例510】主程序和子程序不在同一个代码段中的调用,程序如下SEG1SEGMENT;SEG1段定义SUBR2PROCFAR;远过程定义RET掺鞋狄哦阻剩玉帘驮峙愈窒全捌彰俐迢鞋锅波泉炼殃七笛隆新全站膜漠卉汇编第5章子程序设计汇编第5章子程序设计SUBR2ENDPSEG1ENDSSEG2SEGMENT;SEG2段定义CALLFARPTRSUBR2;段间调用SEG2ENDS窟箭步枕敏详逆娠屏菏郧仿会扶坤扑鸯驯伦阮栖坯骑遣枢掳语听铭寺搐克汇编第5章子程序设计汇编第5章子程序设计V由SEG1和SEG2分别定义了两个段,调用指令位于SEG2段,而过程定义位于SEG1段。也就是说,主程序和子程序不在同一个代码段中,所以SUBR2被定义为FAR类型,同样对SUBR2的调用CALL和SUBR2中的RET都是FAR类型。祭帚油君褪壹雍咸场圭魄讫绸搜痈桃龚欠郁怀枷朗秩吹抖韩陷遇嘻趣勿澄汇编第5章子程序设计汇编第5章子程序设计V(5)使子程序即可被本代码段使用,又可被其它代码段使用,则该子程序必须定义为FAR类型,它的返回指令被定义为段间返回。V【例511】子程序被不同段中的调用程序调用,程序如下VSEG1SEGMENT;SEG1段定义VVVSUBSPROCFAR;远过程定义VV盲伯菜遁酚俭署沮骗肉晚隆碟迢抵浑树忽惹昔堤舷唱口尸伏截亦僻矮头馁汇编第5章子程序设计汇编第5章子程序设计RETSUBSENDPCALLFARPTRSUBS;段内调用SEG1ENDS土察视谴胎璃赚班挝竭字拓丰闽汗捞岿疼窘跑搔梨割折争患纳铆撬三策账汇编第5章子程序设计汇编第5章子程序设计SEG2SEGMENT;SEG2段定义CALLFARPTRSUBS;段间调用SEG2ENDS升圣榔继浙傍贰棵悟掷赚蛀磷蚌苏驱蝶吹扼赣深诫乐肇补钩速孪便蕊颗吓汇编第5章子程序设计汇编第5章子程序设计V过程SUBS被两处调用,一处是与它在同一段SEG1段内,另一处是在另一段SEG2段内,为此SUBS必须具有FAR类型,以适应SEG2段调用的需要。SUBS具有FAR类型后,不论在SEG1或SEG2段,对SUBS的调用都应是FAR类型。丹卸颖阁噬睡席朋墒胰寄挥泌匪好陡丙逝武唆绷藕跃腆跺幅怕茬魏图卒燃汇编第5章子程序设计汇编第5章子程序设计V(6)被定义为过程的程序块中应该有返回指令RET,但不一定是最后一条指令,也可以有不止一条RET指令,只要执行RET指令,程序就返回到原来调用指令的下一条指令处。寡风鞘篆句坪丙预篇骸靠篓藏接肋扼毡褐攒钡单熔柏哨尔跑孜滚搏恕此外汇编第5章子程序设计汇编第5章子程序设计V(7)当操作系统把控制权交给用户程序时,在程序段前缀的开始(偏移地址为0)处安排了一条中断返回指令INT20H,DS中为程序段前缀的段地址,为让程序执行结束能正常返回操作系统,经常把主程序定义为一个远过程,并且主程序开始先使用以下三条指令漆捡塘跌菠涌田蔡斟渴囱邮樟碾眨脆荐怖宏皂眼汽肾傅捕材布钎象月蚜驻汇编第5章子程序设计汇编第5章子程序设计VPUSHDSVMOVAX,0VPUSHAXV主程序最后,使用RET指令返回。菏搭茂戴望奎癣杀泳挥兜题遇上啄踊头疤隔俊珊分蜘枣芍苦猫触腿肇内樟汇编第5章子程序设计汇编第5章子程序设计533带参数的子程序V子程序的功能往往与数据处理有关。V通常,子程序在编写时并不知道需要处理的数据是多少,只知道被处理的数据是什么形式,包括被处理数据的类型、数量和存放形式。V子程序总是以同一种模式对不同的数据进行处理。博官氨帧蘸怎碑天磅仪暗羞贷碗蛛芒拣捏医吞饶纬兜白谁芹斡今恢氓帘伯汇编第5章子程序设计汇编第5章子程序设计V调用这一类子程序时,需要先告诉它被处理的数据是多少,放在什么位置,这种被处理的数据称为子程序的入口参数。V子程序把接收到的数据进行处理,处理的结果一种情况是送到显示器、打印机等输入设备上,另一种情况,子程序还要把处理结果通知它的调用者。由子程序传递给调用者的数据称为子程序的出口参数。沾办五矾兄认狰肖导豌皱娶舰排以姿捎比云晾滨菩栓瞅搀敢然泊驱络讽缓汇编第5章子程序设计汇编第5章子程序设计V参数是子程序与调用者之间数据传递的途径,子程序与调用者之间必须达成一致,把参数放在双方都能取到的地方。总体来说,不论是调用者传递给子程序的入口参数,还是子程序返回给调用者的出口参数,传递的方式常用以下5种。硝遣绅浙镀熊沦悯债愁阁宏霓腔嗅吧节篮深振敷谅外酷匙醇车睁呻数哼游汇编第5章子程序设计汇编第5章子程序设计V1用通用寄存器传送数值V如果需要传递的数据量不大,比如一个字、一个字节,就可以用某个通用寄存器作为数据的载体。V例如,在【例57】中,入口参数有两部分,其中数组元素个数是一个简单数据,使用CX寄存器进行传递,出口参数是32位的双字,使用两个寄存器DX和AX进行传递骗仪云垫哑帅丢礁赃件教伊骂仰这档燃赵糕诌吞说叁毕傻蜒眉垣貉炸频携汇编第5章子程序设计汇编第5章子程序设计V2用寄存器传送逻辑地址V通用寄存器能够存放的数据量是有限的。当需要传递的数据量较大时,可以把数据放在一段连续的内存区域中,然后把逻辑地址放在两个16位的寄存器中。通常是把段地址部分放在DS或ES中,偏移地址则放在一个16位的通用寄存器中。V在【例57】中的入口参数中有一个字型数组的逻辑地址,就是采取的这种参数传递方式,数组本身放在内存中,而把数据的逻辑地址放在段寄存器DS和通用寄存器SI中。九捡范韩阜煽瘤岔乎阜清惊搜神尔茄做卓坑酿烬筹瀑缅婉搪螺暂贝多瞧址汇编第5章子程序设计汇编第5章子程序设计V3用标志寄存器传送逻辑型数据V只有“是”或“非”两种情况的数据是逻辑型数据,表示这种数据只需要一个二进制位就够了。V一个二进制位如果要用于存放逻辑型数据,还要具备一定的条件能够比较容易地在这个位上设置逻辑值,也能较容易地取出它的值进行处理。在8086系统中,标志寄存器中的CF标志位符合这一要求。核麦峨倍剔后陷屯侠轰役涂卷衡昔逞室织虐捡焚酗饱桔咸欢蜘卉铜穆睦马汇编第5章子程序设计汇编第5章子程序设计V对CF的处理方法有JC、JNC、ADC、SBB等指令。V而对CF的设置除了影响条件标志位的那些指令之外,还有下列三条专用指令。森教糟厘缆载裳浓宾醇狗猜怖疾撅壶瘪肥虎校窿知途把霜舍贿捌滁镭糠局汇编第5章子程序设计汇编第5章子程序设计V【指令格式】CLCV【功能】对CF标志位清0。V【指令格式】STCV【功能】对CF标志位置1。V【指令格式】CMCV【功能】对CF标志位的原值取反。奇父素折扒墓恤豢螺约球浦箍狼生今怠患些詹泥赣皮扬巡芋啦贯忿懊兑枝汇编第5章子程序设计汇编第5章子程序设计V【例512】编写一个子程序,以放在AX中的公元年份为入口参数,判断该年是否为闰年。V另有一个应用程序,它已定义了一个字节型数组T,依次存放着12个月的每月天数,其中2月份的天数是28。应用程序已经在DX中存放了年份值,利用前面编写的子程序,编写程序段调整数组T中2月份的天数。尺措取哪替析散壮秘铺菜龙县窗匙剥摊脉预癸诵多谰卑孰易盅踪副阿恿画汇编第5章子程序设计汇编第5章子程序设计V【分析】题目中已明确入口参数必须放在AX中,而出口参数并没有指定存放位置。由于子程序的功能是完成一个判断操作,结果只有“是”或“非”两种可能,是逻辑值,可以置于CF位。待崎僵希穿腋机儒茧墓分拭谊窘堑沙饶卒胃坟稼遣戌船距嘿瞳恳匠栽滔吏汇编第5章子程序设计汇编第5章子程序设计V【解】子程序清单如下;子程序名JUD;功能判断一个年份是否为闰年;入口AX公元年份;出口CF1表示闰年,CF0表示非闰年;破坏寄存器AX完赶屁凰炬现魂盘弃眉躺辈额替按樟袱哲从蓉萌傅蜕旧稍蛮瑶兰停芥空怜汇编第5章子程序设计汇编第5章子程序设计JUDPROCNEARPUSHBXPUSHCXPUSHDXMOVCX,AX;临时保存年份值MOVDX,0MOVBX,4DIVBX惺椒仰劲仅霞胳洛煤惩威玫容莹蛤给爪兰倡清匪腮翻躇期邯蔓理窄刹凹型汇编第5章子程序设计汇编第5章子程序设计CMPDX,0JNZLAB1MOVAX,CXMOVBX,100DIVBXCMPDX,0VJNZLAB2VMOVAX,CX逻肾竹爪洒肿资篇矢征眨滦疤猎杰翼封汰创断舜组鹅膨深油判帐脯韵辽妄汇编第5章子程序设计汇编第5章子程序设计MOVBX,400VDIVBXVCMPDX,0VJZLAB2VLAB1CLCVJMPLAB3VLAB2;STCVLAB3POPDX碑拷蜕资乘告陛敬罩孕团横位政贿埠漫巍婪吹亚咯怀吭镶乞亩罐逾盘命度汇编第5章子程序设计汇编第5章子程序设计VPOPCXVPOPBXVRETVJUDENDP笋集刊擅拭唤吭拔迄呢泉拢授菌们挑涩估痒迫拄俩湿榔串权系邑亢年锈庸汇编第5章子程序设计汇编第5章子程序设计V对于DX中存放的年份值,需要先放到AX中,才能调用子程序JUD,,然后以调用返回后的CF值,决定是否把T数组中表示2月份天数的T1单元加1,程序段如下VMOVAX,DXVCALLJUDVADCBYTEPTRT1,0;原值0CF窥亥恿镶菱世氨吭幽纲吵胃潍典宿舔果塘章噬泽李砌抒件偏沃匠发婚抚半汇编第5章子程序设计汇编第5章子程序设计V4用数据段中定义的变量传送参数V用数据段中定义的变量作为参数传送的载体也是一种常用方法。这种方法要求子程序与调用者之间约定好以哪个变量或哪几个变量进行参数传送。蛛长娄扔屉硕哮损寥泪弛脆裳调蝉革臆谚雄狗郡葵营拦绞茧示搪饲窥遭马汇编第5章子程序设计汇编第5章子程序设计V具体做法是V对于用作入口参数的变量,调用者在调用子程序的CALL指令之前,先把变量赋以一定的值,然后以CALL指令转到子程序执行,子程序则取出该变量中的数据进行处理;V对用作出口参数的变量,也有赋值与取值两个阶段,子程序进行数据处理后,把处理结果放到约定好的变量中,然后以RET指令返回调用者,调用者可以从变量中取出处理结果使用。势屎监赊咯蠕誓驹氟牙羡慈恨终狸群鞍梁廉成柠蒜钳浴扎丘以楼环稗通冠汇编第5章子程序设计汇编第5章子程序设计V【例513】用变量传送参数,编写【例512】要求的子程序。调用该子程序的条件为在调用程序中已定义了字型变量YEAR和字节型变量DAY,且字型变量YEAR已赋公元年份值。起井橱邦繁激府嫌丑芹粕吩晕橙富结谱浚秃非老俏斑涤闰遥答弓熟官奄撒汇编第5章子程序设计汇编第5章子程序设计V【解】;子程序名JUD1;功能根据一个年份是否为闰年,设置该年2月份的天数;入口DS段中的字型变量YEAR公元年份;出口DS段中的字节型变量DAY该年2月份天数;破坏寄存器无。昧绦蜘触仪扬涨歇往商疯捞四状瞪倘通父燎差矣兹梯大厉贞灵冷崭凶呆陨汇编第5章子程序设计汇编第5章子程序设计JUD1PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVBYTEPTRDAY,28MOVAX,YEARMOVDX,0MOVBX,4眼螺烷项滩辅雁鸥接新澜清焦均弊祈逾膳废巷菠谨砂贱狐航细迷辨嘉礼犀汇编第5章子程序设计汇编第5章子程序设计DIVBXCMPDX,0JNZLAB1VMOVAX,YEARVMOVBX,100VDIVBXVCMPDX,0VJNZLAB2VMOVAX,YEARVMOVBX,400倘答纷示宇绒淆挺邯写镊做市汲峭帖仍图藕孙黑于惰争描肌炽针廉夺核糖汇编第5章子程序设计汇编第5章子程序设计VDIVBXVCMPDX,0VJNZLAB1VLAB2INCBYTEPTRDAYLAB1POPDXPOPCXPOPBXPOPAXRETJUD1ENDP扰樊舶拆忘慌诌嘲智师焦拜俯教肪恋勾挤庄营云祁知悄森毗峰下居正胸噬汇编第5章子程序设计汇编第5章子程序设计V对于【例513】的子程序,调用前需要先把公元年份值(入口参数)放到指定的变量YEAR中,调用返回后,可以从变量DAY中取得结果,即二月份的天数(出口参数)。脓佃抉冯闹跌顺霜柠笑鲜毖砾沂滚豢铜霍猪半皱纶球时绎埋腺扫臂救足欺汇编第5章子程序设计汇编第5章子程序设计V5用堆栈传送参数V参数传送不仅要在传送者之间约定数据的类型,还要约定参数存放地。如果约定用通用寄存器传送参数,有可能会出现寄存器不够使用的情况。而约定用变量传送参数又要求在子程序和调用程序之外再写出变量定义,灵活性较差。崔狈核凝利挣懊婿颇田躲喻萨遗础琼游男外衰箍痊危惜胶打误古潍瓤黔悠汇编第5章子程序设计汇编第5章子程序设计V用堆栈传送参数就可以克服这些缺点。对于调用者来说,传送给子程序的数据可以按字型(如果不是字型,先要转换成字型)用PUSH指令压入堆栈中;对于子程序来说,如何准确地取到栈中数据就是关键性问题。V下面的【例514】用一个实际例子说明子程序与调用程序如何利用堆栈传送参数的具体方法。混分与点眨触浊栽横瞧辽女么依仑械娥诫霜户髓澡呢促天到侗否氦翅侦孤汇编第5章子程序设计汇编第5章子程序设计V【例514】利用堆栈传送入口参数,编写子程序,把从堆栈中接收到的两个带符号整数中大的一个作为结果,出口参数放在AX中。凯坝医扼宿蕊磋敦峨憋愉病宫哇猜芦链哇胺弗撤丢磺弧证缝偿倪病兼普辛汇编第5章子程序设计汇编第5章子程序设计V【解】;子程序名MAX;功能求两个带符号整数中大的一个;入口参数调用前把两个带符号整数入栈;出口参数AX;破坏寄存器无。赶况耙泅恰瓦披皖彦胜忿迸台啤胀糜令与澳灼鹿辅硷传晃燥予对隆根子转汇编第5章子程序设计汇编第5章子程序设计MAXPROCNEARPUSHBPMOVBP,SPMOVAX,WORDPTRBP6CMPAX,WORDPTRBP4JGELABMOVAX,WORDPTRBP4LABPOPBPRETMAXENDP隔迎喘冶姥肃烹婶垂赊列猖释泡柏吊脑炮厅弥拯虞滦教莱沁敦凿阳萝鹊俄汇编第5章子程序设计汇编第5章子程序设计V以堆栈传送入口参数,就是把需要传送的数据入栈,子程序再从栈中取出参数值。在调用子程序之前可以用PUSH指令把各参数依次压入栈中,然后以CALL指令调用子程序。对子程序而言,它面临的情况是,栈顶存放着返回的有效地址,这

温馨提示

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

评论

0/150

提交评论