第6章 高级汇编语言和模块化程序设计.ppt
《第6章 高级汇编语言和模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《第6章 高级汇编语言和模块化程序设计.ppt(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 高级汇编语言和模块化程序设计6.1 子程序6.2 宏6.3 多模块程序设计6.4 结构和记录6.1 子程序1 堆栈2 子程序的概念3 子程序格式和有关指令子程序的格式调用与返回指令4 子程序设计方法5 子程序的嵌套与递归调用6 子程序应用举例返回本章返回本章1 堆栈v进栈/出栈指令v寄存器入栈v寄存器出栈堆栈:以字为单位、按照先今后出的方式存取的内存。堆栈:以字为单位、按照先今后出的方式存取的内存。堆栈用来传递参数、临时存放数据、保存和恢复寄存器。堆栈用来传递参数、临时存放数据、保存和恢复寄存器。返回本节返回本节进栈/出栈指令v入栈指令语句格式:PUSH R16|M16|SEG功能:堆
2、栈指针减2,将寄存器、段寄存器或存储器中的一个字数据压入堆栈。v出栈指令语句格式:POP R16|M16|SEG功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。返回本节返回本节寄存器入栈v格式:PUSHA 功能:所有16位寄存器(AX、BX、CX、DX、SI、DI、SP、BP)依次入栈,SP做相应的移动。指令执行后,(SP)-16 SPv格式:PUSHAD 功能:所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP)依次入栈,SP做相应的移动。指令执行后,(SP)-32 SP返回本节返回本节寄存器出栈v格式:POPA 功能:栈顶内容依
3、次出栈存于各16位寄存器(AX、BX、CX、DX、SI、DI、SP、BP)中,同时,SP做相应的移动。指令执行后,(SP)+16 SPv格式:POPAD 功能:栈顶内容依次出栈存于各32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP)中,同时,SP做相应的移动。指令执行后,(SP)+32 SPPUSHA和POPA的执行图示返回本节返回本节执行前执行前PUSHASPSPAXCXDXBX原SPBPDISIPOPASPAXCXDXBX原SPBPDISI2 子程序的概念v在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计
4、成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。v调用子程序的程序称为主调程序或主程序。/主程序ST:CALL S1断点/子程序S1S1PROCST:RETS1ENDP子程序的特点1、功能独立2、通用性3、可浮动性:子程序可放在存储区任意地址4、可递归性:子程序调用其自身5、可重入性:子程序可被中断,在中断处理中又被中断服务程序调用,且都能提供正确结果。子程序的优点1、简化程序设计过程,节省设计时间2、缩短程序长度,节省汇编时间和程序执行空间3、增加程序可读性,便于修改与调试4、方便程序模块化、结构化和自顶向下程序设计方法返回本节返回本节调用与返回指令过程的正
5、确执行由子程序的正确调用和返回保证。主程序中,通过CALL指令完成子程序调用,将CALL指令的下一条地址入栈保存,并修改IP为子程序的入口地址,即转子程序处执行。子程序中,通过RET指令完成子程序的返回,IP为栈顶出栈的内容,即转到主程序中调用语句的下一条语句处执行。1)段内调用与返回2)段间调用与返回调用与返回指令1)段内调用与返回*调用格式CALL NEAR PTR 子程序名功能:PUSH(IP),(IP)子程序入口的偏移地址子程序入口的偏移地址CALL WORD PTR 通用寄存器或存储器功能:功能:PUSH(IP),(IP)(IP)+D16注意:定义子程序的要求子程序是NEAR型,且与
6、调用程序定义在同一代码段内*返回功能RET(IP)POP()RET EXP(IP)POP(),(SP)(SP或ESP)+D16调用与返回指令2)段间调用与返回*调用格式CALL FAR PTR 子程序名功能:PUSH(CS),PUSH(IP),(IP)子程序入口的偏移地址子程序入口的偏移地址CALL DWORD PTR 存储器功能:功能:PUSH(CS),PUSH(IP),(IP)(EA)(CS)(EA+2或或4)*返回RET功能:(IP)POP(),(CS)POP()RET 表达式功能:(IP)POP(),(CS)POP()(SP或ESP)(SP或ESP)+D16子程序的调用与返回DATAS
7、EGMENTMEQU8NEQU3RESDW?DATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,NCALLSUB1MOVBX,AXMOVCX,MCALLSUB1DIVBXMOVBX,AX SUBCX,NCALLSUB1XCHG BX,AXDIVBXMOVRES,AXMOVAX,4C00HINT 21HSUB1PROCMOVAX,1NEXT1:MULCXLOOP NEXT1RETSUB1ENDPCODE ENDSENDSTART例:计算例:计算例:计算例:计算HTOASCproc;将AL低4位表达的一位1
8、6进制数转换为ASCII码and al,0fhcmp al,9jbe htoasc1add al,37h;是0AH0FH,加37Hret;子程序返回htoasc1:add al,30h;是09,加30Hret;子程序返回HTOASCendp题子程序可以具有多个出口题子程序可以具有多个出口返回本节返回本节子程序的格式子程序的格式如下:过程名 PROC NEAR/FAR RET过程名 ENDP子程序和主程序在同一代码段中,定义为子程序和主程序在同一代码段中,定义为NEAR。书例。书例6.1子程序和主程序不在同一代码段中,定义为子程序和主程序不在同一代码段中,定义为FAR。书例。书例6.2可将主程序
9、定义成可将主程序定义成FAR型供型供DOS调用调用子程序的说明:子程序的说明:1 1、子程序名、子程序名供供调用使用调用使用2 2、子程序功能、子程序功能供供选择子程序选择子程序3 3、占用寄存器、占用寄存器4 4、入口参数:执行子程序应具备的条件、入口参数:执行子程序应具备的条件5 5、输出参数:子程序执行后结果应放何处、输出参数:子程序执行后结果应放何处6 6、子程序调用示例:说明子程序调用格式、子程序调用示例:说明子程序调用格式一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。子程序可以嵌套定义。书例6.1例题v阅读下列子程序,写出子程序的功能、入口参数、出口参数S
10、UB PROC NEAR/FARPUSH CXPUSH DXPUSH BXPUSH AXMOV CX,16BIN:ROL BX,1MOV DL,BLAND DL,1ADD DL,30HMOV AH,2INT 21HLOOP BINPOP AXPOP BXPOP DXPOP CX RETSUB ENDP功能:输出16位数的每一位二进制位入口参数:BX出口参数:输出每位二进制数4 子程序设计方法v信息的保护与恢复v主程序向子程序传递参数的方式v练习返回本节返回本节信息的保护与恢复v例如CR PROC FARMOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H R
11、ETCR ENDP主程序主程序MOV AX,102HMOV BX,304HCALL CRADDAX,BX 寄存器相当于全局量,为了在调用子程序时不破坏它在原来主程序中内容,需要在子程序功能实现前,将子程序要用到的寄存器原有的内容保护起来,在子程序功能实现后,将取出原数据存回原寄存器。这就是信息的保护与恢复。信息的保护与恢复v修改CR PROC FAR PUSHAXPUSHDXMOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21HPOPDX POPAX RETCR ENDP主程序主程序MOV AX,102HMOV BX,304HCALL CRADDAX,BX 现
12、场保护现场恢复例.求两个数的最大公约数的子程序分析:辗转相除法分析:辗转相除法1、取两个正数、取两个正数M,N2、RM MOD N3、若、若R为为0则则 N为当前最大公约数,算法结为当前最大公约数,算法结束;否则,束;否则,MN,NR,转转2子程序名:子程序名:MSDST功能:求两个正数的最大公约数功能:求两个正数的最大公约数入口参数:入口参数:AX,BX放两个正数放两个正数出口参数:出口参数:CX放最大公约数放最大公约数寄存器占用:寄存器占用:AX,BX,CX,DX MSDST PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXAGAIN:XOR DX,DXDIV B
13、X /AX-商,DX-余数AND DX,DXJZ EXITMOV AX,BXMOV BX,DX JMP AGAINEXIT:MOV CX,BXPOP DXPOP BX POP AXRETMSDST ENDP新问题新问题?返回本节返回本节作为入口参数的寄存器可以进行现场保作为入口参数的寄存器可以进行现场保护与恢复,但一定要匹配;作为出口参护与恢复,但一定要匹配;作为出口参数的寄存器不能进行现场保护与恢复。数的寄存器不能进行现场保护与恢复。主程序向子程序传递参数的方式v参数的形式:数据本身(传值)数据的地址(传址)v传递的方法:(1)寄存器法(2)约定单元法(3)堆栈法(4)通过地址表传递参数入口
14、参数:主程序调用子程序前,将要加工的数据传给子程序出口参数:子程序执行完后,将结果传回主程序返回本节返回本节以求校验和为例以求校验和为例例.求校验和v子程序计算数组元素的“校验和”v校验和是指不记进位的累加入口参数:数组的逻辑地址(传址)元素个数(传值)出口参数:求和结果(传值)(1)寄存器法(2)约定单元法(3)堆栈法v把参数存于约定的寄存器中,可以传值,也可以传址。v子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护)v子程序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致入口参数:CX元素个数,DS:BX数组的段地址:偏移地址出口参数:AL校验和用寄存器传递参数
15、特点:特点:传递参数方便、直观传递参数方便、直观传递参数的个数有限传递参数的个数有限mov bx,offset array;BX数组的偏移地址mov cx,count;CX数组的元素个数call checksuma;调用求和过程mov result,al;处理出口参数主程序主程序Checksuma procxor al,al;累加器清0suma:add al,bx;求和inc bx;指向下一个字节loop sumaretChecksuma endp 子程序子程序v主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递v不同模块间共享时,需要声明入口参数:count元素个数,array
16、数组名(含段地址:偏移地址)出口参数:result校验和用变量传递参数特点:可传递多个参数特点:可传递多个参数call checksumb 主程序子程序checksumbprocpush axpush bxpush cxxor al,al;累加器清0mov bx,offset array;BX数组的偏移地址mov cx,count;CX数组的元素个数sumb:add al,bx;求和inc bxloop sumbmov result,al;保存校验和pop cxpop bxpop axretchecksumbendpv主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数v子程序将出口参数压
17、入堆栈,主程序弹出堆栈取得它们入口参数:顺序压入偏移地址和元素个数出口参数:AL校验和用堆栈传递参数mov ax,offset arraypush axmov ax,countpush axcall checksumcadd sp,4add sp,4add sp,4add sp,4mov result,al 主程序主程序子程序子程序Checksumc procpush bpmov bp,sp ;利用BP间接寻址存取参数push bxpush cxmov bx,bp+6 mov cx,bp+4 xor al,alsumc:add al,bx inc bxloop sumcpop cxpop bx
18、pop bpretretretretChecksumc endp 要要注注意意堆堆栈栈的的分分配配情情况况,保保证证参参数数存存取取正正确确、子子程程序序正正确确返返回回,并并保保持堆栈平衡持堆栈平衡4(1)寄存器法DATASEGMENTBCDBUF DB 56H,23H,74H,23H,67H DB 45H,28H,91H,83H,57HCOUNT EQU$-BCDBUFASCBUF DB 20 DUP(?)DATAENDSSTACK SEGNMENT PARA STACKSTAPN DB 20 DUP(?)TOP EQU LENGTH STAPNSTACK ENDSCODESEGMENTA
19、SSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOV AX,TOPMOVSP,AXLEASI,BCDBUFLEADI,ASCBUFMOVCX,COUNTCLDLP:LODSBMOVBL,ALANDAL,0FHORAL,30HMOVDL,ALSTOSBCALL DISPMOV AL,BLPUSHCXMOVCL,4SHRAL,CLORAL,30HMOVDL,ALSTOSBCALL DISPPOPCXLOOP LPMOVAX,4C00H INT21HDISPPROCMOVAH,2INT21HMOVDL
20、,MOVAH,2INT21HRETDISPENDPCODE ENDSENDSTART(2)约定单元法DATASEGMENTBCDBUF DB 56H,23H,74H,23H,67H DB 45H,28H,91H,83H,57HCOUNT EQU$-BCDBUFASCBUF DB 20 DUP(?)DATAENDSSTACK SEGNMENT PARA STACKSTAPN DB 20 DUP(?)TOP EQU LENGTH STAPNSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOV
21、AX,STACKMOVSS,AXMOV AX,TOPMOVSP,AXLEASI,BCDBUFLEADI,ASCBUFMOVCX,COUNTCLDLP:LODSBMOVBL,ALANDAL,0FHORAL,30H/MOVDL,ALSTOSBCALL DISPMOV AL,BLPUSHCXMOVCL,4SHRAL,CLORAL,30H/MOVDL,ALSTOSBCALL DISPPOPCXLOOP LPMOVAX,4C00H INT21HDISPPROCPUSHDIDECDIMOVDL,DIMOVAH,2INT21HPOPDIMOVDL,MOVAH,2INT21HRETDISPENDPCODE E
22、NDSENDSTART(3)堆栈法DATASEGMENTBCDBUF DB 56H,23H,74H,23H,67H DB 45H,28H,91H,83H,57HCOUNT EQU$-BCDBUFASCBUF DB 20 DUP(?)DATAENDSSTACK SEGNMENT PARA STACKSTAPN DB 20 DUP(?)TOP EQU LENGTH STAPNSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOV AX,TOPMOVSP,A
23、XLEASI,BCDBUFLEADI,ASCBUFMOVCX,COUNTCLDLP:LODSBMOVBL,ALANDAL,0FHORAL,30HMOVAH,0PUSHAXSTOSBCALL DISPMOV AL,BLPUSHCXMOVCL,4SHRAL,CLORAL,30H POPCXMOVAH,0PUSHAXSTOSBCALLDISPLOOP LPMOVAX,4C00H INT21HDISPPROCPOP DXMOVAH,2INT21HMOVDL,MOVAH,2INT21HRETDISPENDPCODE ENDSENDSTARTprog segmentorg 100hassume cs:pr
24、og,ds:prog,ss:progmainprocfarmov ax,progmovds,axmovss,axmovtable,offset arymovtable+2,offset countmovtable+4,offset summovbx,offset tablecallproaddretmainendpproaddprocnearpushaxpushcxpushsipushdimovsi,bxmovdi,bx+2通过地址表传递参数movcx,dimovdi,bx+4xorax,axnext:addax,siaddsi,2loopnextmovdi,axpopdipopsipopcx
25、popaxretproadd endparydw100 dup(?)countdw100sumdw?tabledw3 dup(?)progendsendmain练习sub1procnearpushdipushdxpushcxpushaxmovcx,0leadi,tbuffdec1:pushcxmovax,dxmovdx,0movcx,10divcxxchgax,dxaddal,30hmovdi,alincdipopcxinccxcmpdx,0;*jnzdec1dec2:decdimoval,dicallsuboutloopdec2pop axpopcxpopdxpopdiretsub1endp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 高级汇编语言和模块化程序设计 高级 汇编语言 模块化 程序设计
限制150内