第4章程序结构.ppt
第第4 4章章 程序结构程序结构第4章程序结构 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望第第4 4章章 程序结构程序结构以顺序、分支和循环程序结构为主线以顺序、分支和循环程序结构为主线结合数值运算、数组处理等示例程序结合数值运算、数组处理等示例程序掌掌握握控控制制转转移移指指令令以以及及编编写写基基本本程程序序的方法的方法第第4 4章章 程序结构程序结构4.1 4.1 顺序程序结构顺序程序结构按照指令书写的前后顺序执行每条指令按照指令书写的前后顺序执行每条指令最基本的程序片段最基本的程序片段构成复杂程序的基础构成复杂程序的基础3 3个示例程序个示例程序n知道知道“1 12 23 3N”N”等于多少吗?等于多少吗?n知道处理器内置的识别字符串是什么吗?知道处理器内置的识别字符串是什么吗?n知道知道“01100100”01100100”代表什么吗?代表什么吗?3 3第第4 4章章 程序结构程序结构例例4-14-1自然数求和程序自然数求和程序;数据段数据段numnumdword 3456dword 3456;假设一个假设一个N N值(小于值(小于2 23232-1-1)sumsumqword?qword?;代码段代码段mov eax,nummov eax,num;EAX=N;EAX=Nadd eax,1add eax,1;EAX=N+1;EAX=N+1imul numimul num;EDX.EAX=(1+N)N;EDX.EAX=(1+N)Nshr edx,1shr edx,1;64;64位逻辑右移一位位逻辑右移一位(除以除以2)2)rcr eax,1rcr eax,1;EDX.EAX=EDX.EAX2;EDX.EAX=EDX.EAX2mov dword ptr sum,eaxmov dword ptr sum,eax;小端方式保存小端方式保存mov dword ptr sum+4,edxmov dword ptr sum+4,edx1 12 2N N(1 1N N)N2N24 4第第4 4章章 程序结构程序结构例例4-24-2处理器识别程序处理器识别程序;数据段数据段bufferbufferbyte The processor is,12 dup(0),0byte The processor is,12 dup(0),0bufsizebufsize=sizeof buffer=sizeof buffer;代码段代码段mov eax,0mov eax,0cpuidcpuid;执行处理器识别指令执行处理器识别指令mov dword ptr buffer+bufsize-13,ebxmov dword ptr buffer+bufsize-13,ebxmov dword ptr buffer+bufsize-9,edxmov dword ptr buffer+bufsize-9,edxmov dword ptr buffer+bufsize-5,ecxmov dword ptr buffer+bufsize-5,ecxmov eax,offset buffermov eax,offset buffer;显示信息显示信息call dispmsgcall dispmsgGenuineIntelGenuineIntel5 5第第4 4章章 程序结构程序结构例例4-34-3不同格式显示程序不同格式显示程序mov al,varmov al,varcall dispbbcall dispbbcall dispcrlfcall dispcrlfmov al,varmov al,varcall disphbcall disphbcall dispcrlfcall dispcrlfmov al,varmov al,varcall dispuibcall dispuibcall dispcrlfcall dispcrlfmov al,varmov al,varcall dispccall dispcvarvar byte 01100100bbyte 01100100b二进制形式二进制形式十六十六进制形式进制形式十十进制形式进制形式字符字符形式形式运行结果6 6第第4 4章章 程序结构程序结构4.2 4.2 分支程序结构分支程序结构改改变变程程序序执执行行顺顺序序、形形成成分分支支、循循环环、调调用用等等程程序序结结构是很常见的程序设计问题构是很常见的程序设计问题高高级级语语言言采采用用IFIF等等语语句句表表达达条条件件,并并根根据据条条件件是是否否成成立转向不同的程序分支立转向不同的程序分支汇编语言需要汇编语言需要n首先利用比较首先利用比较CMPCMP、测试、测试TESTTEST、加减、加减运算、逻辑运算等影响状态标志的运算、逻辑运算等影响状态标志的指令形成条件指令形成条件n然后利用条件转移指令判断由标志然后利用条件转移指令判断由标志表达的条件表达的条件,并根据标志状态控制程序并根据标志状态控制程序转移到不同的程序段转移到不同的程序段7 7第第4 4章章 程序结构程序结构4.2.1 4.2.1 无条件转移指令无条件转移指令程序代码在代码段程序代码在代码段nCSCS:指明代码段在主存中的段基地址:指明代码段在主存中的段基地址nEIPEIP:给出将要执行指令的偏移地址:给出将要执行指令的偏移地址程序顺序执行,处理器自动增量程序顺序执行,处理器自动增量EIPEIP程序控制转移,程序控制转移,EIPEIP随之改变随之改变程序转移到另外的代码段,程序转移到另外的代码段,EIPEIP和和CSCS都改变都改变控控制制转转移移类类指指令令:改改变变EIPEIP(有有些些也也改改变变CSCS),即即改改变变程程序序执执行行顺顺序序(实实现现程程序序控控制制转转移移)的的指令指令本章学习本章学习控制转移类指令控制转移类指令8 8第第4 4章章 程序结构程序结构1.1.转移范围转移范围段内转移段内转移n在当前代码段范围内的程序转移在当前代码段范围内的程序转移n不需更改不需更改CSCS,只要改变只要改变EIPEIP(偏移地址)(偏移地址)n近转移(近转移(NearNear):3232位近转移位近转移NEAR32NEAR32、1616位近转移位近转移NEAR16NEAR16n短转移(短转移(ShortShort):转移范围在:转移范围在127127-128-128字节字节段间转移段间转移n从当前代码段跳转到另一个代码段从当前代码段跳转到另一个代码段n需要更改需要更改CSCS(段地址)和(段地址)和EIPEIP(偏移地址)(偏移地址)n远转移(远转移(FarFar):4848位远转移位远转移FAR32FAR32、3232位远转移位远转移FAR16FAR169 9第第4 4章章 程序结构程序结构2.2.指令寻址方式指令寻址方式相对寻址方式相对寻址方式n提供目标地址相对于当前指令指针提供目标地址相对于当前指令指针EIPEIP的位移量的位移量n目标地址(转移后的目标地址(转移后的EIPEIP)当前)当前EIPEIP位移量位移量n相对寻址都是段内转移,最常用、最灵活相对寻址都是段内转移,最常用、最灵活直接寻址方式直接寻址方式n直接提供目标地址直接提供目标地址n目标地址(转移后的目标地址(转移后的CSCS和和EIPEIP)指令操作数)指令操作数间接寻址方式间接寻址方式n指示寄存器或存储单元指示寄存器或存储单元n目标地址来自寄存器或存储单元、间接获得目标地址来自寄存器或存储单元、间接获得n寄存器间接寻址:用寄存器保存目标地址寄存器间接寻址:用寄存器保存目标地址n存储器间接寻址:用存储单元保存目标地址存储器间接寻址:用存储单元保存目标地址目标地址目标地址目的地址目的地址转移地址转移地址1010第第4 4章章 程序结构程序结构3.JMP3.JMP指令指令无条件转移:程序无条件改变执行顺序无条件转移:程序无条件改变执行顺序JMPJMP指令相当于高级语言的指令相当于高级语言的gotogoto语句语句JMP labelJMP label;程序转向程序转向labellabel标号指定的地址标号指定的地址;段内相对寻址,段间直接寻址段内相对寻址,段间直接寻址JMP reg32/reg16JMP reg32/reg16;程序转向寄存器指定的地址程序转向寄存器指定的地址;寄存器间接寻址寄存器间接寻址JMP mem48/mem32/mem16JMP mem48/mem32/mem16;程序转向存储单元指定的地址程序转向存储单元指定的地址;存储器间接寻址存储器间接寻址1111第第4 4章章 程序结构程序结构JMPJMP指令的指令的4 4种类型种类型1.1.段内转移、相对寻址段内转移、相对寻址n标号指明目标地址,指令代码包含位移量标号指明目标地址,指令代码包含位移量2.2.段内转移、间接寻址段内转移、间接寻址n通用寄存器或主存单元包含目标指令偏移地址通用寄存器或主存单元包含目标指令偏移地址3.3.段间转移、直接寻址段间转移、直接寻址n标号包含目标指令的段地址和偏移地址标号包含目标指令的段地址和偏移地址4.4.段间转移、间接寻址段间转移、间接寻址n3232位段用位段用3 3字存储单元包含目标地址字存储单元包含目标地址n1616位段用双字存储单元包含目标地址位段用双字存储单元包含目标地址MASM会根据存储模式等信息自动识别会根据存储模式等信息自动识别1212第第4 4章章 程序结构程序结构例例4-44-4无条件转移程序无条件转移程序1 1;数据段数据段00000000000000000000000000000000nvarnvardword?dword?;代码段代码段0000000000000000EB 01EB 01jmp labl1jmp labl1;相对寻址相对寻址00000002000000029090nopnop0000000300000003E9 00000001E9 00000001labl1:labl1:jmp near ptr labl2jmp near ptr labl2;相对近转移相对近转移00000008000000089090nopnop0000000900000009B8 00000011 RB8 00000011 Rlabl2:labl2:mov eax,offset labl3mov eax,offset labl30000000E0000000EFF E0FF E0jmp eaxjmp eax;寄存器间接寻址寄存器间接寻址1313第第4 4章章 程序结构程序结构例例4-44-4无条件转移程序无条件转移程序2 200000010000000109090nopnop0000001100000011B8 00000022 RB8 00000022 Rlabl3:labl3:mov eax,offset labl4mov eax,offset labl40000001600000016A3 00000000 RA3 00000000 Rmov nvar,eaxmov nvar,eax0000001B0000001BFF 25 00000000 RFF 25 00000000 Rjmp nvarjmp nvar;存储器间接寻址存储器间接寻址00000021000000219090nopnoplabl4:labl4:mov ebx,offset nvarmov ebx,offset nvarjmp near ptr ebxjmp near ptr ebx;数据的寄存器间接寻址数据的寄存器间接寻址数据的存储器直接寻址数据的存储器直接寻址1414第第4 4章章 程序结构程序结构4.2.2 4.2.2 条件转移指令条件转移指令根据指定的条件确定程序是否发生转移根据指定的条件确定程序是否发生转移Jcc labelJcc label;条件满足,发生转移;否则,顺序执行下条指令条件满足,发生转移;否则,顺序执行下条指令LABELLABEL表示目标地址,采用段内相对寻址表示目标地址,采用段内相对寻址n3232位位IA-32IA-32处理器:达到处理器:达到3232位的全偏移量位的全偏移量n1616位位80 x8680 x86处理器:处理器:-128-128+127+127间的短转移间的短转移n条件转移指令不影响标志,但要利用标志条件转移指令不影响标志,但要利用标志cccc表示利用标志判断的条件,表示利用标志判断的条件,1616种、两类种、两类n单个标志状态作为条件单个标志状态作为条件n两数大小关系作为条件两数大小关系作为条件1515第第4 4章章 程序结构程序结构转移条件转移条件cccc:单个标志状态:单个标志状态JZ/JEJZ/JEZF=1ZF=1Jump if Zero/EqualJump if Zero/EqualJNZ/JNEJNZ/JNEZF=0ZF=0Jump if Not Zero/Not EqualJump if Not Zero/Not EqualJSJSSF=1SF=1Jump if SignJump if SignJNSJNSSF=0SF=0Jump if Not SignJump if Not SignJP/JPEJP/JPEPF=1PF=1Jump if Parity/Parity EvenJump if Parity/Parity EvenJNP/JPOJNP/JPOPF=0PF=0Jump if Not Parity/Parity OddJump if Not Parity/Parity OddJOJOOF=1OF=1Jump if OverflowJump if OverflowJNOJNOOF=0OF=0Jump if Not OverflowJump if Not OverflowJCJCCF=1CF=1Jump if CarryJump if CarryJNCJNCCF=0CF=0Jump if Not CarryJump if Not Carry多个助记符方便记忆多个助记符方便记忆1616第第4 4章章 程序结构程序结构转移条件转移条件cccc:两数大小关系:两数大小关系JB/JNAEJB/JNAECF=1CF=1Jump if Below/Not Above or EqualJump if Below/Not Above or EqualJNB/JAEJNB/JAECF=0CF=0Jump if Not Below/Above or EqualJump if Not Below/Above or EqualJBE/JNAJBE/JNACF=1CF=1或或ZF=1ZF=1Jump if Below/Not AboveJump if Below/Not AboveJNBE/JAJNBE/JACF=0CF=0且且ZF=0ZF=0Jump if Not Below or Equal/AboveJump if Not Below or Equal/AboveJL/JNGEJL/JNGESFOFSFOFJump if Less/Not Greater or EqualJump if Less/Not Greater or EqualJNL/JGEJNL/JGESF=OFSF=OFJump if Not Less/Greater or EqualJump if Not Less/Greater or EqualJLE/JNGJLE/JNGZFOFZFOF或或ZF=1ZF=1Jump if Less or Equal/Not GreaterJump if Less or Equal/Not GreaterJNLE/JGJNLE/JGSF=OFSF=OF且且ZF=0ZF=0Jump if Not Less or Equal/GreaterJump if Not Less or Equal/Greater1717第第4 4章章 程序结构程序结构1.1.单个标志状态作为条件的条件转移指令单个标志状态作为条件的条件转移指令JZ(JE)JZ(JE)和和JNZ(JNE)JNZ(JNE):利用零位标志:利用零位标志ZFZFn判断结果是零(相等)还是非零(不等)判断结果是零(相等)还是非零(不等)JSJS和和JNSJNS:利用符号标志:利用符号标志SFSFn判断结果是负还是正判断结果是负还是正JOJO和和JNOJNO:利用溢出标志:利用溢出标志OFOFn判断结果是溢出还是没有溢出判断结果是溢出还是没有溢出JP(JPE)JP(JPE)和和JNP(JPO)JNP(JPO):利用奇偶标志:利用奇偶标志PFPFn判断结果低字节判断结果低字节“1”1”的个数是偶数还是奇数的个数是偶数还是奇数JCJC和和JNCJNC:利用进位标志:利用进位标志CFCFn判断结果是有进位(为判断结果是有进位(为1 1)还是无进位(为)还是无进位(为0 0)1818第第4 4章章 程序结构程序结构例例4-54-5个数折半程序个数折半程序1 1mov eax,885mov eax,885;假设一个数据假设一个数据shr eax,1shr eax,1;数据右移进行折半数据右移进行折半jnc goevenjnc goeven;余数为余数为0 0,即,即CFCF0 0条件成立,转移条件成立,转移add eax,1add eax,1;否则余数为否则余数为1 1,即,即CFCF1 1,进行加,进行加1 1操作操作goeven:goeven:call dispuidcall dispuid;显示结果显示结果 443运行结果1919第第4 4章章 程序结构程序结构例例4-54-5个数折半程序个数折半程序2 2mov eax,886mov eax,886;假设一个数据假设一个数据shr eax,1shr eax,1;数据右移进行折半数据右移进行折半jc gooddjc goodd;余数为余数为1 1,即,即CFCF1 1条件成立,转移条件成立,转移jmp goevenjmp goeven;余数为余数为0 0,即,即CFCF0 0无需处理,转移到显示!无需处理,转移到显示!goodd:goodd:add eax,1add eax,1;进行加进行加1 1操作操作goeven:goeven:call dispuidcall dispuid;显示结果显示结果jnc goeven 何不合二为一?何不合二为一?2020第第4 4章章 程序结构程序结构例例4-54-5个数折半程序个数折半程序3 3mov eax,887mov eax,887;假设一个数据假设一个数据shr eax,1shr eax,1;数据右移进行折半数据右移进行折半adc eax,0adc eax,0;余数余数CFCF1 1,进行加,进行加1 1操作操作;余数余数CFCF0 0,没有加,没有加1 1call dispuidcall dispuid;显示结果显示结果mov eax,888mov eax,888;假设一个数据假设一个数据add eax,1add eax,1;个数加个数加1 1rcr eax,1rcr eax,1;数据右移进行折半数据右移进行折半call dispuidcall dispuid;显示结果显示结果改进算法改进算法消除分支消除分支2121第第4 4章章 程序结构程序结构例例4-64-6位测试程序位测试程序1 1;数据段数据段no_msgno_msgbyte Not Ready!,0byte Not Ready!,0yes_msgyes_msgbyte Ready to Go!,0byte Ready to Go!,0;代码段代码段mov eax,56hmov eax,56h;假设一个数据假设一个数据test eax,02htest eax,02h;测试测试D D1 1位位(D(D1 11 1,其他位为,其他位为0)0)jz nomjz nom;D;D1 10 0条件成立,转移条件成立,转移mov eax,offset yes_msgmov eax,offset yes_msg;D;D1 11 1,显示准备好,显示准备好jmp donejmp done;跳转过另一个分支体!跳转过另一个分支体!nom:nom:mov eax,offset no_msgmov eax,offset no_msg;显示没准备好显示没准备好done:done:call dispmsgcall dispmsg2222第第4 4章章 程序结构程序结构例例4-64-6位测试程序位测试程序2 2;数据段数据段no_msgno_msgbyte Not Ready!,0byte Not Ready!,0yes_msgyes_msgbyte Ready to Go!,0byte Ready to Go!,0;代码段代码段mov eax,56hmov eax,56h;假设一个数据假设一个数据test eax,02htest eax,02h;测试测试D D1 1位位(D(D1 11 1,其他位为,其他位为0)0)jnz yesmjnz yesm;D;D1 11 1条件成立,转移条件成立,转移mov eax,offset no_msgmov eax,offset no_msg;D;D1 10 0,显示没准备好,显示没准备好jmp donejmp done;跳转过另一个分支体!跳转过另一个分支体!yesm:yesm:mov eax,offset yes_msgmov eax,offset yes_msg;显示准备好显示准备好done:done:call dispmsgcall dispmsg2323第第4 4章章 程序结构程序结构例例4-74-7奇校验程序奇校验程序call readccall readc;键盘输入,键盘输入,ALAL返回值返回值call dispcrlfcall dispcrlf;回车换行(用于分隔)回车换行(用于分隔)call dispbbcall dispbb;以二进制形式显示数据以二进制形式显示数据call dispcrlfcall dispcrlf;回车换行(用于分隔)回车换行(用于分隔)and al,7fhand al,7fh;最高位置最高位置“0”0”、其他位不变、其他位不变;同时标志同时标志PFPF反映反映“1”1”的个数的个数jnp nextjnp next;个数为奇数,不需处理,转移个数为奇数,不需处理,转移or al,80hor al,80h;个数为偶数,最高位置个数为偶数,最高位置“1”1”、其他位不变、其他位不变 next:next:call dispbbcall dispbb;显示含校验位的数据显示含校验位的数据2424第第4 4章章 程序结构程序结构2.2.两数大小关系作为条件的条件转移指令两数大小关系作为条件的条件转移指令无符号数用高(无符号数用高(AboveAbove)、低()、低(BelowBelow)n低于(不高于等于):低于(不高于等于):JBJB(JNAEJNAE)n不低于(高于等于):不低于(高于等于):JNBJNB(JAEJAE)n低于等于(不高于):低于等于(不高于):JBEJBE(JNAJNA)n不低于等于(高于):不低于等于(高于):JNBEJNBE(JAJA)有符号数用大(有符号数用大(GreaterGreater)、小()、小(LessLess)n小于(不大于等于):小于(不大于等于):JLJL(JNGEJNGE)n不小于(大于等于):不小于(大于等于):JNLJNL(JGEJGE)n小于等于(不大于):小于等于(不大于):JLEJLE(JNGJNG)n不小于等于(大于):不小于等于(大于):JNLEJNLE(JGJG)2525第第4 4章章 程序结构程序结构例例4-84-8数据比较程序数据比较程序1 1;数据段数据段in_msg1in_msg1byte Enter a number:,0byte Enter a number:,0in_msg2in_msg2byte Enter another number:,0byte Enter another number:,0out_msg1out_msg1 byte Two numbers are equal:,0byte Two numbers are equal:,0out_msg2out_msg2 byte The less number is:,0byte The less number is:,0out_msg3out_msg3 byte 13,10,The greater number is:,0byte 13,10,The greater number is:,0;代码段代码段mov eax,offset mov eax,offset in_msg1in_msg1;提示输入提示输入call dispmsgcall dispmsgcall readsidcall readsid;输入第一个数据输入第一个数据mov ebx,eaxmov ebx,eax;保存到保存到EBXEBXmov eax,offset in_msg2mov eax,offset in_msg2;提示输入提示输入call dispmsgcall dispmsgcall readsidcall readsid;输入第二个数据输入第二个数据mov ecx,eaxmov ecx,eax;保存到保存到ECXECX2626第第4 4章章 程序结构程序结构例例4-84-8数据比较程序数据比较程序2 2cmp ebx,ecxcmp ebx,ecx;二个数据进行比较二个数据进行比较jne nequaljne nequal;两数不相等,转移两数不相等,转移mov eax,offset out_msg1mov eax,offset out_msg1call dispmsgcall dispmsg;显示两数相等显示两数相等mov eax,ebxmov eax,ebxcall dispsidcall dispsid;显示相等的数据显示相等的数据jmp donejmp done;转移到结束转移到结束nequal:nequal:jl firstjl first;EBX;EBX较小,不需要交换,转移较小,不需要交换,转移xchg ebx,ecxxchg ebx,ecx;EBX;EBX保存较小数,保存较小数,ECXECX保存较大数保存较大数2727第第4 4章章 程序结构程序结构例例4-84-8数据比较程序数据比较程序3 3first:first:mov eax,offset out_msg2mov eax,offset out_msg2;显示较小数显示较小数call dispmsgcall dispmsgmov eax,ebxmov eax,ebx;较小数在较小数在EBXEBX中中call dispsidcall dispsidmov eax,offset out_msg3mov eax,offset out_msg3;显示较大数显示较大数call dispmsgcall dispmsgmov eax,ecxmov eax,ecx;较大数在较大数在ECXECX中中call dispsid call dispsid done:done:2828第第4 4章章 程序结构程序结构4.2.3 4.2.3 单分支结构单分支结构只有一个分支的程序只有一个分支的程序n类似高级语言的类似高级语言的IF-THENIF-THEN语句结构语句结构注意采用正确的条件转移指令注意采用正确的条件转移指令n当条件满足(成立),发生转移,跳过分支体当条件满足(成立),发生转移,跳过分支体n条件不满足,顺序向下执行分支体条件不满足,顺序向下执行分支体条件转移指令与高级语言的条件转移指令与高级语言的IFIF语句正好相反语句正好相反nIFIF语句是条件成立,执行分支体语句是条件成立,执行分支体2929第第4 4章章 程序结构程序结构例例4-94-9求绝对值程序求绝对值程序;代码段代码段call readsidcall readsid;输入一个有符号数,从输入一个有符号数,从EAXEAX返回值返回值cmp eax,0cmp eax,0;比较比较EAXEAX与与0 0jge nonnegjge nonneg;条件满足:条件满足:EAX0EAX0,转移,转移neg eaxneg eax;条件不满足:条件不满足:EAXEAX0 0,为负数,为负数;需求补得正值需求补得正值nonneg:nonneg:call dispuidcall dispuid;分支结束,显示结果分支结束,显示结果示意图示意图3030第第4 4章章 程序结构程序结构例例4-104-10字母判断程序字母判断程序call readccall readc;输入一个字符,从输入一个字符,从ALAL返回值返回值cmp al,Acmp al,A;与大写字母与大写字母A A比较比较jb donejb done;比大写字母比大写字母A A小,不是大写字母,转移小,不是大写字母,转移cmp al,Zcmp al,Z;与大写字母与大写字母Z Z比较比较ja doneja done;比大写字母比大写字母Z Z大,不是大写字母,转移大,不是大写字母,转移or al,20hor al,20h;转换为小写转换为小写call dispcrlfcall dispcrlf;回车换行回车换行call dispccall dispc;显示小写字母显示小写字母done:done:3232第第4 4章章 程序结构程序结构4.2.4 4.2.4 双分支结构双分支结构双双分分支支程程序序结结构构有有两两个个分分支支,条条件件为为真真执执行行一一个分支;条件为假,执行另一个分支个分支;条件为假,执行另一个分支n相当于高级语言的相当于高级语言的IF-THEN-ELSEIF-THEN-ELSE语句语句顺顺序序执执行行的的分分支支体体1 1最最后后一一定定要要有有一一条条JMPJMP指指令令跳过分支体跳过分支体2 2nJMPJMP指指令令必必不不可可少少,实实现现结结束束前前一一个个分分支支回回到到共共同同的出口作用的出口作用双分支结构有时可以改变为单分支结构双分支结构有时可以改变为单分支结构n事事先先执执行行其其中中一一个个分分支支(选选择择出出现现概概率率较较高高的的分分支)支)3333第第4 4章章 程序结构程序结构例例4-114-11显示数据最高位程序显示数据最高位程序1 1;数据段数据段dvardvardword 0bd630422hdword 0bd630422h;假设一个数据假设一个数据;代码段代码段mov ebx,dvarmov ebx,dvarshl ebx,1shl ebx,1;EBX;EBX最高位移入最高位移入CFCF标志标志jc one jc one ;CF;CF1 1,即最高位为,即最高位为1 1,转移,转移mov al,0 mov al,0;CF;CF0 0,即最高位为,即最高位为0 0:AL0AL0jmp twojmp two;一定要跳过另一个分支一定要跳过另一个分支one:one:mov al,1mov al,1;AL1;AL1two:two:call dispccall dispc;显示显示 双分支结构双分支结构示意图示意图3434第第4 4章章 程序结构程序结构例例4-114-11显示数据最高位程序显示数据最高位程序2 2;代码段代码段mov ebx,dvarmov ebx,dvarmov al,0mov al,0;假设最高位为假设最高位为0 0:AL0AL0shl ebx,1shl ebx,1;EBX;EBX最高位移入最高位移入CFCF标志标志jnc twojnc two;CF;CF0 0,即最高位为,即最高位为0 0,转移,转移mov al,1mov al,1;CF;CF1 1,即最高位为,即最高位为1 1,AL1AL1two:two:call dispccall dispc;显示显示单分支结构单分支结构3636第第4 4章章 程序结构程序结构例例4-124-12有符号数运算溢出程序有符号数运算溢出程序;数据段数据段dvar1dvar1dword 1234567890dword 1234567890;假设两个数据假设两个数据dvar2dvar2dword-999999999dword-999999999dvar3dvar3dword?dword?okmsgokmsgbyte Correct!,0byte Correct!,0;正确信息正确信息errmsgerrmsgbyte ERROR!Overflow!,0byte ERROR!Overflow!,0;错误信息错误信息;代码段代码段mov eax,dvar1 mov eax,dvar1 sub eax,dvar2sub eax,dvar2;求差求差jo errorjo error;有溢出,转移有溢出,转移mov dvar3,eaxmov dvar3,eax;无溢出,保存差值无溢出,保存差值mov eax,offset okmsgmov eax,offset okmsg;显示正确显示正确jmp dispjmp disperror:error:mov eax,offset errmsgmov eax,offset errmsg;显示错误显示错误disp:disp:call dispmsgcall dispmsg 3737第第4 4章章 程序结构程序结构4.2.5 4.2.5 多分支程序多分支程序实际问题存在多分支结构实际问题存在多分支结构n分支处理中又有分支分支处理中又有分支n具有多个分支走向具有多个分支走向利利用用单单分分支支和和双双分分支支这这两两个个基基本本结结构构,可可以以解解决决程程序序中多个分支结构的问题中多个分支结构的问题熟熟悉悉了了汇汇编编语语言言编编程程思思想想,还还可可以以采采用用其其他他技技巧巧性性的的方法解决实际问题方法解决实际问题使用表结构实现多分支使用表结构实现多分支3838第第4 4章章 程序结构程序结构例例4-134-13地址表程序地址表程序1 1;数据段数据段msg1msg1byte Chapter 1:Fundamentals,0dh,0ah,0byte Chapter 1:Fundamentals,0dh,0ah,0;10;10个信息个信息msgmsgbyte Input number(110):,0dh,0ah,0byte Input number(110):,0dh,0ah,0tabletable dworddword disp1,disp2,disp3,disp4,disp5disp1,disp2,disp3,disp4,disp5dword dword disp6,disp7,disp8,disp9,disp10disp6,disp7,disp8,disp9,disp101)提示输入数字,并输入数字;)提示输入数字,并输入数字;2)判判断断数数字字是是否否在在规规定定的的范范围围内内,不在范围内、重新输入;不在范围内、重新输入;3)显示数字对应的信息,退出。)显示数字对应的信息,退出。3939第第4 4章章 程序结构程序结构例例4-134-13地址表程序地址表程序2 2;代码段代码段again:again:mov eax,offset msgmov eax,offset msgcall dispmsgcall dispmsg;提示输入提示输入call readuidcall readuid;接收输入:接收输入:EAX=EAX=数字数字cmp eax,1cmp eax,1;判断范围判断范围jb againjb againcmp eax,10cmp eax,10ja againja again;不在范围内,重新输入不在范围内,重新输入dec eaxdec eax;EAX=EAX-1;EAX=EAX-1shl eax