汇编语言程序设计子程序结构.ppt
《汇编语言程序设计子程序结构.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计子程序结构.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、4.3 4.3 子程序结构子程序结构l经常用到的应用问题编写成一个通用子程序经常用到的应用问题编写成一个通用子程序l大型处理过程分解成小的较方便解决的模块大型处理过程分解成小的较方便解决的模块使用子程序的优点使用子程序的优点n使程序的结构更为清楚使程序的结构更为清楚n程序的维护更为方便程序的维护更为方便n有利于大程序开发时的多个程序员分工合作有利于大程序开发时的多个程序员分工合作对于汇编语言:对于汇编语言:子程序(子程序(SubroutineSubroutine)高高 级级 语语 言言:函函 数数(FunctionFunction)或或 过过 程程(ProcedureProcedure)14.
2、3.1 4.3.1 子程序指令子程序指令l子程序子程序与与主主程程序序分分开开的的、完完成成特特定功能的一段程序。定功能的一段程序。子子程程序序完完成成一一定定功功能能,它它需需要要主主程程序序调调用用它它。子子程程序序执执行行完完毕毕,还还需需要要返返回回到到调调用用它它的的主主程程序序去去继继续续执执行行主主程程序序的的后后续续指令。指令。CALL label主程序主程序RET子程序子程序回到回到CALL指令指令后的指令处后的指令处label2子子程程序序一一般般需需要要参参数数,主主程程序序调调用用子子程程序序前前,要要为为子子程程序序准准备好所需要的参数备好所需要的参数子程序要将对信息
3、处理的结果提供给调用它的主程序。子程序要将对信息处理的结果提供给调用它的主程序。l子程序的调用子程序的调用当当主主程程序序(调调用用程程序序)执执行行调调用用指指令令CALLCALL调调用用子子程程序序转到子程序去执行转到子程序去执行l子程序的返回子程序的返回子子程程序序(被被调调用用程程序序)执执行行返返回回指指令令RETRET,返返回回调调用用它的主程序它的主程序31.1.子程序调用指令子程序调用指令CALLCALL(1 1)功能)功能l CALLCALL指令用在主程序中,实现子程序的调用指令用在主程序中,实现子程序的调用l CPUCPU硬硬件件自自动动将将主主程程序序调调用用指指令令CA
4、LLCALL下下条条指指令令的的地地址址(返返回回地地址址)压压入入堆堆栈栈,以以便便子子程程序序执执行行完完毕后,还能够返回主程序继续执行。毕后,还能够返回主程序继续执行。(2 2)调用范围)调用范围l分成段内调用(近调用)分成段内调用(近调用):同一代码段内同一代码段内l和段间调用(远调用)和段间调用(远调用):整个存储空间:整个存储空间(3 3)寻址方式)寻址方式l目标地址采用相对寻址、直接寻址或间接寻址目标地址采用相对寻址、直接寻址或间接寻址 4(4 4)格式)格式 CALL labelCALL label ;调用标号指定的子程序调用标号指定的子程序 CALL reg16/reg32C
5、ALL reg16/reg32;调用寄存器指定地址的子程序调用寄存器指定地址的子程序 CALL mem16/mem32CALL mem16/mem32;调用存储单元指定地址的子程序调用存储单元指定地址的子程序注意:注意:u对于段内调用,只修要将调用的段内偏移地址压入堆栈对于段内调用,只修要将调用的段内偏移地址压入堆栈 实地址模式,实地址模式,1616位的偏移地址位的偏移地址 保护模式,保护模式,3232位的偏移地址位的偏移地址u对于段间调用,需要保护偏移地址对于段间调用,需要保护偏移地址IPIP(EIPEIP)和和CSCS实实地地址址模模式式,需需要要将将1616位位偏偏移移地地址址IPIP,
6、1616位位段段基基地地址址CSCS压压入入堆堆栈;栈;需需要要保保护护3232位位的的偏偏移移地地址址EIPEIP和和段段选选择择器器CSCS,CSCS被被进进行行0 0扩扩展展变变为为3232为压入堆栈为压入堆栈52.2.子程序返回指令子程序返回指令RETRET(1 1)功能功能RETRET指令用在子程序结束,实现返回主程序指令用在子程序结束,实现返回主程序。(2 2)格式)格式 RET RET;无参数返回,自动从堆栈弹出返回地址。无参数返回,自动从堆栈弹出返回地址。l如如果果定定义义的的是是短短过过程程(子子程程序序),则则是是段段内内调调用用,只只弹弹出出段内偏移地址段内偏移地址IPI
7、P(或(或EIPEIP)。l如如果果定定义义的的是是远远过过程程(子子程程序序),则则是是段段间间调调用用,需需要要弹弹出出CSCS和偏移地址。和偏移地址。实模式,实模式,1616位的位的CSCS,1616位的偏移地址送位的偏移地址送IPIP,保保护护模模式式,弹弹出出3232位位,高高1616位位是是CSCS的的0 0扩扩展展丢丢去去,低低1616位位送送CSCS,再再弹出弹出3232位偏移地址送位偏移地址送EIPEIP。6 RET i16 RET i16;有参数返回有参数返回,返回主程序与返回主程序与RETRET指令同,指令同,增加的功能增加的功能将堆栈指针进行修改:将堆栈指针进行修改:8
8、0868086及及IA-32IA-32实地址:实地址:SPSP+i16SPSP+i16 IA-32IA-32保护模式保护模式:ESPESPESPESPi16i16当使用堆栈向子程序传递参数时,该返回指令较有用。当使用堆栈向子程序传递参数时,该返回指令较有用。子子程程序序时时段段内内还还是是段段间间返返回回,在在子子程程序序设设计计时时由由过过程程定义伪指令通过属性参数指定定义伪指令通过属性参数指定NEAR NEAR 段内段内 FAR FAR 段间段间73.3.过程定义伪指令过程定义伪指令X86X86的的汇汇编编语语言言,需需要要利利用用过过程程定定义义伪伪指指令令来来定定义义子子程序(定义过程
9、)程序(定义过程)及其属性。及其属性。(1 1)过程定义伪指令的功能)过程定义伪指令的功能定定义义一一个个过过程程(子子程程序序),说说明明是是短短调调用用还还是是长长调调用用子程序子程序 MASM MASM利用过程定义伪指令获得子程序信息利用过程定义伪指令获得子程序信息 8(2 2)格式)格式过程名过程名PROC PROC 属性参数属性参数;子程序代码子程序代码过程名过程名ENDPENDP过程名为符合语法的标识符,与标号的定义相同过程名为符合语法的标识符,与标号的定义相同。子程序调用时,就是用该名称调用对应的子程序子程序调用时,就是用该名称调用对应的子程序 PROC PROC后面可加参数:后
10、面可加参数:NEARNEAR或或FARFARNEARNEAR段内调用的子程序段内调用的子程序,默认为默认为NEARNEAR。FAR FAR 段间调用的子程序段间调用的子程序在在简简化化段段定定义义源源程程序序格格式式中中,通通常常不不需需指指定定子子程程序序的属性,使用默认属性。的属性,使用默认属性。9例例4-144-14子程序调用程序子程序调用程序1 1;代码段,主程序代码段,主程序0000000000000000B8 00000001 B8 00000001 mov eax,1 mov eax,10000000500000005BD 00000005BD 00000005 mov ebp,
11、5 mov ebp,50000000A0000000AE8 00000016E8 00000016 call subpcall subp;调用调用0000000F0000000FB9 00000003 B9 00000003 retp1:mov ecx,3 retp1:mov ecx,3;返回位置返回位置0000001400000014BA 00000004 BA 00000004 retp2:mov edx,4retp2:mov edx,40000001900000019E8 00000000 EE8 00000000 E call disprdcall disprd ;调用;调用注:注:d
12、isprddisprd为显示子程序。为显示子程序。10例例4-144-14子程序调用程序子程序调用程序2 2;子程序子程序subpsubpprocproc;过程定义,过程名为过程定义,过程名为subpsubppush ebppush ebpmov ebp,espmov ebp,espmov esi,ebp+4mov esi,ebp+4 ;ESI ;ESICALLCALL下条指令下条指令(标号标号RETP1)RETP1)偏移地址偏移地址mov edi,offset retp2mov edi,offset retp2 ;EDI ;EDI标号标号RETP2RETP2的偏移地址的偏移地址mov ebx
13、,2mov ebx,2pop ebppop ebp;弹出堆栈,保持堆栈平衡弹出堆栈,保持堆栈平衡retret;子程序返回子程序返回subpsubpendpendp;过程结束过程结束子子程程序序的的调调用用和和返返回回都都要要操操作作堆堆栈栈保保护护返返回回地地址址、弹弹出出返回地址。返回地址。11124.3.2 4.3.2 子程序设计子程序设计l子程序的编写方法与主程序一样子程序的编写方法与主程序一样l但需要留意几个问题:但需要留意几个问题:u利用过程定义,获得子程序名和调用属性利用过程定义,获得子程序名和调用属性uCALLCALL指令调用子程序,指令调用子程序,RETRET指令返回主程序指令
14、返回主程序u堆栈压入和弹出操作要成对使用,保持堆栈平衡堆栈压入和弹出操作要成对使用,保持堆栈平衡u子程序子程序开始开始要要保护寄存器,返回前相应恢复保护寄存器,返回前相应恢复u子程序子程序安排在代码段的主程序之外安排在代码段的主程序之外u子程序允许嵌套和递归子程序允许嵌套和递归最好有完整的注释最好有完整的注释难点是参数传递难点是参数传递13例例4-154-15十六进制显示程序十六进制显示程序1 1mov eax,1234abcdhmov eax,1234abcdh;假设一个数据假设一个数据,十六进制,十六进制xor ebx,ebxxor ebx,ebxmov ecx,8mov ecx,8;8
15、8位十六进制数位十六进制数again:again:rol eax,4rol eax,4;高高4 4位循环移位进入低位循环移位进入低4 4位位push eaxpush eax;保护保护eax,eax,也可用也可用mov edx,eaxmov edx,eax保护保护call htoasccall htoasc;调用子程序调用子程序mov regd+4ebx,almov regd+4ebx,al;保存转换后的保存转换后的ASCIIASCII码码pop eaxpop eax;mov eax,edxmov eax,edxinc ebxinc ebxdec ecxdec ecxjnz againjnz a
16、gainmov eax,offset regdmov eax,offset regdcall dispmsgcall dispmsg;显示显示regd byte EAX=,8 dup(0),H,014例例4-154-15十六进制显示程序十六进制显示程序2 2;子程序子程序htoaschtoascprocproc;默认属性,;默认属性,NEARNEAR;将将ALAL低低4 4位表达的一位十六进制数转换为位表达的一位十六进制数转换为ASCIIASCII码码and al,0fhand al,0fh;只取只取ALAL的低的低4 4位位or al,30hor al,30h;AL;AL高高4 4位变成位变
17、成3 3cmp al,39hcmp al,39h;是是0 09 9,还是,还是A AF Fjbe htoendjbe htoend;无符号数比较后,不高于;无符号数比较后,不高于39H39Hadd al,7add al,7;是是A AF F,ASCIIASCII码再加上码再加上7 7htoend:htoend:retret;子程序返回子程序返回htoaschtoascendpendp;过程定义结束;过程定义结束 END END ;汇编语言原程序结束;汇编语言原程序结束15例例4-154-15十六进制显示程序十六进制显示程序3 3也可以使用查表方法进行转换。也可以使用查表方法进行转换。;子程序子
18、程序htoaschtoascproc proc and eax,0fhand eax,0fh;取取ALAL低低4 4位位mov al,ASCIIeaxmov al,ASCIIeax;换码换码retret;子程序的局部数据(只读)子程序的局部数据(只读)ASCIIASCIIbyte 0123456789ABCDEFbyte 0123456789ABCDEFhtoaschtoascendpendpEAX=1234ABCDH运行结果还可以使用还可以使用换码指令换码指令XLAT查表查表164.3.3 4.3.3 参数传递参数传递l主程序与子程序间通过参数传递建立联系主程序与子程序间通过参数传递建立联系
19、n入口参数入口参数(输入参数输入参数):主程序:主程序子程序子程序n出口参数出口参数(输出参数输出参数):子程序:子程序主程序主程序l传递传递参数参数的多少反映程序模块间的耦合程度的多少反映程序模块间的耦合程度l参数的具体内容参数的具体内容n数据本身(传递数值)数据本身(传递数值)n数据的存储地址(传递地址,传递引用)数据的存储地址(传递地址,传递引用)l参数传递方法参数传递方法n寄存器:约定参数存放在某个或几个寄存器中寄存器:约定参数存放在某个或几个寄存器中n变量:利用定义的变量变量:利用定义的变量n堆栈:利用堆栈堆栈:利用堆栈171.1.寄存器传递参数寄存器传递参数l最简单和常用的参数传递
20、方法最简单和常用的参数传递方法l把参数存于约定的寄存器把参数存于约定的寄存器n少量数据直接传递数值少量数据直接传递数值n大量数据只能传递地址大量数据只能传递地址需要注意:需要注意:l带有出口参数的寄存器不能保护和恢复带有出口参数的寄存器不能保护和恢复l带带有有入入口口参参数数的的寄寄存存器器可可以以保保护护、也也可可以以不不保保护护,但但最最好好能够保持一致能够保持一致18例例4-164-16有符号十进制数显示程序有符号十进制数显示程序1 1转换的算法如下:转换的算法如下:(1 1)首首先先判判断断数数据据是是零零、正正数数或或负负数数,是是零零显显示示“0”“0”退出退出(2 2)是负数,显
21、示负号)是负数,显示负号“”,求数据的绝对值,求数据的绝对值(3 3)接接着着数数据据除除以以1010,余余数数为为十十进进制制数数码码,加加30H30H转换为转换为ASCIIASCII码保存码保存(4 4)重复()重复(3 3)步,直到商为)步,直到商为0 0结束结束(5 5)依次从高位开始显示各位数字)依次从高位开始显示各位数字19例例4-164-16有符号十进制数显示程序有符号十进制数显示程序2 2;数据段数据段arrayarraydword 1234567890,-1234,0,1,.dword 1234567890,-1234,0,1,.writebufwritebuf byte 1
22、2 dup(0)byte 12 dup(0);显示缓冲区显示缓冲区;代码段代码段mov ecx,lengthof arraymov ecx,lengthof arraymov ebx,0mov ebx,0again:again:mov mov eaxeax,arrayebx*4,arrayebx*4 ;EAX;EAX入口参数入口参数call writecall write;调用子程序,显示一个数据调用子程序,显示一个数据call dispcrlfcall dispcrlf;换行以便显示下一个数据换行以便显示下一个数据inc ebxinc ebxdec ecxdec ecxjnz againjn
23、z again寄存器传递参数寄存器传递参数20例例4-164-16有符号十进制数显示程序有符号十进制数显示程序3 3;显示有符号十进制数的子程序显示有符号十进制数的子程序writewriteprocproc;EAX;EAX入口参数入口参数push ebxpush ebx;保护寄存器保护寄存器push ecxpush ecxpush edxpush edxmov ebx,offset writebufmov ebx,offset writebuf ;EBX ;EBX指向显示缓冲区指向显示缓冲区test test eax,eaxeax,eax;判断数据是零、正数或负数判断数据是零、正数或负数jnz
24、 write1jnz write1;不是零,跳转不是零,跳转mov byte ptr ebx,0mov byte ptr ebx,0;是零,设置是零,设置“0”“0”inc ebxinc ebxjmp write5jmp write5;转向显示转向显示write1:write1:jns write2jns write2;是正数,跳转是正数,跳转mov byte ptr ebx,-mov byte ptr ebx,-;是负数,设置负号是负数,设置负号inc ebxinc ebxneg eaxneg eax;数据求补(绝对值)数据求补(绝对值)寄存器传递参数寄存器传递参数21例例4-164-16有
25、符号十进制数显示程序有符号十进制数显示程序4 4write2:write2:mov ecx,10mov ecx,10push ecxpush ecx;10;10压入堆栈,作为退出标志压入堆栈,作为退出标志write3:write3:cmp eax,0cmp eax,0;数据(商)为零,转向保存数据(商)为零,转向保存jz write4 jz write4 xor edx,edxxor edx,edx;零位扩展被除数为零位扩展被除数为EDX.EAXEDX.EAXdiv ecxdiv ecx;数据除以数据除以1010:EDX.EAX10EDX.EAX10add edx,30hadd edx,30h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 子程序 结构
限制150内