版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5 5章章 模块化程序设计模块化程序设计5.1 5.1 子程序构造子程序构造5.2 5.2 参数传送参数传送5.3 5.3 多模块程序构造多模块程序构造5.4 5.4 宏构造宏构造第第5 5章章 模块化程序设计模块化程序设计问题的引入问题的引入子程序、文件包含、宏汇编等各种多子程序、文件包含、宏汇编等各种多模块编程的方法模块编程的方法第第5 5章章 模块化程序设计模块化程序设计例例1: 1: 利用利用C C言语编写计算言语编写计算c=a+bc=a+b #include stdafx.h #include stdio.h int main(int argc, char* argv) int
2、a,b,c; a=1; b=2; c=a+b; printf(“c=%dn,c); return 0; #include stdafx.h #include stdio.h int main(int argc, char* argv) int a,b,c; a=1; b=2; c=a+b; printf(“c=%dn,c); return 0; 第第5 5章章 模块化程序设计模块化程序设计data segmenta db ?b db ?c db ?string db c=$data endscode segmentmain proc far assume cs:code, ds:data, e
3、s:datastart: push ds sub ax,ax push ax mov ax,data mov ds,ax mov es,ax mov a,1 mov b,2 mov al,a add al,b mov c,al lea dx,string mov ah,09 int 21h add c,30h mov dl,c mov ah,2 int 21h mov dl,0ah int 21h mov dl,0dh int 21h retmain endpcode ends end start例例2 2:用汇编编写:用汇编编写:第第5 5章章 模块化程序设计模块化程序设计5.1 5.1 子
4、程序构造子程序构造经常用到的运用问题编写成一个通用子程序经常用到的运用问题编写成一个通用子程序大型处置过程分解成可以处理的模块大型处置过程分解成可以处理的模块运用子程序可以运用子程序可以使程序的构造更为清楚使程序的构造更为清楚程序的维护更为方便程序的维护更为方便有利于大程序开发时的多个程序员分工协作有利于大程序开发时的多个程序员分工协作子程序子程序Subroutine函数函数Function过程过程Procedure第第5 5章章 模块化程序设计模块化程序设计5.1.1 5.1.1 子程序指令子程序指令子程序子程序与主程序分开、完成与主程序分开、完成特定功能的一段程序特定功能的一段程序主程序主
5、程序( (调用程序调用程序) )执行调用指令执行调用指令CALLCALL调调用子程序用子程序子程序子程序( (被调用程序被调用程序) )执行前往指令执行前往指令RETRET前往前往主程序主程序CALL label主程序主程序RET子程序子程序回到回到CALL指令后指令后的指令处的指令处-断点断点第第5 5章章 模块化程序设计模块化程序设计1. 1. 子程序调用指令子程序调用指令CALLCALLCALLCALL指令用在主程序中,实现子程序的调用指令用在主程序中,实现子程序的调用分成段内调用近调用和段间调用远调用分成段内调用近调用和段间调用远调用目的地址采用相对寻址、直接寻址或间接寻址目的地址采用
6、相对寻址、直接寻址或间接寻址入栈前往地址:将入栈前往地址:将CALLCALL下条指令的地址压入堆栈下条指令的地址压入堆栈CALL labelCALL label; ;调用标号指定的子程序调用标号指定的子程序CALL reg32/reg16CALL reg32/reg16; ;调用存放器指定地址的子程序调用存放器指定地址的子程序CALL mem48/mem32/mem16CALL mem48/mem32/mem16; ;调用存储单元指定地址的子程序调用存储单元指定地址的子程序CSEIPStackCALL第第5 5章章 模块化程序设计模块化程序设计2. 2. 子程序前往指令子程序前往指令RETRE
7、TRETRET指令用在子程序终了,实现前往主程序指令用在子程序终了,实现前往主程序RETRET; ;无参数前往:出栈前往地址无参数前往:出栈前往地址RET i16RET i16; ;有参数前往:出栈前往地址有参数前往:出栈前往地址;ESPESP;ESPESPi16i16CSEIPStackCALLRET第第5 5章章 模块化程序设计模块化程序设计3. 3. 过程定义伪指令过程定义伪指令MASMMASM利用过程定义伪指令获得子程序信息利用过程定义伪指令获得子程序信息 过程名过程名PROCPROC ; ;过程体过程体过程名过程名ENDPENDP; ;过程名为符合语法的标识符过程名为符合语法的标识符
8、PROCPROC后面可加参数:后面可加参数:NEARNEAR或或FARFAR简化段定义源程序格式中,通常不需指定简化段定义源程序格式中,通常不需指定第第5 5章章 模块化程序设计模块化程序设计例例5-15-1子程序调用程序子程序调用程序1 1; ;代码段,主程序代码段,主程序0000000000000000B8 00000001B8 00000001 mov eax,1 mov eax,10000000500000005BD 00000005BD 00000005 mov ebp,5 mov ebp,50000000A0000000AE8 00000016E8 00000016 call su
9、bp; call subp;子程序调子程序调用用0000000F0000000FB9 00000003 retp1: mov ecx,3B9 00000003 retp1: mov ecx,30000001400000014BA 00000004 retp2: mov edx,4BA 00000004 retp2: mov edx,40000001900000019E8 00000000 EE8 00000000 E call disprd call disprd ; ;代码段,子程序代码段,子程序000000250000002500000025 subp proc00000025 subp
10、procoffset retp1StackCALL第第5 5章章 模块化程序设计模块化程序设计例例5-15-1子程序调用程序子程序调用程序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标号标
11、号RETP2RETP2的偏移地址的偏移地址mov ebx,2mov ebx,2pop ebppop ebp; ;弹出堆栈,坚持堆栈平衡弹出堆栈,坚持堆栈平衡retret; ;子程序前往子程序前往subpsubpendpendp; ;过程终了过程终了MOV EBP+4,EDIMOV EBP+4,EDI表示图表示图第第5 5章章 模块化程序设计模块化程序设计子程序调用的堆栈子程序调用的堆栈retp1EBPStackCALL SUBPRETPUSH EBP低地址低地址高地址高地址POP EBPESP=EBP第第5 5章章 模块化程序设计模块化程序设计5.1.2 5.1.2 子程序设计子程序设计子程序
12、的编写方法与主程序一样子程序的编写方法与主程序一样但需求留意几个问题:但需求留意几个问题:利用过程定义,获得子程序名和调用属性利用过程定义,获得子程序名和调用属性RETRET指令前往主程序,指令前往主程序,CALLCALL指令调用子程序指令调用子程序压入和弹出操作要成对运用,坚持堆栈平衡压入和弹出操作要成对运用,坚持堆栈平衡开场维护存放器,前往前相应恢复开场维护存放器,前往前相应恢复安排在代码段的主程序之外安排在代码段的主程序之外子程序允许嵌套和递归子程序允许嵌套和递归第第5 5章章 模块化程序设计模块化程序设计例例5-25-2回车换行子程序回车换行子程序dpcrlfdpcrlfprocpro
13、c; ;回车换行子程序回车换行子程序push eaxpush eax; ;维护存放器维护存放器mov al,0dhmov al,0dh; ;输出回车字符输出回车字符call dispccall dispc; ;子程序中调用子程序,实现子程序嵌套子程序中调用子程序,实现子程序嵌套mov al,0ahmov al,0ah; ;输出换行字符输出换行字符call dispccall dispcpop eaxpop eax; ;恢复存放器恢复存放器retret; ;子程序前往子程序前往dpcrlfdpcrlfendpendp第第5 5章章 模块化程序设计模块化程序设计5.2 5.2 参数传送参数传送主程
14、序与子程序间经过参数传送建立联络主程序与子程序间经过参数传送建立联络入口参数入口参数( (输入参数输入参数) ):主程序:主程序子程序子程序出口参数出口参数( (输出参数输出参数) ):子程序:子程序主程序主程序传送参数的多少反映程序模块间的耦合程度传送参数的多少反映程序模块间的耦合程度参数的详细内容参数的详细内容数据本身传送数值数据本身传送数值数据的存储地址传送地址,传送援用数据的存储地址传送地址,传送援用参数传送方法参数传送方法存放器存放器变量变量堆栈堆栈第第5 5章章 模块化程序设计模块化程序设计求校验和求校验和子程序计算数组元素的“校验和校验和是指不记进位的累加入口参数:数组的偏移地址
15、传址元素个数传值出口参数:求和结果传值第第5 5章章 模块化程序设计模块化程序设计把参数存于商定的存放器中,可以传值,把参数存于商定的存放器中,可以传值,也可以传址。也可以传址。子程序对带有出口参数的存放器不能维护子程序对带有出口参数的存放器不能维护和恢复主程序视详细情况进展维护和恢复主程序视详细情况进展维护子程序对带有入口参数的存放器可以维护,子程序对带有入口参数的存放器可以维护,也可以不维护;但最好一致也可以不维护;但最好一致例例a a入口参数:入口参数:ECXECX元素个数,元素个数,EBXEBX数组的偏移地址数组的偏移地址出口参数:出口参数:ALAL校验和校验和用存放器传送参数用存放器
16、传送参数第第5 5章章 模块化程序设计模块化程序设计; ;数据段数据段arrayarraybyte 32,78,56,.byte 32,78,56,.countcountequ $-arrayequ $-arrayresultresultbyte ?byte ?; ;代码段,设置入口参数代码段,设置入口参数mov ebx,offset arraymov ebx,offset array;EBX;EBX数组的偏移地址数组的偏移地址mov ecx,countmov ecx,count;ECX;ECX数组的元素个数数组的元素个数call checksumacall checksuma; ;调用求和过
17、程调用求和过程mov result,almov result,al; ;处置出口参数处置出口参数例例a a 主程序主程序第第5 5章章 模块化程序设计模块化程序设计checksumachecksumaprocprocxor al,alxor al,al; ;累加器清累加器清0 0suma:suma:add al,ebxadd al,ebx; ;求和求和inc ebxinc ebx; ;指向下一个字节指向下一个字节loop sumaloop sumaretretchecksumachecksumaendpendpendend例例a a 子程序子程序第第5 5章章 模块化程序设计模块化程序设计主程
18、序和子程序直接采用同一个变量名共主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传送享同一个变量,实现参数的传送不同模块间共享时,需求声明不同模块间共享时,需求声明例例b b入口参数:入口参数:countcount元素个数,元素个数,arrayarray数组名偏移地址数组名偏移地址出口参数:出口参数:resultresult校验和校验和用变量传送参数用变量传送参数第第5 5章章 模块化程序设计模块化程序设计; ;数据段数据段arrayarraybyte 32,78,56,.byte 32,78,56,.countcountdword $-arraydword $-arrayresu
19、ltresultbyte ?byte ?; ;主程序主程序 call checksumbcall checksumb; ;子程序子程序checksumbchecksumbprocprocpush eaxpush eaxpush ebxpush ebxpush ecxpush ecx例例b b1/21/2第第5 5章章 模块化程序设计模块化程序设计xor al,alxor al,al; ;累加器清累加器清0 0mov ebx,offset arraymov ebx,offset array;EBX;EBX偏移地址偏移地址mov ecx,countmov ecx,count;ECX;ECX元素个数
20、元素个数sumb:sumb:add al,ebxadd al,ebx; ;求和求和inc ebxinc ebxloop sumbloop sumbmov result,almov result,al; ;保管校验和保管校验和pop ecxpop ecxpop ebxpop ebxpop eaxpop eaxretretchecksumbchecksumbendpendp例例b b2/22/2第第5 5章章 模块化程序设计模块化程序设计主程序将子程序的入口参数压入堆栈,子主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出子程序将出口参
21、数压入堆栈,主程序弹出堆栈获得它们堆栈获得它们例例c c入口参数:入口参数:顺序压入偏移地址和元素个数顺序压入偏移地址和元素个数出口参数:出口参数:ALAL校验和校验和用堆栈传送参数用堆栈传送参数第第5 5章章 模块化程序设计模块化程序设计 ; ;数据段数据段arrayarray byte 32,78,56,. byte 32,78,56,.countcount equ $-array equ $-arrayresultresult byte ? byte ? mov eax,offset array mov eax,offset array push eax push eax mov eax
22、,count mov eax,count push eax push eax call checksumc call checksumc add esp,8 add esp,8 mov result,al mov result,al例例c c 主程序主程序offset arraycountEIPStackPUSH AXPUSH AXCALL第第5 5章章 模块化程序设计模块化程序设计checksumcchecksumc procprocpush ebppush ebpmov ebp,espmov ebp,esp;EBP;EBP间接寻址存取参数间接寻址存取参数push ebxpush ebxpu
23、sh ecxpush ecxmov ebx,ebp+12mov ebx,ebp+12; ;偏移地址偏移地址mov ecx,ebp+8mov ecx,ebp+8; ;元素个数元素个数例例c c 子程序子程序-1/2-1/2offset arraycountEIPEBPStackPUSH+4+8+12第第5 5章章 模块化程序设计模块化程序设计xor al,alxor al,alsumc:sumc:add al,ebxadd al,ebxinc ebxinc ebxloop sumcloop sumcpop ecxpop ecxpop ebxpop ebxpop ebppop ebpretretc
24、hecksumcchecksumcendpendp例例c c 子程序子程序-2/2-2/2offset arraycountEIPEBPStackPOP第第5 5章章 模块化程序设计模块化程序设计5.2.1 5.2.1 存放器传送参数存放器传送参数最简单和常用的参数传送方法最简单和常用的参数传送方法把参数存于商定的存放器把参数存于商定的存放器少量数据直接传送数值少量数据直接传送数值大量数据只能传送地址大量数据只能传送地址带有出口参数的存放器不能维护和恢复带有出口参数的存放器不能维护和恢复带有入口参数的存放器可以维护、也可以不维带有入口参数的存放器可以维护、也可以不维护,但最好可以坚持一致护,但
25、最好可以坚持一致第第5 5章章 模块化程序设计模块化程序设计例例5-35-3十六进制显示程序十六进制显示程序1 1mov eax, 1234abcdhmov eax, 1234abcdh; ;假设一个数据假设一个数据xor ebx,ebxxor ebx,ebxmov ecx,8mov ecx,8;8;8位十六进制数位十六进制数again:again:rol eax,4rol eax,4; ;高高4 4位循环移位进入低位循环移位进入低4 4位位push eaxpush eax;mov edx,eax;mov edx,eaxcall htoasccall htoasc; ;调用子程序调用子程序mo
26、v regd+4ebx,almov regd+4ebx,al; ;保管转换后的保管转换后的ASCIIASCII码码pop eaxpop eax;mov eax,edx;mov eax,edxinc ebxinc ebxdec ecxdec ecxjnz againjnz againmov eax,offset regdmov eax,offset regdcall dispmsgcall dispmsg; ;显示显示regd byte EAX=,8 dup(0),H,0第第5 5章章 模块化程序设计模块化程序设计例例5-35-3十六进制显示程序十六进制显示程序2 2; ;子程序子程序htoas
27、chtoascprocproc; ;将将ALAL低低4 4位表达的一位十六进制数转换为位表达的一位十六进制数转换为ASCIIASCII码码and al,0fhand al,0fh; ;只取只取ALAL的低的低4 4位位or al,30hor al,30h;AL;AL高高4 4位变成位变成3 3cmp al,39hcmp al,39h; ;是是0 09 9,还是,还是A AF Fjbe htoendjbe htoendadd al,7add al,7; ;是是A AF F,ASCIIASCII码再加上码再加上7 7htoend:htoend: retret; ;子程序前往子程序前往htoasch
28、toascendpendp第第5 5章章 模块化程序设计模块化程序设计例例5-35-3十六进制显示程序十六进制显示程序3 3; ;子程序子程序htoaschtoascproc proc and eax,0fhand eax,0fh; ;取取ALAL低低4 4位位mov al,ASCIIeaxmov al,ASCIIeax; ;换码换码retret; ;子程序的部分数据只读子程序的部分数据只读ASCIIASCIIbyte 0123456789ABCDEFbyte 0123456789ABCDEFhtoaschtoascendpendpEAX=1234ABCDH运转结果第第5 5章章 模块化程序设
29、计模块化程序设计例例5-45-4有符号十进制数显示程序有符号十进制数显示程序1 1转换的算法如下:转换的算法如下:1 1首先判别数据是零、正数或负数,是零首先判别数据是零、正数或负数,是零显示显示“0“0退出退出2 2是负数,显示负号是负数,显示负号“,求数据的绝,求数据的绝对值对值3 3接着数据除以接着数据除以1010,余数为十进制数码,余数为十进制数码,加加30H30H转换为转换为ASCIIASCII码保管码保管4 4反复第反复第3 3步,直到商为步,直到商为0 0终了终了5 5依次从高位开场显示各位数字依次从高位开场显示各位数字第第5 5章章 模块化程序设计模块化程序设计例例5-45-4
30、有符号十进制数显示程序有符号十进制数显示程序2 2; ;数据段数据段arrayarraydword 1234567890,-1234,0,1,.dword 1234567890,-1234,0,1,.writebufwritebuf byte 12 dup(0)byte 12 dup(0); ;显示缓冲区显示缓冲区; ;代码段代码段mov ecx,lengthof arraymov ecx,lengthof arraymov ebx,0mov ebx,0again:again:mov eax,arrayebxmov eax,arrayebx* *4 ;EAX4 ;EAX入口参数入口参数call
31、 writecall write; ;调用子程序,显示一个数据调用子程序,显示一个数据call dispcrlfcall dispcrlf; ;换行以便显示下一个数据换行以便显示下一个数据inc ebxinc ebxdec ecxdec ecxjnz againjnz again第第5 5章章 模块化程序设计模块化程序设计例例5-45-4有符号十进制数显示程序有符号十进制数显示程序3 3; ;显示有符号十进制数的子程序显示有符号十进制数的子程序writewriteprocproc;EAX;EAX入口参数入口参数push ebxpush ebx; ;维护存放器维护存放器push ecxpush
32、ecxpush edxpush edxmov ebx,offset writebuf ;EBXmov ebx,offset writebuf ;EBX指向显示缓冲区指向显示缓冲区test eax,eaxtest eax,eax; ;判别数据是零、正数或负数判别数据是零、正数或负数jnz write1jnz write1; ;不是零,跳转不是零,跳转mov byte ptr ebx,0mov byte ptr ebx,0; ;是零,设置是零,设置“0“0inc ebxinc ebxjmp write5jmp write5; ;转向显示转向显示write1:write1: jns write2jn
33、s write2; ;是正数,跳转是正数,跳转第第5 5章章 模块化程序设计模块化程序设计例例5-45-4有符号十进制数显示程序有符号十进制数显示程序4 4mov byte ptr ebx,- ;mov byte ptr ebx,- ;是负数,设置负号是负数,设置负号inc ebxinc ebxneg eaxneg eax; ;数据求补绝对值数据求补绝对值write2:write2:mov ecx,10mov ecx,10push ecxpush ecx;10;10压入堆栈,作为退出标志压入堆栈,作为退出标志write3:write3:cmp eax,0cmp eax,0; ;数据商为零,转向
34、保管数据商为零,转向保管jz write4 jz write4 xor edx,edxxor edx,edx; ;零位扩展被除数为零位扩展被除数为EDX.EAXEDX.EAXdiv ecxdiv ecx; ;数据除以数据除以1010:EDX.EAXEDX.EAX1010add edx,30hadd edx,30h; ;余数余数0 09 9转换为转换为ASCIIASCII码码push edxpush edx; ;数据先低位后高位压入堆栈数据先低位后高位压入堆栈jmp write3jmp write3第第5 5章章 模块化程序设计模块化程序设计例例5-45-4有符号十进制数显示程序有符号十进制数显
35、示程序5 5write4:write4:pop edxpop edx; ;数据先高位后低位弹出堆栈数据先高位后低位弹出堆栈cmp edx,ecxcmp edx,ecx; ;是终了标志是终了标志1010,转向显示,转向显示je write5je write5mov ebx,dlmov ebx,dl; ;数据保管到缓冲区数据保管到缓冲区inc ebxinc ebxjmp write4jmp write4write5:write5:mov byte ptr ebx,0mov byte ptr ebx,0 ; ;显示内容加上结尾标志显示内容加上结尾标志mov eax,offset writebufmo
36、v eax,offset writebufcall dispmsgcall dispmsgpop edxpop edx; ;恢复存放器恢复存放器pop ecxpop ecxpop ebxpop ebxretret; ;子程序前往子程序前往writewriteendpendp第第5 5章章 模块化程序设计模块化程序设计5.2.2 5.2.2 共享变量传送参数共享变量传送参数子程序和主程序运用同一个变量名存取数据子程序和主程序运用同一个变量名存取数据假设变量定义和运用不在同一个程序模块中,假设变量定义和运用不在同一个程序模块中,需求利用需求利用PUBLICPUBLIC、EXTRENEXTREN声明
37、声明共享变量传送参数,子程序的通用性较差共享变量传送参数,子程序的通用性较差特别适宜在多个程序段间、尤其在不同的程序特别适宜在多个程序段间、尤其在不同的程序模块间传送数据模块间传送数据第第5 5章章 模块化程序设计模块化程序设计例例5-55-5二进制输入程序二进制输入程序1 1; ;数据段数据段countcount= 5= 5arrayarraydword count dup(0)dword count dup(0)temptempdword ?dword ?; ;共享变量共享变量; ;代码段,主程序代码段,主程序mov ecx,countmov ecx,countmov ebx,offset
38、 arraymov ebx,offset arrayagain:again:call rdbdcall rdbd; ;调用子程序,输入一个数据调用子程序,输入一个数据mov eax,tempmov eax,temp; ;获得出口参数获得出口参数mov ebx,eaxmov ebx,eax; ;存放到数据缓冲区存放到数据缓冲区add ebx,4add ebx,4loop againloop again第第5 5章章 模块化程序设计模块化程序设计例例5-55-5二进制输入程序二进制输入程序2 2; ;代码段,子程序代码段,子程序rdbdrdbdprocproc; ;二进制输入子程序二进制输入子程序
39、push eaxpush eax; ;出口参数:共享变量出口参数:共享变量TEMPTEMPpush ebxpush ebx push ecxpush ecxrdbd1:rdbd1:xor ebx,ebxxor ebx,ebx;EBX;EBX用于存放二进制结果用于存放二进制结果mov ecx,32mov ecx,32; ;限制输入字符的个数限制输入字符的个数rdbd2:rdbd2:call readccall readc; ;输入一个字符输入一个字符cmp al,0cmp al,0; ;检测键入字符能否合法检测键入字符能否合法jb rderrjb rderr; ;不合法那么前往重新输入不合法那么
40、前往重新输入cmp al,1cmp al,1ja rderrja rderr第第5 5章章 模块化程序设计模块化程序设计例例5-55-5二进制输入程序二进制输入程序3 3sub al,0sub al,0; ;对输入的字符进展转化对输入的字符进展转化shl ebx,1shl ebx,1;EBX;EBX的值乘以的值乘以2 2or bl,alor bl,al;BL;BL和和ALAL相加相加loop rdbd2loop rdbd2; ;循环键入字符循环键入字符mov temp,ebxmov temp,ebx; ;把二进制结果存放把二进制结果存放TEMPTEMP前往前往call dispcrlfcall
41、 dispcrlf; ;分行分行pop ecxpop ecxpop ebxpop ebxpop eaxpop eaxretret第第5 5章章 模块化程序设计模块化程序设计例例5-55-5二进制输入程序二进制输入程序4 4rderr:rderr:mov eax,offset errmsgmov eax,offset errmsg; ;显示错误信息显示错误信息call dispmsgcall dispmsgjmp rdbd1jmp rdbd1errmsgerrmsgbyte 0dh,0ah,Input error, enter again: ,0byte 0dh,0ah,Input error,
42、 enter again: ,0rdbdrdbdendpendp第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序1 1十进制有符号整数转换为补码的算法如下:十进制有符号整数转换为补码的算法如下:1 1判别输入了正数、还是负数,用一个存放器判别输入了正数、还是负数,用一个存放器记录记录2 2判别下一个字符能否为有效数码判别下一个字符能否为有效数码字符无效,提示错误重新输入,并转向字符无效,提示错误重新输入,并转向1 1字符有效,继续字符有效,继续3 3字符有效,减字符有效,减30H30H转换为二进制数;然后将前转换为二进制数;然后将前面输入
43、的数值乘面输入的数值乘1010,并与刚输入的数字相加得到新,并与刚输入的数字相加得到新的数值的数值4 4判别输入的数据能否超出有效范围判别输入的数据能否超出有效范围超出范围,提示错误重新输入,并转向超出范围,提示错误重新输入,并转向1 1没有超出范围,那么继续没有超出范围,那么继续5 5反复第反复第2 24 4步,输入字符都有效,步,输入字符都有效,不断处置完不断处置完6 6是负数进展求补,转换成补码;否那么直接是负数进展求补,转换成补码;否那么直接将数值保管将数值保管第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序2 2; ;数据段数据
44、段countcount= 10= 10arrayarraydword count dup(0)dword count dup(0)temptempdword ?dword ?readbufreadbufbyte 30 dup(0)byte 30 dup(0); ;代码段代码段mov ecx,countmov ecx,countmov ebx,offset arraymov ebx,offset arrayagain:again:call readcall read; ;调用子程序,输入一个数据调用子程序,输入一个数据mov eax,tempmov eax,temp; ;获得出口参数获得出口参数
45、mov ebx,eaxmov ebx,eax; ;存放到数据缓冲区存放到数据缓冲区add ebx,4add ebx,4dec ecxdec ecxjnz againjnz again第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序3 3; ;输入有符号十进制数的子程序输入有符号十进制数的子程序readreadprocproc; ;出口参数:变量出口参数:变量TEMPTEMP补码表示的二进制数值补码表示的二进制数值push eaxpush eax; ;阐明:负数用阐明:负数用“引导引导push ebxpush ebxpush ecxpush
46、 ecxpush edxpush edxread0:read0:mov eax,offset readbufmov eax,offset readbufcall readmsgcall readmsg; ;输入一个字符串输入一个字符串test eax,eaxtest eax,eaxjz readerrjz readerr; ;没有输入数据,错误没有输入数据,错误cmp eax,12cmp eax,12ja readerrja readerr; ;输入超越输入超越1212个字符,错误个字符,错误第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程
47、序4 4mov edx,offset readbuf ;EDXmov edx,offset readbuf ;EDX指向输入缓冲区指向输入缓冲区xor ebx,ebxxor ebx,ebx;EBX;EBX保管结果保管结果xor ecx,ecxxor ecx,ecx;ECX;ECX为正负标志,为正负标志,0 0为正,为正,1 1为负为负mov al,edxmov al,edx; ;取一个字符取一个字符cmp al,+cmp al,+; ;是是“,继续,继续jz read1jz read1cmp al,-cmp al,-; ;是是“,设置,设置1 1标志标志jnz read2jnz read2mo
48、v ecx,-1mov ecx,-1read1:read1:inc edxinc edx; ;取下一个字符取下一个字符mov al,edxmov al,edxtest al,altest al,al; ;是结尾是结尾0 0,转向求补码,转向求补码jz read3jz read3第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序5 5read2:read2:cmp al,0cmp al,0; ;不是不是0 09 9之间的数码,错误之间的数码,错误jb readerrjb readerrcmp al,9cmp al,9ja readerrja
49、readerrsub al,30hsub al,30h; ;是是0 09 9之间的数码,转换之间的数码,转换imul ebx,10imul ebx,10; ;原数值乘原数值乘1010:EBXEBXEBXEBX1010jc readerrjc readerr;CF;CF1 1,乘积溢出,出错,乘积溢出,出错movzx eax,almovzx eax,al; ;零位扩展,便于相加零位扩展,便于相加add ebx,eaxadd ebx,eax; ;原数乘原数乘1010后,与新数码相加后,与新数码相加cmp ebx,80000000hcmp ebx,80000000h; ;数据超越数据超越231231
50、,出错,出错jbe read1jbe read1; ;继续转换下一个数位继续转换下一个数位第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序6 6readerr:readerr: mov eax,offset errmsgmov eax,offset errmsg; ;显示出错信息显示出错信息call dispmsgcall dispmsgjmp read0jmp read0; ;read3:read3:test ecx,ecxtest ecx,ecx; ;判别是正数还是负数判别是正数还是负数jz read4jz read4neg ebxn
51、eg ebx; ;是负数,进展求补是负数,进展求补jmp read5jmp read5read4:read4:cmp ebx,7fffffffhcmp ebx,7fffffffh; ;正数超越正数超越231-1231-1,出错,出错ja readerrja readerr第第5 5章章 模块化程序设计模块化程序设计例例5-65-6有符号十进制数输入程序有符号十进制数输入程序7 7read5:read5:mov temp,ebxmov temp,ebx; ;设置出口参数设置出口参数pop edxpop edxpop ecxpop ecxpop ebxpop ebxpop eaxpop eaxre
52、tret; ;子程序前往子程序前往errmsgerrmsgbyte Input error, enter again: ,0byte Input error, enter again: ,0readreadendpendp第第5 5章章 模块化程序设计模块化程序设计5.2.3 5.2.3 堆栈传送参数堆栈传送参数主程序将入口参数压入堆栈,子程序从堆栈中主程序将入口参数压入堆栈,子程序从堆栈中取出参数取出参数出口参数通常不运用堆栈传送出口参数通常不运用堆栈传送高级言语进展函数调用时提供的参数,本质也高级言语进展函数调用时提供的参数,本质也利用堆栈传送利用堆栈传送采用堆栈传送参数是程式化的,它是编
53、译程序采用堆栈传送参数是程式化的,它是编译程序处置参数传送、以及汇编言语与高级言语混合处置参数传送、以及汇编言语与高级言语混合编程时的常规方法编程时的常规方法第第5 5章章 模块化程序设计模块化程序设计例例5-75-7计算有符号数平均值程序计算有符号数平均值程序1 1; ;数据段数据段arrayarraydword 675,354,-34, .dword 675,354,-34, .; ;代码段代码段push lengthof arraypush lengthof array; ;压入数据个数压入数据个数push offset arraypush offset array; ;压数组的偏移地址
54、压数组的偏移地址call meancall mean; ;调用求平均值子程序调用求平均值子程序; ;出口参数:出口参数:EAXEAX平均值整数部分平均值整数部分add esp,8add esp,8; ;平衡堆栈压入了平衡堆栈压入了8 8个字节数据个字节数据call dispsidcall dispsid; ;显示显示第第5 5章章 模块化程序设计模块化程序设计例例5-75-7计算有符号数平均值程序计算有符号数平均值程序2 2; ;计算计算3232位有符号数平均值子程序位有符号数平均值子程序meanmeanprocproc; ;入口参数:顺序压入数据个数和数组偏移地址入口参数:顺序压入数据个数和
55、数组偏移地址push ebppush ebp; ;出口参数:出口参数:EAXEAX平均值平均值mov ebp,espmov ebp,esppush ebxpush ebx; ;维护存放器维护存放器push ecxpush ecxpush edxpush edxmov ebx,ebp+8mov ebx,ebp+8;EBX;EBX取出的偏移地址取出的偏移地址mov ecx,ebp+12mov ecx,ebp+12;ECX;ECX取出的数据个数取出的数据个数xor eax,eaxxor eax,eax;EAX;EAX保管和值保管和值xor edx,edxxor edx,edx;EDX;EDX指向数组
56、元素指向数组元素第第5 5章章 模块化程序设计模块化程序设计例例5-75-7计算有符号数平均值程序计算有符号数平均值程序3 3mean1:mean1:add eax,ebx+edxadd eax,ebx+edx* *44 ; ;求和求和add edx,1add edx,1; ;指向下一个数据指向下一个数据cmp edx,ecxcmp edx,ecx; ;比较个数比较个数jb mean1jb mean1; ;循环循环cdqcdq; ;将累加和将累加和EAXEAX符号扩展到符号扩展到EDXEDXidiv ecxidiv ecx; ;有符号数除法,有符号数除法,EAXEAX平均值平均值pop edx
57、pop edx; ;恢复存放器恢复存放器pop ecxpop ecxpop ebxpop ebxpop ebppop ebpretretmeanmeanendpendp表示图表示图第第5 5章章 模块化程序设计模块化程序设计利用堆栈传送参数利用堆栈传送参数前往前往Lengthof arrayoffset array 断点断点 EIPEBPStackPUSHPOP第第5 5章章 模块化程序设计模块化程序设计5.4 5.4 宏构造宏构造本书统称的宏构造本书统称的宏构造宏汇编宏汇编反复汇编反复汇编条件汇编条件汇编用于简化源程序构造用于简化源程序构造第第5 5章章 模块化程序设计模块化程序设计5.4.
58、1 5.4.1 宏汇编宏汇编宏宏MacroMacro:具有宏名的一段汇编语句序列:具有宏名的一段汇编语句序列宏需求先定义宏需求先定义宏名宏名MACRO MACRO 形参表形参表 ; ;宏定义体宏定义体ENDMENDM然后程序中进展宏调用然后程序中进展宏调用宏名宏名 实体参数实体参数在汇编时,宏指令被汇编程序用宏定义的代码在汇编时,宏指令被汇编程序用宏定义的代码序列替代,实现宏展开序列替代,实现宏展开第第5 5章章 模块化程序设计模块化程序设计1. 1. 宏定义和宏调用宏定义和宏调用宏定义宏定义WriteStringWriteStringmacro macro msgmsgpush eaxpus
59、h eaxlea eax,msglea eax,msgcall dispmsgcall dispmsgpop eaxpop eaxendmendm宏展开宏展开push eaxpush eaxlea lea eax,msgeax,msgc a l l c a l l dispmsgdispmsgpop eaxpop eax宏调用宏调用WriteString WriteString msgmsg第第5 5章章 模块化程序设计模块化程序设计2. 2. 宏与子程序宏与子程序仅是源程序级的简化:宏调用在汇编时进展程序语句的展开,不需求前往;不减小目的程序,执行速度没有改动经过形参、实参结合实现参数传送,
60、简捷直观、灵敏多变当程序段较短或要求较快执行时,应选用宏还是目的程序级的简化:子程序调用在执行时由CALL指令转向、RET指令前往;构成的目的代码较短,执行速度减慢需求利用存放器、存储单元或堆栈等传送参数当程序段较长或为减小目的代码时,要选用子程序第第5 5章章 模块化程序设计模块化程序设计5.3 5.3 多模块程序构造多模块程序构造程序分段、子程序等实现了程序模块化程序分段、子程序等实现了程序模块化开发大型运用程序时常运用多个源程序文件、开发大型运用程序时常运用多个源程序文件、目的代码模块等组成完好的程序目的代码模块等组成完好的程序MASMMASM详细支持的方法详细支持的方法源文件包含源文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华师大版初中科学1.3噪声
- 华师大版初中科学银河系(17课件)
- 媒介与宣传管理制度
- 第一节SIS系统讲义
- 算法设计与分析 课件 4.6-分治法 - 典型应用 - 快速排序
- 2024年汉中客运资格证考试题库下载
- 2024年青海驾校资格证模拟考试题
- 2024年合肥考客运资格证要考几科
- 2024年毕节客运考试题库
- 新高考I卷(含听力)03-2024年高考英语第一次调研全真模拟考试(原卷版)
- 【地理】湖北省鄂东南联盟2023-2024学年高一上学期期中联考(解析版)
- 中小学校本课程规划方案
- 浅谈一年级小学生行为习惯的养成教育获奖科研报告
- 【岩土工程施工技术实践实验报告2800字】
- 2023年福建省重点中学化学九上期中检测试题含解析
- 角钢焊接施工方案
- 第3章-大学生人格发展与心理健康
- 讲故事比赛细则、评分表
- 在角色游戏中促进幼儿社会性发展
- 幼儿园:中班社会《桌子底下的动物园》
- 铝业有限公司阳极氧化安全风险分级管控清单
评论
0/150
提交评论