




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第六章 子程序构造6.1 子程序的设计方法6.2 嵌套与递归子程序6.3 子程序举例6.4 DOS系统功能调用26.1 子程序的设计方法一、子程序指令二、子程序的调用与前往三、现场的维护与恢复四、子程序参数的传送3一、子程序指令w 子程序是完成特定功能的一段程序w 当主程序调用程序需求执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行w 当运转完子程序功能后,采用RET前往指令回到主程序继续执行4一、子程序指令调用指令w CALL指令分成4种类型类似JMPw CALL label;段内调用、直接寻址w CALL r16/m16;段内调用、间接寻址w CALL far ptr la
2、bel;段间调用、直接寻址w CALL far ptr mem;段间调用、间接寻址w CALL指令需求保管前往地址:w 段内调用偏移地址IP入栈w SPSP2,SS:SPIPw 段间调用偏移地址IP和段地址CS入栈w SPSP2,SS:SP CSw SPSP2,SS:SP IP5一、子程序指令前往指令w 根据段内和段间、有无参数,分成4种类型w RET;无参数段内前往w RET i16;有参数段内前往w RET;无参数段间前往w RET i16;有参数段间前往w 需求弹出CALL指令压入堆栈的前往地址w 段内前往偏移地址IP出栈w IPSS:SP, SPSP2w 段间前往偏移地址IP和段地址C
3、S出栈w IPSS:SP,SPSP2w CSSS:SP,SPSP26一、子程序指令前往指令RET的参数RET i16;有参数前往RET指令可以带有一个立刻数i16,那么堆栈指针SP将添加,即SPSP+i16这个特点使得程序可以方便地废除假设干执行CALL指令以前入栈的参数7二、子程序的调用与前往CALL label主程序RET子程序回到CALL指令后的指令处前往地址8二、子程序的调用与前往书写方式同一代码段内9二、子程序的调用与前往书写方式不同代码段10三、现场的维护与恢复w 现场:主程序转向子程序之前,其所运用的一些资源的形状如标志位、R/M等w 子程序与主程序分别编制,通常会导致运用的资源
4、发生冲突而影响主程序在调用子程序之后的正确执行w 方法:利用堆栈w 在主程序中进展w 在子程序中进展11三、现场的维护与恢复在主程序中进展PUSH BXPUSH AXCALL SUB1POP AXPOP BX留意: 进栈/出栈的顺序维护与恢复的对象:主程序用到的存有数据、中间结果且在CALL指令后还要用到的R/M12三、现场的维护与恢复在子程序中进展SUB1 PROCPUSH BXPUSH AXPOP AXPOP BXRETSUB1 ENDP留意: 进栈/出栈的顺序维护与恢复的对象:子程序用到的R/M13四、子程序参数的传送w 入口参数输入参数:主程序提供应子程序w 出口参数输出参数:子程序前
5、往给主程序w 参数的方式:w 数据本身传值w 数据的地址传址w 传送的方法:w 存放器 变量 堆栈14例:将两个给定的二进制数转换成为二进制数的ASCII 码方式并加以显示w 对两个数进展转换、显示的任务是一样的,没有必要反复编写,以子程序的方式来完成w显示子程序需被告知:被显示内容的起始位置被显示内容的长度被转换的数及其长度存放结果的起始位置w转换子程序需被告知:15例:将两个给定的二进制数转换成为二进制数的ASCII码方式并加以显示(6-1-1.asm)w 方法一:用存放器传送参数w显示子程序:DI:被显示内容的起始位置指针CX:被显示内容的长度BX:被转换的数CX:被转换数的长度DI:存
6、放结果的起始位置指针w转换子程序:16;转换子程序 BINASCPROC REP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RET BINASCENDPBLBHDLDI17;显示子程序DISPPROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETDISP ENDP18DSEG SEGMENT PARA DATABIN1DB
7、 35HBIN2 DW 0AB48HASCBUFDB 20H DUP(?)DSEGENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG, DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV BH,BIN1MOV CX,8LEA DI,ASCBUFPUSH DIPUSH CXCALL BINASCPOP CXPOP DIPUSH DICALL DISPPOP DIADD DI,10HMOV BX,BIN2MOV CX,16PUSH DIPUSH CXCALL BINASCPOP CXPOP DICALL DISPMO
8、V AX,4C00HINT 21H;转换子程序BINASCPROCREP1:ROL BX,1MOV DL,BLAND DL,01HADD DL,30H;屏蔽除最低位外的其他位MOV DI,DLINC DILOOP REP1RETBINASCENDP;显示子程序DISP PROCREP2:MOV AH,2MOV DL,DIINT 21HINC DILOOP REP2MOV DL,0AH;设置显示后的光标位置MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETDISP ENDPMAIN ENDPCSEG ENDSEND MAIN ;set entry point1
9、9例:将两个给定的二进制数转换成为二进制数的ASCII码方式并加以显示(6-1-2.asm)w 方法二:用堆栈传送参数20方法二之主程序段MOV AH,BIN1;要转换的数进栈PUSH AXLEA DI,ASCBUF;地址指针PUSH DIMOV AX,8;长度PUSH AXCALL BINASC;调用转换子程序MOV AX,BIN2PUSH AXADD DI,10HPUSH DIMOV AX,16PUSH AXCALL BINASC21;转换并显示子程序BINASCPROCPUSH DIPUSH AXPUSH BXPUSH CXPUSH DXPUSH BPMOV BP,SPMOV BX,BP
10、+18MOV DI,BP+16MOV CX,BP+14REP1:ROL BX,1MOV DL,BLAND DL,01H;屏蔽除最低位外的其他位ADD DL,30HMOV DI,DLMOV AH,6INT 21HINC DILOOP REP1MOV AH,6MOV DL,0AHINT 21HMOV AH,6MOV DL,0DHINT 21HPOP BPPOP DXPOP CXPOP BXPOP AXPOP DIRET 6BINASC ENDP22BP=SPBX地址IP长度进入子程序时的SPAXDIBIN1CXDXBPBP+14BP+16BP+18方法二之堆栈236.2 嵌套与递归子程序w 嵌套:
11、子程序调用其他子程序,嵌套层数取决于堆栈的大小32K根本不受限制w 递归:子程序调用本人,该情况要合理设置出口参数,否那么会呵斥程序死锁246.3 子程序举例25例 6.3 十进制到十六进制数的转换从键盘获得一个十进制数,然后把该数以十六进制的方式在屏幕上显示出来26例 6.3 十进制到十六进制数的转换6-3-1.DOCw 转换方法:w 1234w (0*10+1)*10)+2)*10+3)*10+4w 从最高位开场:累加和*10+本位的权值w 十六进制数显示的实现BHH4BHL4BLH4 BLL44BHH4BHL4BLH4 BLL4BHH4AL从最高位开场27;例6-3,十进制到十六进制数的
12、转换SSEG SEGMENT PARA STACK STACKDW 100H DUP(0) SSEG ENDS DSEG SEGMENT PARA DATADSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG, DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEG;MAKE NECCESSARY INITALIZALITIONMOV DS,AXREPEAT: CALL DECIBINCALL CRLFCALL BINIHEXCALL CRLFJMP REPEATMOV AH,0AHINT 21HMOV AX,4C00H;RETUR
13、N DOSINT 21HMAIN ENDP28;从键盘获得十进制数并将其转换成十六进制数置于BX中DECIBIN PROCMOV BX,0NEWCHAR:MOV AH,1INT 21HSUB AL,30HJL EXIT;非十进制数那么退出CMP AL,9JG EXITCBWXCHG AX,BX;将原有的数*10后加新输入的数MOV CX,10MUL CXXCHG AX,BXADD BX,AXJMP NEWCHAREXIT:RETDECIBIN ENDP29;将BX中的十六进制数转换成相应的ASCII码显示在屏幕上BINIHEX PROC MOV CH,4;共四位十六进制数ROTATE: MOV
14、 CL,4ROL BX,CLMOV AL,BL;从最高位开场,将其移位至BX,AL的低4位AND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7;如为A-F的处置PRINTIT: MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATERETBINIHEX ENDPCRLFPROCMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HRETCRLFENDPCSEG ENDSEND MAIN ;SET ENTRY POINT30例 6.8 把以ASCII码方式表示的十进制数转换成二进制
15、数6-8-2.asm,6-8-1.asm加强型编程w 程序限制:转换后的二进制数不超越16位w 转换方法:123455*1= 5 5*01H= 5H4*10 = 404*0AH= 28H3*100= 3003*64H= 12CH2*1000= 20002*3E8H= 7D0H1*10000= 100001*2710H=2710H求和= 12345求和=3039H从最低位开场31加强功能的过程定义伪操作格式:PROCNAMEPROC ATTRIBUTES FIELD USES REGISTER LIST ,PARAMETER FIELDPROCNAMEENDPATTRIBUTES FIELD :
16、DISTANCE LANGUAGE TYPEVISIBILITYPROLOGUE32加强功能的过程定义伪操作33例6.8.MODEL SMALL.STACK 64.DATAASCVAL DB 12345BINVALDW ?.CODEMAIN PROC FARMOV AX,DATAMOV DS,AXLEA BX,ASCVALPUSH BXLEA BX,BINVALPUSH BXCALL CONVASCBINMOV BX,BINVALCALL BINIHEXMOV AX,4C00HINT 21HMAIN ENDP34CONVASCBINPROC PASCAL USES AX BX CX SI DI
17、,PAR1:WORD,PAR2:WORDLOCAL ASCLEN:WORD,MULFACT:WORDMOV BX,10MOV SI,PAR1MOV DI,PAR2SUB DI,SIMOV ASCLEN,DIMOV CX,DIADD SI,CXDEC SIMOV MULFACT,1MOV DI,PAR2MOV WORD PTR DI,0NEXT:MOV AL,SIAND AX,000FHMUL MULFACTADD DI,AXMOV AX,MULFACTMUL BXMOV MULFACT,AXDEC SILOOP NEXTRETCONVASCBINENDP35BINIHEX PROC MOV C
18、H,4ROTATE: MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7PRINTIT: MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATERETBINIHEX ENDPEND MAIN ;SET ENTRY POINT3637例:6.9 十六进制到十进制数的转换 w 把从键盘输入的0-FFFF的十六进制正数转换成十进制数并在屏幕上显示出来w Hexibin :键盘输入十六进制数其数值在BX中w crlf :回车换行w Binidec:十六进制到十进制转换并显示38例
19、6.9DISPEQU 2HKEY_INEQU 1HDOSCALL EQU 21HSSEG SEGMENT PARA STACK STACKDW 100H DUP(0) SSEG ENDS CSEG SEGMENT PARA CODEASSUME CS:CSEG, SS:SSEGMAINPROC FARMOV CL,4CALL HEXIBIN;调用十六进制数输入子程序CALL CRLFCALL BINIDEC;调用十六进制到十进制转换子程序CALL CRLFJMP MAINMOV AX,4C00HINT 21HMAIN ENDP39例6.9;十六进制输入并转换为十六进制数值子程序,十六进制数值在
20、BX中HEXIBIN PROC MOV BX,0 NEWCHAR: MOV AH,KEY_ININT DOSCALLSUB AL,30HJL EXIT;非十六进制数值输入那么终了输入CMP AL,10JL ADD_TOSUB AL,27HCMP AL,10HJGE EXITADD_TO: SHL BX,CL;新输入的数值在AL的低四位上参与到BX的低四位中MOV AH,0ADD BX,AXJMP NEWCHAREXIT:RETHEXIBIN ENDP40例6.9;十六进制到十进制转换并显示子程序;被除数是BX,除数分别是10000,1000,100,10,1,;;商是十进制;数,余数作为下次的
21、被除数BINIDEC PROCMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1CALL DEC_DIVRETBINIDEC ENDPDEC_DIVPROCMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,DISPINT DOSCALLRETDEC_DIVENDP41例6.9CRLFPROCMOV DL,0AHMOV AH,DISPINT DOSCALLMOV DL,0DHMO
22、V AH,DISPINT DOSCALLRETCRLFENDPCSEG ENDSEND MAIN42例6.10 一个简单的信息检索系统w 数据区里有10个不同的信息,编号为0-9,每个信息包括30个字符。编制程序从键盘接纳0-9之间的编号,然后在屏幕上显示相应编号的信息内容。w 6-10.asm,6-10.doc43SSEG SEGMENT PARA STACK stackDW 100H DUP(0) SSEG ENDS DSEG SEGMENT PARA DataTHIRTYDB ?MESG0DB This is message 0-MESG1DB This is message 1-MES
23、G2DB This is message 2-MESG3DB This is message 3-MESG4DB This is message 4-MESG5DB This is message 5-MESG6DB This is message 6-MESG7DB This is message 7-MESG8DB This is message 8-MESG9DB This is message 9-LENEQU MESG1-MESG0ERRMSG DB error! invilid parameter!DSEG ENDS例例6.10:1/344CSEG SEGMENT PARA COD
24、EASSUME CS:CSEG, DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV THIRTY, LENBEGIN:MOV AH,1INT 21HSUB AL,0JC ERRORCMP AL,9JA ERRORPUSH AXMOV DL,0AHCALL DISPCHARMOV DL,0DHCALL DISPCHARPOP AXMOV BX, OFFSET MESG0MUL THIRTYADD BX,AXCALL DISPJMP BEGINERROR:MOV BX,OFFSET ERRMSGCALL DISPMOV AX,4C00HINT
25、21H例例6.10:2/345DISPPROCMOV CX,30DISP1:MOV DL,BXCALL DISPCHARINC BXLOOP DISP1MOV DL,0AHCALL DISPCHARMOV DL,0DHCALL DISPCHARRETDISPENDP DISPCHARPROCMOV AH,2INT 21HRET DISPCHARENDPMAIN ENDPCSEGENDSEND MAIN ;SET ENTRY POINT例例6.10:3/346例6.11 人名排序程序。从键盘键入最多30个人名,当一切人名都进入后,按字母上升的次序将人名排序,并在屏幕上显示已排序后的人名6-114
26、7w b10read:输入子程序所占空间固定,但要将多出部分清为空格w D10stor:将本次输入存储到表中DI中是在表中起始地址的指针,同时计存储到表中的名字的个数w g10sort :排序冒泡排序w H10 xch:交换表中相邻项的顺序 w K10disp:显示已排序的名字表 w Q10clr:清屏 w Q20curs:设置光标位置 48DSEG SEGMENT PARA DATA NAMEPARLABEL BYTE MAXLENDB 21 NAMELENDB ? NAMEFLDDB 21 DUP(?) CRLFDB 13,10,$ ENDADDRDW ?MESG1DB NAME? ,$
27、NAMECTRDB 0 NAMETABDB 20 DUP(20 DUP( ) NAMESAVDB 20 DUP(?),13,10,$ SWAPPEDDB 0DSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG, DS:DSEGMAIN PROC FARMOV AX,DSEGMOV DS,AXMOV ES,AX例例6.11:1/649CLDLEA DI,NAMETAB;表首址作为目的串的首址CALL Q10CLRCALL Q20CURS A20LOOP:CALL B10READ;调输入子程序CMP NAMELEN,0JZ A30CALL D10STOR;存储
28、JMP A20LOOPA30:CALL Q10CLRCALL Q20CURSCMP NAMECTR,1JBE A40CALL G10SORTA40:CMP NAMECTR,0JBE EXITCALL K10DISPEXIT:MOV AX,4C00HINT 21HMAIN ENDP例例6.11:2/650;名字输入子程序 B10READPROCMOV AH,9LEA DX,MESG1INT 21HMOV AH,0AHLEA DX,NAMEPARINT 21HMOV AH,9LEA DX,CRLFINT 21HMOV BH,0;缓存区的空余部分填空格MOV BL,NAMELENMOV CX,21S
29、UB CX,BXB20:MOV NAMEFLDBX,20HINC BXLOOP B20RET B10READENDP ;名字存储子程序 D10STORPROC ;名字个数计数器加1INC NAMECTRCLDLEA SI,NAMEFLDMOV CX,10REP MOVSWRET D10STORENDP例例6.11:3/651;排序子程序 G10SORTPROCSUB DI,40MOV ENDADDR,DIG20:MOV SWAPPED,0;交换标志清0LEA SI,NAMETABG30:MOV CX,20MOV DI,SIADD DI,20MOV AX,DIMOV BX,SIREPE CMPS
30、BJBE G40CALL H10XCH;调用交换顺序子程序G40:MOV SI,AXCMP SI,ENDADDRJBE G30CMP SWAPPED,0JNZ G20RET G10SORTENDP例例6.11:4/652;交换表的内容H10XCH PROCMOV CX,10LEA DI,NAMESAVMOV SI,BXREP MOVSWMOV CX,10MOV DI,BXREP MOVSWMOV CX,10LEA SI,NAMESAVREP MOVSWMOV SWAPPED,1RETH10XCH ENDP;显示已排序的名字表 K10DISPPROCLEA SI,NAMETABK20:LEA D
31、I,NAMESAVMOV CX,10REP MOVSWMOV AH,9LEA DX,NAMESAVINT 21HDEC NAMECTRJNZ K20RET K10DISPENDP例例6.11:5/653;清屏子程序Q10CLR PROCMOV AX,0600HMOV BH,61HSUB CX,CXMOV DX,184FHINT 10HRETQ10CLR ENDP;设置光标位置子程序 Q20CURSPROCMOV AH,2SUB BH,BHSUB DX,DXINT 10HRET Q20CURSENDPCSEG ENDSEND MAIN ;SET ENTRY POINT例例6.11:6/6546.
32、4 DOS系统功能调用裸机裸机DOS功能调用汇编言语程序55系统功能调用w 21H号中断是DOS提供应用户的用于调用系统功能的中断,它有近百个功能供用户选择运用,主要包括设备管理、目录管理和文件管理三个方面的功能w ROM-BIOS也以中断效力程序的方式,向程序员提供系统的根本输入输出程序w 汇编言语程序设计需求采用系统的各种功能程序w 充分利用操作系统提供的资源是程序设计的一个重要方面,需求掌握56功能调用的格式通常按照如下4个步骤进展:在AH存放器中设置系统功能调用号在指定存放器中设置入口参数执行指令INT 21H或ROM-BIOS的中断向量号 实现中断效力程序的功能调用根据出口参数分析功能调用执行情况57字符输出的功能调用w DOS功能调用INT 21Hw 功能号:AH02Hw 入口参数:DL字符的ASCII码w 功能:在显示器当前光标位置显示给定的字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年内蒙古汽车驾驶员高级理论知识考试试卷带解析附答案(基础题)
- 桂林社工考试试题及答案
- 规划师考试试题及答案
- 吊装合同协议书文本
- 2025年秦皇岛汽车转向系统项目实施方案
- 赌博离婚协议书
- 房屋交易与购买协议书
- 签继承财产协议书
- 2025年注册安全工程师(建筑施工安全)《危大工程管理》深基坑支护施工标准化考核试卷
- 2025年职业教育劳动教育课程设计职业教育改革水平考核试卷
- 基金从业人员资格模拟测试完美版带解析2025年含答案
- 2025-2030儿童财商培养纳入早期智力开发体系的社会接受度调研
- 2025年10月自考11467人力资源统计学押题及答案
- 《企业人力资源管理师》四级练习题库及参考答案
- 2025年全国保密教育线上培训考试题及答案
- 2025年长春吉润净月医院社会招聘模拟试卷(含答案详解)
- 2025年国网宁夏电力有限公司高校毕业生提前批招聘校园宣讲安排笔试参考题库附带答案详解
- 零工经济中的女性劳动者权益保障研究
- 2025年哈尔滨呼兰区招聘禁毒协管员30人考试参考试题及答案解析
- 2025初级注册安全工程师题库合集(+答案)
- 2025年武汉东西湖分局招聘警务辅助人员招聘73人考试参考试题及答案解析
评论
0/150
提交评论