课件1675.1汇编语言源程序的框架结构

上传人:功*** 文档编号:242756105 上传时间:2024-09-02 格式:PPT 页数:67 大小:382KB
返回 下载 相关 举报
课件1675.1汇编语言源程序的框架结构_第1页
第1页 / 共67页
课件1675.1汇编语言源程序的框架结构_第2页
第2页 / 共67页
课件1675.1汇编语言源程序的框架结构_第3页
第3页 / 共67页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,5.1,汇编语言源程序的框架结构,编制汇编语言源程序时,首先要使用段定义伪指令和段寻址伪指令来构造一个由若干指令和数据组成的程序。构造一个源程序的框架结构有如下两种格式:,第一种格式:,MOVAH,4CH,;返回,DOS,INT21H,CODEENDS,ENDBEGIN,第,5,章,8086/8088,汇编语言程序设计,崇精陀钟狰僳条击熬摄塘友青了惺馋嘘翘屎应竿却痰郸涸劈酱肩茵脓葱滔,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,第二种格式:,RET,;取程序段前缀首地址,MAINENDP,CODEENDS,ENDBEGIN,区别:两种格式的本质区别在于返回,DOS,的方法不同:,对于第一种格式,,采用了调用,DOS,系统的,4CH,功能,返回,DOS,。具体方法是:在要返回,DOS,处,安排如下两条指令:,MOVAH,4CH,INT21H,对于第二格式,,DOS,返回方法是调用,20H,类型的中断服务程序。,谊续碱哄镭姆袜下琶泛元期嘛琼惋这同靳莱蜕浑盆帅安辈逆妓情复挛股渍,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.2,顺序结构程序设计,顺序程序结构是指完全按照顺序逐条执行的指令序列,这种结构的流程图除了有一个开始框和结束框外,就是若干处理框,没有判断框,如图,5.1,所示。,图,5.1,顺序程序的结构形式,身觅津樟辱肢旗云星卧嫉考胖檀秃格喧呆侨巡拱丛锰盖沪隧适蝗啦查垫嚷,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,例,5.1,:,试分别用汇编语言源程序的两种框架结构编制程序,求出表达式:,(X4,Y,),/2,的值,并保存到,RESULT,存储单元中,其中,X,,,Y,均为字节变量,。,解:完成该功能的流程图,如图,5.2,所示:,图,5.2,例,5.1,的功能实现流程图,偏假耍信曝籍达楔窘赃桥访算缕鲸毕盆琢钝凸夯酣淡甲魁里漾伪扎札魄蔽,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序,1:,DATASEGMENT,;数据段,XDB2,YDB4,ZDB?,;定义变量,DATAENDS,STACKSEGMENT PARASTACK,DW20HDUP,(,0,),STACKENDS,CODESEGMENT,;代码段,ASSUME CS:CODE,DS:DATA,SS:STACK,彭抢沂真寝澜但乖矿懊蚀寿组麓嚏孙鸿啪琵网侧喊潘膘堂青窟欣叠饯揍鳖,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,BEGIN,:,MOVAX,,,DATA,MOVDS,,,AX,;,DS,赋初值,MOVAL,,,X,;,ALX,MOVCL,,,2,SAL,AL,,,CL,;,ALX4,SUBAL,,,Y,;,ALX4,Y,SARAL,,,1,;,AL(X4,Y)/2,MOVZ,,,AL,;存结果,MOVAH,,,4CH,;返回,DOS,INT21H,CODEENDS,ENDBEGIN,肿裁趋捌订件招苍无每盯磷粘队舍绽缮跟类鸽境沤绢枯针豪广所低琅瓮翁,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序,2:,DATASEGMENT,XDB2,YDB4,ZDB?,DATAENDS,STACKSEGMENTPARASTACK,DW20HDUP,(,0,),STACKENDS,CODESEGMENT,ASSUMECS:CODE,DS:DATA,SS:STACK,PROC1PROCFAR,;使,RET,为远返回,ENDBEGIN,迭狙猾氮菱助铆宫醒瑞蕾戴魏续癸濒力杜麦卷拾佑弯痢辜欠姻庇沂巍坏亿,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,BEGIN:PUSHDS,;入栈保存地址,MOVAX,,,0,;程序段前缀的首地址,PUSHAX,MOVAX,,,DATA,MOVDS,,,AX,MOV,AL,,,X,;,ALX,MOVCL,,,2,SALAL,,,CL,;,ALX4,SUBAL,,,Y,;,ALX4,Y,SARAL,,,1,;,AL(X4,Y)/2,MOVZ,,,AL,;存结果,RET,;取程序段前缀首地址,狮纳逐树峨犯陶筏秧塌龟币佰摹盗氖技疫涪逼蛇厂屉丫轰肺捧倔饼缆竭响,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,PROC1ENDP,CODEENDS,5.3,分支结构程序设计,分支程序结构可以有两种形式,如图,5.4,所示,它们分别相当于高级语言程序中的,IF-THEN-ELSE,语句和,CASE,语句,它们适用于要根据不同条件做不同处理的情况。,昏杖搜秧匣阶他卸铣颓叮匀政鹊揉阐一消仪如用烁崎法凡骗耘筛已勉淤斧,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.3.1,用比较,/,测试的方法实现,IF-THEN-ELSE,结构,实现方法:在产生分支之前,通常用比较、测试的办法在标志寄存器中设置相应的标志位,然后再选用适当的条件转移指令,以实现不同情况的分支转移。,(,1,)进行比较,使用比较指令:,CMPDEST,,,SRC,该指令进行减法操作,而不保存结果,只设置标志位。,(,2,)进行测试,使用测试指令,TESTDEST,,,SRC,该指令进行逻辑与操作,而不保存结果,只设置标志位。,嘎倘佛九驱撵睫询杏比殆蔽捎绰增壹敦钡茶钥斜砒绎猿世恿齐坠级屋汀锣,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.3.2,用地址表法实现,CASE,结构(即多路分支),用地址表法实现,CASE,结构的基本思路是:将各分支程序的入口地址依次罗列形成一个地址表,让,BX,指向地址表的首地址,从键盘接收或其他方式获取要转到的分支号,再让,BX,与分支号进行运算,使,BX,指向对应分支入口地址,最后即可使用,JMP WORD PTR BX,或,JMP DWORD PTR BX,指令实现所要转到的分支;程序设计流程图如,图,5.6,所示:,炊涉绍长射蛆揩软洒俗把兔晴羽追琼腆修繁皮厚甜乏映鳃鳖剪授没刁透蹦,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,图,5.6,用地址表法实现多路分支的结构框图,例,5.4:,编程实现菜单选择,根据不同的选择做不同的事情。,解:假设有,3,路分支,在地址表中的入口地址分别:,A0,、,A1,、,A2,;具体见图,5.7,所示:,店寡见缮巨桨畜酚意工歌妙赋饿扁弧欣糖衙愚假眠葡雄促挨啊睹黄猾绣哭,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序:,DATASEGMENT,MENUDB0DH,0AH,0:Chinese!,DB0DH,0AH,1:English!,DB0DH,0AH,2: German!,DB0DH,0AH,Please choose one to answer the following question:$,ERDB 0DH,0AH,I am sorry,you choose the mistake!$,究就惰绦凶疼活哄坑惺斯阻仿瞪查奄疙挤道吕酉干灰蔡抵突喳蜘秸混苫沥,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,S0DB0DH,0AH,OK,Please answer in Chinese!$,S1DB0DH,0AH,OK,Please answer in English!$,S2DB0DH,0AH,OK,Please answer in German!$,TAB,DWA0,A1,A2,;地址表,DATAENDS,CODESEGMENT,ASSUMECS:CODE,DS:DATA,START:MOV,AX,DATA,MOVDS,AX,LEADX,MENU,;显示菜单,MOVAH,9,INT21H,同劳模钎餐懦闭妮贿幌闭烁讯灾边速膊吮促知粥杆篱标草狞佐妆帘然担扒,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,MOVAH,1,;,1,号,DOS,功能调用,接收分支号,INT21H,CMPAL,0,;进行合法判断,JB,ERROR,CMPAL,2,JAERROR,LEABX,TAB,;取地址表首址,SUBAL,30H,SHLAL,1,;段内转移乘以,2,,段间转移乘以,4,XORAH,AH,;,AH,清零,ADDBX,AX,JMPWORD PTR BX,;产生多分支转移,矽雕依裴滩琶径学番钠跺痊费网总柞遂颂刹凿达红累训皆础馁亥舰柿琴踏,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,A0:LEADX,S0,;各分支程序段,MOVAH,9,INT21H,JMPEXIT1,A1:,LEADX,S1,MOVAH,9,INT21H,JMPEXIT1,A2:LEADX,S2,MOVAH,9,INT21H,JMPEXIT1,缸苏琶窿胳痪蚂讨搜巧泣哩跑弟闹葱刀穷蘸墅传锈践且缉狮昂梅第蚌轨密,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,ERROR:MOVDX,OFFSET ER,MOVAH,9,INT21H,EXIT1:MOVAH,4CH,;返回,DOS,INT21H,CODEENDS,ENDSTART,5.3.3,用转移表法实现,CASE,结构(即多路分支),用转移表法实现,CASE,结构的基本思路:将转到各分支程序的转移指令依次罗列形成一个转移表,让,BX,指向转移表的首地址,从键盘接收或其他方式获取要转到的分支号,再让,BX,与分支号进行运算,使,BX,指向对应转移表中转到该分支的转移指令处,最后即可使用,JMP BX,指令实现所要转到的分支;具体见,图,5.8,所示:,岁贩隔汕臆妓剁钨糙饺预鸟兔司鸿途砂把土既粮姑郑才亚役忙梯豢蔑防旦,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,图,5.8,用转移表法实现多路分支的结构框图,例,5.5:,编程实现菜单选择,根据不同的选择做不同的事情。,解:假设有,3,路分支,转移表中的转移指令分别为:,JMP SHORT A0,、,JMP SHORT A1,、,JMP SHORT A2,;具体见,图,5.9,所示:,印小透意祸诌协凿冀埋荧炎撩谷椅斧抄满甫韶瓢街肠旬篱鹏壹冯斗颇吧鸯,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序:,DATASEGMENT,MENUDB0DH,0AH,0:Chinese!,DB0DH,0AH,1:English!,DB0DH,0AH,2: German!,DB,0DH,0AH,Please choose one to answer the following question:$,笋漆竖母属兼喂门弄砖绽红蔗宵煤片家佣卯峦杭裹咨磅桶仰羚衣辱妄队湍,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,ER DB 0DH,0AH,I am sorry,you shoose the mistake!$,S0DB0DH,0AH,OK,Please answer in Chinese!$,S1DB0DH,0AH,OK,Please answer in English!$,S2DB,0DH,0AH,OK,Please answer in German!$,DATAENDS,CODESEGMENT,ASSUMECS:CODE,DS,:DATA,START:MOVAX,DATA,MOVDS,AX,LEADX,MENU,;显示菜单,MOVAH,9,INT21H,疾栏抗耘梢艳椿型鼠咐吝俗室慑牢诲硼薯遍奈菏祸源嚎蘸技记蛰蔑邱杀篆,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,MOVAH,1,;,1,号,DOS,功能调用,接收分支号,INT21H,CMPAL,0,JBERROR,CMP,AL,2,JAERROR,LEABX,TAB,;取地址表首址,SUBAL,30H,SHLAL,1,;短转移乘以,2,,近转移乘以,3,,远转移乘以,5,XORAH,AH,;,AH,清零,ADDBX,AX,躬锤取刘炬楚筷仕唤檄丁垃寓即愤舀颅隧场铁讶罩晋轰翻瓶礼状她劫硕题,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,JMPBX,;产生多分支转移,TAB:JMPSHORTA0,;转移表,JMPSHORTA1,JMPSHORTA2,A0,:LEADX,S0,;各分支程序段,MOVAH,9,INT,21H,JMPEXIT1,A1:LEADX,S1,MOVAH,9,INT21H,疽比苑戈威谓殴喳氧回狙葡峙侄忆英杖呐凹致渝相袱寇前霸等佯衷乱积寓,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,JMPEXIT1,A2:LEADX,S2,MOVAH,9,INT21H,JMPEXIT1,ERROR:MOVDX,OFFSET ER,MOVAH,9,INT21H,EXIT1:MOVAH,4CH,;返回,DOS,INT21H,CODEENDS,ENDSTART,誉殴答净阮荤仇消钨哎秤素端氮诗嘿谭肆馈壤渭讨贫叼纺穴高攘践摧坦认,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.4,循环结构程序设计,5.4.1,循环程序的组成,1.,设置循环的初始状态,如置,循环次数的计数值,以及为循环体正常工作的初始状态等;,2.,循环体,这是循环的工作主体,它由循环的工作部分及修改部分组成。,3.,循环控制部分,它是循环程序设计的关键,每一个循环程序必须选择一个循环控制条件来控制循环的运行和结束,通常有两种方法控制循环:用计数控制循环,用条件控制循环,柒憋凳畦纵浑蝎摈技曰槐郡闪碧喳裳硕膀肪绥学骋快懦员饺玖概肌鸽廓尧,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.4.2,循环程序的结构形式,循环程序有两种结构,一种是,DO-WHILE,结构形式,另一种是,DO-UNTIL,结构,形式。具体见图,5.10,所示:,DO-WHILE,结构把对循环控制条件的判断放在循环的入口,先判断条件,满足条件就执行循环体,否则退出循环。,DO-UNTIL,结构是先执行循环体然后再判断控制条件,不满足条件则继续执行循环操作,一旦满足条件则退出循环。一般讲,如果循环次数等于,0,的可能,则应选择,DO-WHILE,结构,否则用,DO-UNTIL,结构。,图,5.10,循环程序的结构形式,遍醋幢威钳鲁瞅暑酗佩鹊独佰票歹藉辅泌所虫亮谐英际灸自怒匡汝仆日鱼,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.4.3,循环控制的方法,1.,用计数控制循环,这种方法直观、方便,易于程序设计。只要在编制程序时,循环,次数已知,就可以使用这种方法设计循环程序。然而更多的循环程序,在编制,程序时并不能确切知道循环次数,但是知道循环次数是前面运算或操作的结果或者被存放在某内存单元中。,例,5.6,:,试编制程序统计字节变量,VAR,中,1,的个数,并将它存入,COUNT,单元中。,解:要测试出,VAR,中,1,的个数就应该逐位进行测试,可根据最低位是否为,1,来计数,然后用移位的办法把各位数逐次移到最低位去,共需要测试,8,次。程序流程如,图,5.11,所示:,绣住郡刁晚缓利窿棘绣蚤法溯蚌聚大芦堪苯笨躬焰熏凛街断童膝碰兼倍墨,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,图,5.11,例,5.6,的功能实现流程图,饲屑腔症蚕庙帐拐嘎庆萝到嚼痊准弧卿彩籍播拳栏墅椽绥裴抒搔恍址署遍,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序:,DATASEGMENT,VARDB 37H,COUNTDB ?,DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,BEGIN:MOVAX,DATA,MOV DS,AX,MOVAL,VAR,;,ALVAR,的值,MOVCX,8,;赋循环初值,XORBL,BL,;赋计数器初值,肝复侩骇灰防阁擅秆炼钨觉猖峨奉跨崔北亡挑锰楷木亚邑爱漓字悼灯商犹,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,LL:TESTAL,1,;测试,AL,的最低位,JZLL1,;最低位为,0,转,LL1,INCBL,;计数器加,1,LL1:,SHRAL,1,;逻辑右移,1,位,LOOPLL,;循环控制,MOVCOUNT,BL,;,COUNT,计数器,BL,的值,MOVAH,4CH,;返回,DOS,INT21H,CODEENDS,ENDBEGIN,凳乖淹染性途阜胯电肇懈浇适比尉氦器爪臣婆肘津侧眶漳贵偶属带悠脸畔,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,2.,用条件控制循环,例,5.8,:,将正整数,NUM,插入到一个从小到大排列好顺序的正整数字节数组序列中。,分析:,假设该数组的首地址和末地址分别为,ARRAY_HEAD,、,ARRAY_END,,显然在这里需要插入的是一个数,所以不一定要扫描,整个数组。同时为了插入这个数据,必须要空出位置,即凡是比它大的数据都应该向地址增大的方向移动一个字节,故应该从数组的尾部向头部查找,可逐字节取出比较。值得注意的是,应该考虑正整数,NUM,大于或小于数组中的所有数的可能,即如果,NUM,大于数组中所有数,则第一次比较就可以结束查找;如果,NUM,小于数组,中所有数,则必须及时结束查找,绝对不允许查找的范围超出数组的首地址,当然可以把数组的首地址或循环次数作为结束查找的条件。根据上述分析,可以得出程序流程如,图,5.13,所示:,烩图豪蜀吩泉酝过悲门材暮憨织辣珠娥敲摘少唐听苏棕琐交摊丽吠卑狙窿,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,图,5.13,例,5.8,的功能实现流程图,丘乍域铲聂肃艘氢纯孪燕猖类诽餐共浙匡弱惋仪雾骆皋永饱产恩晰识素窑,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,参考程序:,NUMEQU36H,DATASEGMENT,ARRAYDB12H,24H,48H,60H,72H,84H,Y,DB?,DATAENDS,CODESEGMENT,ASSUME CS:CODE,DS:DATA,BEGIN:MOVAX,DATA,MOVDS,AX,MOVCX,Y-ARRAY,;循环次数初始化,MOVAL,NUM,;插入值送,AL,氏忘佃车芹扇怨培烈擎帘逮磐策盒岛佩迭案默癸潦兼把傈习碍任垮吝巳知,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,LEASI,Y,DECSI,;取得,ARRAY,的最后元素的偏移地址,LOP:CMPARRAYSI,AL,;比较,JLE,INSERT,MOVAH,ARRAYSI,MOVARRAYSI+1,AH,;数据交换,DECSI,;修改偏移地址,LOOPLOP,INSERT:MOVARRAYSI+1,AL,;插入数据,MOVAH,4CH,媚颖凑食疤觅歪穗略够听浩缔腔旭李伊著绎莉甲对伞吴鞭矾丰啃聪彼峙慨,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,INT21H,CODE ENDS,ENDBEGIN,5.5,子程序设计,5.5.1,子程序的构造,前面我们学习了过程定义伪指令,我们也就是用它们来构成的子程序,其格式为:,子程序名,PROC,(,NEAR/FAR,),保存信息,恢复信息,RET,子程序名,ENDP,边团丸哲的汁袖同怎汞屎刹炙新消憎罚宁幻只讨绊谈似枉纽斗瞄霸篮兆驯,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.5.2,子程序的调用与返回,子程序的正确执行是由子程序的正确调用和返回保证的。,IBM PC,机的,CALL,和,RET,指令就分别完成了子程序的调用和返回功能。,1.,调用指令:,CALL,过程名,执行,CALL,指令,首先保留断点地址于堆栈中,然后转移到目标单元,它对,PSW,无影响。,2.,返回指令:,RET,一个子程序执行的最后一条指令必定是返回指令,RET,,用以返回到调用子程序的断点处。但在位置上并不一定就是是最后一条指令。它的位置灵活,并不是必须要在最后。只是习惯上我们通常将它置于子程序的最后。,娄针歌岩怔联猴落稳闰鲤矽沛宙肘江宛睫霍俘尝创心谋测难蛀乌弧和溪欠,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.5.3,编制子程序的要求,1.,子程序必须具有通用性,2.,注意保存信息和恢复信息,要注意最先压入堆栈的应该最后弹出来,值得注意的是:必须搞清楚那些,寄存器是必须保存的,那些又是不必要或不应该保存的。一般来说,子程序中用到的寄存器是应该保存的,但是,如果主程序和子程序之间使用寄存器传递参数的话,该寄存器则不一定需要保存,特别是用来向主程序回送结果(即出口参数)的寄存器,则更不应该因保存和恢复该寄存器的内容而破坏了应该向主程序传送的信息。,3.,选用适当的方法在子程序和主程序之间的进行参数传递,冉酒庙荔管吓驼蛋鸽矢奉烽冲炯摄伏馏认矮斯痕豢睹渔药哈量标地艰颅挂,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,这种主程序与子程序之间的信息传送称为参数传递,它可以有以下三种:,用寄存器传递参数,这是最常用的一种方式,通常在参量不多的时候使用这种方法。, 用地址表传递参数,通过地址表传送参数的方法是在主程序中首先建立一个地址表,把要传送给子程序的参数都存放在地址表中,然后把地址表的首地址通过寄存器传送到子程序中去;,最后子程序通过地址表取得所需参数。,用堆栈传递参数,这种方法是在主程序中把要传送给子程序的参数先保存到堆栈中,然后子程序再从堆栈中取出参数以达到传送参数的目的。,另震州但辞自硼蠕眼猎麓努秧旧削袭胯勇坤系汁婴酵够字燥题捕活碍恒疾,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.6,高级汇编语言技术,5.6.1,宏汇编,1,宏定义,宏在使用前必须先进行宏定义。宏定义格式为:,宏指令名,MACRO,形式参数,形式参数,,宏体,ENDM,其中,宏指令名:宏定义的名字(即给宏体中程序段指定一个符号名),不可缺省,宏调用时要使用它,第一个符号必须是字母,其后可以是字母或数字,蕊逢指混汛强较厦譬敛做玲诉迟拜址锈列惶兼棘靶虫雨陛票涵份佬臣夺喜,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,MACRO,ENDM,:宏定义伪指令助记符,不可缺省。它们成对出现,表示宏定义的开始和结束,,ENDM,前不带宏指令名。,宏体:一段有独立功能的程序代码段。,形式参数:又称哑元,各个哑元之间用逗号隔开,可以缺省。,2,宏调用,经宏定义后的宏指令可以在源程序中调用,宏调用格式为:,宏指令名实参,实参,宏调用只需要有宏指令名,若宏定义中有形参,那么宏调用时必须带有实际参数来替代形参,实际参数的个数,顺序,类型与形参一一对应,各个实参之间用逗号分开,。原则上实参的个数与形参的个数相等,但汇编程序不要求它们必须相等,若实参,个数大于形参个数,则多余的实参不予考虑,若实参个数小于形参个数,则多余的形参作,“,空,”,处理。,郝能不倡镶殷著曲渭颇酬粥年抽浚欺巾虹购涕扑恐航送原捏灯赐匡椿肪顽,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,3,宏展开,汇编程序在对源程序汇编时,对每个宏调用作宏展开,每条插入的宏体指令前带上加号,“,+,”,。,例,5.11,:,不带参数的宏定义,用宏指令来实现回车换行。,宏定义:,CRLFMACRO,MOVDL,0DH;,回车,MOVAH,2,INT21H,MOVDL,0AH;,换行,MOVAH,2,捶女孙滔顷雄科来驰曳拟螟剃酒渡歉剔粒斡熄溃悸俏滁丽氛料股钨刘驴蒋,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,INT21H,ENDM,宏调用:,CRLF,宏展开:将下述程序段替换宏调用语句。,MOVDL,0DH;,回车,MOVAH,2,INT21H,MOVDL,0AH;,换行,MOVAH,2,INT21H,氛藻帜琳嘘形楷蕉伺指梗卸愧函初泉睡叮泼哎萝瓦髓避旱辅姜园吾鉴醇瞒,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,4.,宏调用中参数传递,宏定义中的参数可以有多个,实参可以是数字,寄存器或操作码。宏定义还可用部分操作码作参数,但在宏定义中必须用,“,&,”,作分隔符,,&,是一个操作符,它,在宏定义体中可作为哑元的前缀,宏展开时,可以把,&,前后两个符号合并成一个符号。,例,5.12,:宏定义带一个参数,用宏指令实现将,AX,中内容右移任意次(小于,256),。,宏定义:,SHIFTMACRO,N,MOVCL,,,N,SALAX,,,CL,ENDM,宏调用,1,:,SHIFT4,蜂蟹志示绝腺划呸踪芋艘巫埂霍博毡讽名针所砌倘季亿缔滞孔罐侄谤辫夯,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,宏调用,2,:,SHIFT8,宏展开,1,:,MOVCL,,,4,;,AX,中内容算术左移,4,次,SALAX,,,CL,宏展开,2,:,MOVCL,,,8,;,AX,中内容算术左移,8,次,SALAX,,,CL,5.,宏定义嵌套,在宏定义中允许使用宏调用,但必须先定义后调用。,例,5.14,:,宏定义:,AD1MACROM,,,N,MOVBX,,,M,鬃劳守滩助奸欣壶颠纹堤腺祁奏湘屿噬楞悠赵臻纳何眼吱心榜涤杨燥渠慷,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,ADDAX,,,N,ENDM,AD1MMACROR1,,,R2,,,R3,PUSHAX,PUSHBX,AD1R1,,,R2,MOVX3,,,AX,POPBX,POPAX,ENDM,宏调用:,AD1MCX,,,BX,,,DX,宏展开:,PUSHAX,残磁哉辨痰撩章僵琢弯找徐惑应毛助考剧臼糖抱孰狸峭妙训亨挥叹搐她冠,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,PUSHBX,AD1R1,,,R2,;此语句不占内存,MOV,BX,,,CX,;,AD1,宏定义展开,ADDAX,,,BX,MOVDX,,,AX,POPBX,POPAX,6.,取消宏定义语句,格式为:,PURGE,宏指令名,宏指令名,PURGE,:伪指令助记符,不可缺省,因为经过定义的宏指令名,不允许重新定义,必须用,PURGE,语句将其取消后,才能重新定义,此语句一次可以取消多个宏指令名。,合综渍淘士笋尧肯磺青哄蒜纂宝竭庭绚碰哮悯醇气浊梳在秃乐接谢虱呸浮,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,7.,宏指令与子程序的区别,过程调用使用,CALL,语句,由,CPU,执行,宏指令调用由宏汇编程序,MASM,中宏处理程序来识别。,过程调用时,每调用一次都要保留程序的断点和保护现场,返回时要恢复现场和恢复,断点,增加了操作时间,执行速度慢。而宏指令调用时,不需要这些入栈及出栈操作,执行速度较快。,过程调用的子程序与主程序分开独立存在,经汇编后在存储器中只占有一个子程序段的空间,主程序转入此处运行,因此目标代码长度短,节省内存空间。而宏调用是在汇编过程中展开,宏调用多少次,就插入多少次,因此目标代码长度大,,占内存空间多;,一个子程序设计,一般完成某一个功能,多次调用完成相同操作,仅入口参数可以改变,而宏指令可以带哑元,调用时可以用实元取代,使不同的调用完成不同的操作,增加使用的灵活性。,擒鳖孟堂葬讫堕陶访靛蕴晒塔囱郝臼舱铰里啡阅句琢兢偏直奈抄族敌坎丛,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.6.2,重复汇编,重复汇编伪指令语句有以下三种:,1,定重复,格式:,REPT,表达式,宏体,ENDM,其中,,REPT,ENDM,:伪指令助记符,必须成对出现,不可省略。宏体:表示需要重复的语句序列,。表达式:表示重复次数。,浆在谅读跺性厨豪骚债坎肇麓拒提变喉矿络鹊众祖视饱碾揖果懂房档紫晌,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,例,5.16,:,将,2,、,4,、,8,、,16,、,32,分配给连续的,5,个存储单元。,NUM=1,REPT 5,NUM=NUM*2,DB NUM,ENDM,汇编后,:,DB 2,DB,4,DB 8,DB 16,DB 32,霜换排郁落逢矾赠房傣袖录矢谁扰故孜痴虹沫札岩厦郑看鞭垮数升燃嚏户,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,2,不定重复,格式:,IRP,形参,实参表,宏体,ENDM,其中,,IRP,ENDM,:伪指令助记符,必须成对出现,不可省略。宏体:要重复的,语句序列,重复次数由参数个数决定。实数表中是每次重复时将要取的实参,实参之间用逗号隔开,实参表用尖括号括起来。每次重复,依次取实参表中一项,代入语句序列中哑元。前面将,2,、,4,、,8,、,16,、,32,分配给,连续的,5,个存储单元的例子也可以用如下不定重复伪指令:,IRPNUM,,,2,,,4,,,8,,,16,,,32,DBNUM,ENDM,面羞趁松玄钻寅募晦推咀狈血蘸刀腊剃饱萍证炮仪惋脆驴哎棒条酥旋燎甲,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,例,5.17,:,若要把,AX,,,BX,,,CX,,,DX,的内容压入堆栈,则可以用如下不定重复伪指令:,IRPREG,,,AX,,,BX,,,CX,,,DX,PUSHREG,ENDM,汇编后展开为以下四,条指令:,PUSH,AX,PUSHBX,PUSHCX,PUSHDX,祁穿蕴威蹄溢洼谩追响该俄伯峻蔓痊己痒蹋息恰窘包顶岔氨刃境式辫虫逆,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,3,不定重复字符,格式为:,IRPC,形式参数,字符串,宏体,ENDM,其中,,IRPC.ENDM,:伪指令助记符,必须成对出现,不可省略。宏体:重复,执行的语句序列,每次重复时依次用字符串中字符代替形式参数,重复次数取决于字符串中,字符的个数。字符串:可用尖括号也可不用尖括号括起来。,例,5.18,:,若要从堆栈中弹出,4,个字,分别送入,DX,,,CX,,,BX,,,AX,,则可用如下不定重复字符伪指令:,IRPCREG,,,POPREG&X,ENDM,存了献畸藐复榜烯志赞秩撵暂呵注择蜜富配刮扭填划俄涅详序梧管暖襟痔,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,汇编后展开为以下四条指令:,POPDX,POPCX,POPBX,POPAX,5.6.3,条件汇编,条件汇编是对给定的条件进行测试,汇编程序根据测试结果,将一段程序嵌入源程序汇编或不进行汇编,它的一般格式为:,IF,表达式,指令体,1,;条件为真汇编指令体,1,ELSE,指令体,2,;条件为假汇编指令体,2,ENDIF,衣唐裳聘采调题拈率鹰腑壁岩蝉藩遁卜柱篱二吭膛宛钟撮属昨瑰极片罗阐,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,其中,,IF,ENDIF,:条件汇编伪指令助记符,必须成对出现,不可省略。,IF,语句后的“,”,是指定的条件。如果“,IF”,指定的条件为真时则宏汇编程序将指令体,1,中的,语句汇编成相应的目标代码,否则就把指令体,2,中的语句汇编成相应的目标代码。,ELSE,:是任选部分,如果没有,ELSE,,那么,“,IF,”,指定的条件满足就汇编,否则就不汇编。,“,IF,”,条件汇编的形式见,表,5.1,所示:,何彝妥姐货枢垒摇蒲先粱石岸染袱配苗垂姿嫌傈醛怪监乖弃愚毗砚卵证梅,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,例,5.20,:,利用条件汇编伪指令,可以根据不同情况,产生无条件转移指令如,JMP,,或产生条件转移指令如,JE,、,JNE,、,JB,、,JNB,等。,宏定义:,GOTOMACROLOP,,,X,,,REL,,,Y,IFB,REL,JMPLOP,ELSE,MOVAL,,,X,CMPAL,,,Y,J&RELLOP,ENDIF,ENDM,菌愤炮癌头咨手允赠尺米扬脯良昂桥妹图据帝盘杠狮脊悉龋诸侮疵虑朵乘,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,宏调用:,GOTOLOP1,,,VAR1,,,E,,,VAR2,GOTOEXIT1,宏展开:,MOVAL,,,VAR1,CMPAL,,,VAR2,JELOP1,JMPEXIT1,授纸掩埠纤耽敬翻媳命试吝鳃贰峰马胯证储辣掷瓜随吏房叁斧犀方唆困厂,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,5.7 DOS,功能子程序的调用,为了了解程序运行过程中的情况,应设法将运算结果显示到显示器上,最简单的方法就是调用操作系统的,I/O,子程序,我们称为,DOS,功能,调用。,DOS,为程序设计人员提供了许多可直接调用的功能子程序。调用时需要使用软中断指令:,INT n,其中:,n,为中断调用类型号,其值为,00,FFH,。在使用,INT,指令前,应将调用的功能号送入,AH,,有关入口参量送入指定寄存器中。若有出口参量,中断调用返回后,,结果在指定的寄存器或存储单元中。,DOS,功能子程序的调用使用软中断指令,“,INT 21H,”,。,DOS,共有,84,个功能子程序。这些子程序的主要功能是:磁盘的读写控制、文件操作、目录操作、内存管理、基本输入输出管理及设置,/,读出系统日期、时间等。,准少弓瓣慰袄鉴煮沤序刺腔嘴翼加熙喊呐错丧硷辊此懈筋粳旱忠塘绕撼碌,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,下面例举部分常用的,DOS,功能子程序。,1,带显示的键盘输入(,1,号功能),该功能子程序等待键盘输入,直接按下一个键(即输入一个字符),把字符的,ASCII,码送入,AL,,并在屏幕上显示该字符。如果按下的键是,Ctrl-C,组合键,则停止程序运行。如果按下,TAB,制表键,屏幕上光标自动扩展到紧接着的,8,个字符位置后面。,1,号功能调用,毋需入口参量,出口参量在,AL,中。如:,MOVAH,,,01H,INT21H,偏钞霖武疏苹光芬臂孟盾嗓更疏犯犀劲烬巨墟草孪枢迹订巨帖兵陇仗浴那,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,2,不带显示的键盘输入(,7,号功能),与,1,号功能类似,它仅等待键盘输入一个字符,并将字符的,ASCII,码送入,AL,中。但按下,Ctrl-C,组合键和,TAB,制表键无反应。调用方法如下:,MOVAH,,,7,INT21H,缓冲区第一个字节存放它能保存的最大字符数(,1,255,,不能为,0,!),该值由用户程序自己事先设置。如果键如的字符数比此数大,那就会发出,“,嘟嘟,”,声,而且光标不再向右移动。,纬蹲进囱袋椿工逗窿牺襟舷储遂瓮决登粤瑚滤寐苑致谷魁捶丑鹏肋驴菇蛙,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,缓冲区第二个字节存放用户本次调用时实际输入的字符数(回车键除外,),这个数由,DOS,返回时自动填入。用户从键盘输入的字符从第三个字节开始存放,直到用户输入回车键为止,并将回车键码(,0DH,)加在刚才输入字符串的末尾上。,调用时,用,DS,:,DX,寄存器指向输入缓冲区,的段基值:偏移量。例如在数据区定义的字符缓冲区如下:,MAX,LENDB18,ACT,LEN,DB,?,STRINGDB,18DUP,(,0,),浊源境杜戌劣懂驹瘦仟蝇榔制目搪啸揣亩为庶整寅难卫逝虾廊鸟把国孙适,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,则输入串的指令如下:,MOVAX,,,SEGMAX,LEN,MOVDS,,,AX,MOVDX,,,OFFSETMAX,LEN,MOVAH,,,0AH,INT21H,5,字符显示(,2,号功能),本功能子程序仅在屏幕上显示单个字符。要显示字符的,ASCII,码存放在,DL,中。如果,DL,中存放退格键编码,在屏幕上便向左移一个字符位置,并使该位置成为空格。移动后光标停留在那里。如要显示字符,A,,可用下列几条指令调用:,MOVDL,,,A,MOVAH,,,2,INT21H,掌廓僧现鬃幅核犹刹世普赦妻阜忆华磺爆赤桃堑混怪侵砷枷犊用箱劈赵坦,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,6,字符打印(,5,号功能),5,号功能子程序把,DL,中的字符(,ASCII,码)送入打印机接口,打印输出。功能调用为:,MOVDL,,,A,MOVAH,,,5,INT21H,7,字符串显示(,9,号功能),9,号功能子程序能在屏幕上显示多于一个的字符串。要显示的字符串必须先放,在内存一数据区中,且字符串以美元符号作为结束标志。非显示字符,可以用它的,ASCII,码插入字符串中间。进行,9,号功能调用时,先把待显示的字符串首地址的段基值,和偏移量分别存入,DS,和,DX,中。,在数据段中定义一个待显示符号串如:,STRINGDB,“,THIS IS A PROGRAM,”,,,0AH,,,0DH,,,“,”,绩神凌钧铆土侯慢草签漓整呸侥靛钎模冒斟刁缆挨怯代赫约舟已多介俐宴,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,则显示该符号串的指令为:,LEADX,,,STRING,MOVAH,,,9,INT21H,8,取中断向量(,35H,号功能),35H,号功能把由,AL,指定的中断类型号的中断向量从中断向量表中取到,ES,:,BX,中。即必须把要取出的中断类型号,N,送给,AL,,调用,35H,功能后,与中断类型号,N,对应的中断向量则保存在,ES,:,BX,中。其调用示例如下:,MOVAL,,,N,MOVAH,,,35H,INT21H,柒逊郊部匿衰萧傀婆粗屑初尔案滥虑墓敏舔塞秘戏枕凸祭福庸展萨材豁原,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,9,设置中断向量(,25H,号功能),25H,号功能把由,AL,指定的中断类型的中断向量,DS,:,DX,放置在中断向量表中。具体设置过程为:首先将要设置的中断类型号送,AL,,然后把要设置的中断服务程序的段地址和偏移量分别送,DS,、,DX,,最后再调用,25H,功能。典型的使用,DOS,功能调用存取中断向量的程序段如下:,MOVAL,,,N,;取出并保存原中断向量,MOVAH,,,35H,INT21H,PUSHBX,购乓老会席扯灭致圭乍妒鸥降洪系肃蔬总怀鸯币瑰蜂伍帚涤茵朱突赋秆又,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,PUSHES,PUSHDS,MOVAX,,,SEG INTERRUPT,MOVDS,,,AX,MOVDX,,,OFFSET INTERRUPT,MOVAL,,,N,MOVAH,,,25H,INT21H,POPDS,POPDS,缕骑壹长原避疙糙滦些帛许顺铡综茄赊弘而脏瑟慑欣趋肛弯天镁擎缔鲸狈,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,恢复原中断向量,POPDX,MOVAL,,,N,MOVAH,,,25H,INT21H,MOVAH,,,4CH,;返回,DOS,INT21H,INTERRUPT,:,;中断服务程序,IRET,蒲滓坪乱黔曼抹奥龋锨则叙儿溉瞎颊才芳兢均荡底揭涎碗部卉坚坍口菠涂,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,10,读出系统日期(,2AH,号功能),本功能子程序的执行,将系统的年、月、日、星期的数据读出,并存入指定的寄存器中:,CX ,年,(,1980,2099,),DH ,月(,1,12,),DL ,日(,1,31,),AL ,星期(,0,星期日,,1,星期一等),11,设置系统日期(,2BH,功能),调用本功能子程序时,必须在,CX,和,DX,中设置有效日期,其中,,CX,中存放年号(,1980,2099,),,DH,中存放月号(,1,12,),,DL,中存放日(,1,31,)。如果日期设置有效,待功能子程序返回时,(,AL,),=0,,否则(,AL,),=0FFH,。所以为了检查设置是否成功,通常在调用,2BH,号功能后检查,AL,中内容。,絮原鱼子署讳投密碘塔羹荷蚕堑社萤蚂嗡冗娶衔适节滞砷旅剧殿赏睬店征,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,12,读出系统时间(,2CH,功能),本功能子程序从系统中可得到当时的时间:时、分、秒和百分秒,它们分别存放在,CX,和,DX,寄存器中:,CH ,小时 (,0,23,),CL ,分 (,0,59,),DH ,秒 (,0,59,),DL ,百分秒(,0,99,),13,设置系统时间(,2DH,功能),调用本功能子程序时,必须在,CX,和,DX,中设置有效时间(指定有关寄存器和数据范围与,2C,号功能相同)。如果设置时间有效,从功能子程序返回时,(,AL,),=0,,否则(,AL,),=0FFH,。,殖壶楼巴尺镐巾程奴乞恍豌锁携却印歧茂荆柏牺会徘捻口尧抚商略河柜殷,(,课件,)-5.1,汇编语言源程序的框架结构,(,课件,)-5.1,汇编语言源程序的框架结构,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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