程序结构实用.pptx
《程序结构实用.pptx》由会员分享,可在线阅读,更多相关《程序结构实用.pptx(62页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第4章 程序结构以顺序、分支和循环程序结构为主线结合数值运算、数组处理等示例程序掌握控制转移指令以及编写基本程序的方法第1页/共62页4.1 顺序程序结构按照指令书写的前后顺序执行每条指令最基本的程序片段构成复杂程序的基础3个示例程序知道“123N”等于多少吗?知道处理器内置的识别字符串是什么吗?知道“01100100”代表什么吗?第2页/共62页例4-1自然数求和程序;数据段num dword 3456;假设一个N值(小于232-1)sumqword?;代码段mov eax,num;EAX=Nadd eax,1;EAX=N+1imul num;EDX.EAX=(1+N)Nshr edx,1;
2、64位逻辑右移一位(除以2)rcr eax,1;EDX.EAX=EDX.EAX2mov dword ptr sum,eax;小端方式保存mov dword ptr sum+4,edx1 12 2N N(1 1N N)N2N2第3页/共62页例4-2处理器识别程序;数据段bufferbyte The processor is,12 dup(0),0bufsize=sizeof buffer;代码段mov eax,0cpuid;执行处理器识别指令mov dword ptr buffer+bufsize-13,ebxmov dword ptr buffer+bufsize-9,edxmov dwor
3、d ptr buffer+bufsize-5,ecxmov eax,offset buffer;显示信息call dispmsgGenuineIntelGenuineIntel第4页/共62页例4-3不同格式显示程序mov al,varcall dispbbcall dispcrlfmov al,varcall disphbcall dispcrlfmov al,varcall dispuibcall dispcrlfmov al,varcall dispcvarvar byte 01100100bbyte 01100100b二进制形式二进制形式十六十六进制形式进制形式十十进制形式进制形式字符
4、字符形式形式运行结果第5页/共62页4.2 分支程序结构改变程序执行顺序、形成分支、循环、调用等程序结构是很常见的程序设计问题高级语言采用IF等语句表达条件,并根据条件是否成立转向不同的程序分支汇编语言需要首先利用比较CMP、测试TEST、加减运算、逻辑运算等影响状态标志的指令形成条件然后利用条件转移指令判断由标志表达的条件,并根据标志状态控制程序转移到不同的程序段第6页/共62页4.2.1 无条件转移指令程序代码在代码段CS:指明代码段在主存中的段基地址EIP:给出将要执行指令的偏移地址程序顺序执行,处理器自动增量EIP程序控制转移,EIP随之改变程序转移到另外的代码段,EIP和CS都改变控
5、制转移类指令:改变EIP(有些也改变CS),即改变程序执行顺序(实现程序控制转移)的指令本章学习本章学习控制转移类指令控制转移类指令第7页/共62页1.转移范围段内转移在当前代码段范围内的程序转移不需更改CS,只要改变EIP(偏移地址)近转移(Near):32位近转移NEAR32、16位近转移NEAR16短转移(Short):转移范围在127-128字节段间转移从当前代码段跳转到另一个代码段需要更改CS(段地址)和EIP(偏移地址)远转移(Far):48位远转移FAR32、32位远转移FAR16第8页/共62页2.指令寻址方式相对寻址方式提供目标地址相对于当前指令指针EIP的位移量目标地址(转
6、移后的EIP)当前EIP位移量相对寻址都是段内转移,最常用、最灵活直接寻址方式直接提供目标地址目标地址(转移后的CS和EIP)指令操作数间接寻址方式指示寄存器或存储单元目标地址来自寄存器或存储单元、间接获得寄存器间接寻址:用寄存器保存目标地址存储器间接寻址:用存储单元保存目标地址目标地址目标地址目的地址目的地址转移地址转移地址第9页/共62页3.JMP指令无条件转移:程序无条件改变执行顺序JMP指令相当于高级语言的goto语句JMP label;程序转向label标号指定的地址;段内相对寻址,段间直接寻址JMP reg32/reg16;程序转向寄存器指定的地址;寄存器间接寻址JMP mem48
7、/mem32/mem16;程序转向存储单元指定的地址;存储器间接寻址第10页/共62页JMP指令的4种类型1.段内转移、相对寻址标号指明目标地址,指令代码包含位移量2.段内转移、间接寻址通用寄存器或主存单元包含目标指令偏移地址3.段间转移、直接寻址标号包含目标指令的段地址和偏移地址4.段间转移、间接寻址32位段用3字存储单元包含目标地址16位段用双字存储单元包含目标地址MASM会根据存储模式等信息自动识别会根据存储模式等信息自动识别第11页/共62页例4-4无条件转移程序1;数据段0000000000000000nvar dword?;代码段00000000EB 01jmp labl1;相对寻
8、址0000000290nop00000003E9 00000001labl1:jmp near ptr labl2;相对近转移0000000890nop00000009B8 00000011 Rlabl2:mov eax,offset labl30000000EFF E0jmp eax;寄存器间接寻址第12页/共62页例4-4无条件转移程序20000001090nop00000011B8 00000022 Rlabl3:mov eax,offset labl400000016A3 00000000 Rmov nvar,eax0000001BFF 25 00000000 Rjmp nvar;存储
9、器间接寻址0000002190noplabl4:mov ebx,offset nvarmov ebx,offset nvarjmp near ptr ebxjmp near ptr ebx;数据的寄存器间接寻址数据的寄存器间接寻址数据的存储器直接寻址数据的存储器直接寻址第13页/共62页144.2.2 条件转移指令根据指定的条件确定程序是否发生转移Jcc label;条件满足,发生转移;否则,顺序执行下条指令LABEL表示目标地址,采用段内相对寻址32位IA-32处理器:达到32位的全偏移量16位80 x86处理器:-128+127间的短转移条件转移指令不影响标志,但要利用标志cc表示利用标志
10、判断的条件,16种、两类单个标志状态作为条件两数大小关系作为条件第14页/共62页15转移条件cc:单个标志状态JZ/JEZF=1 Jump if Zero/EqualJNZ/JNE ZF=0 Jump if Not Zero/Not EqualJSSF=1 Jump if SignJNSSF=0 Jump if Not SignJP/JPEPF=1 Jump if Parity/Parity EvenJNP/JPOPF=0 Jump if Not Parity/Parity OddJOOF=1 Jump if OverflowJNOOF=0 Jump if Not OverflowJCCF=
11、1 Jump if CarryJNCCF=0 Jump if Not Carry多个助记符方便记忆多个助记符方便记忆第15页/共62页16转移条件cc:两数大小关系JB/JNAE CF=1Jump if Below/Not Above or EqualJNB/JAE CF=0Jump if Not Below/Above or EqualJBE/JNA CF=1或ZF=1 Jump if Below/Not AboveJNBE/JA CF=0且ZF=0 Jump if Not Below or Equal/AboveJL/JNGE SFOFJump if Less/Not Greater or
12、 EqualJNL/JGE SF=OFJump if Not Less/Greater or EqualJLE/JNG ZFOF或ZF=1Jump if Less or Equal/Not GreaterJNLE/JG SF=OF且ZF=0Jump if Not Less or Equal/Greater第16页/共62页171.单个标志状态作为条件的条件转移指令JZ(JE)和JNZ(JNE):利用零位标志ZF判断结果是零(相等)还是非零(不等)JS和JNS:利用符号标志SF判断结果是负还是正JO和JNO:利用溢出标志OF判断结果是溢出还是没有溢出JP(JPE)和JNP(JPO):利用奇偶标志
13、PF判断结果低字节“1”的个数是偶数还是奇数JC和JNC:利用进位标志CF判断结果是有进位(为1)还是无进位(为0)第17页/共62页18例4-5个数折半程序1mov eax,885;假设一个数据shr eax,1;数据右移进行折半jnc goeven;余数为0,即CF0条件成立,转移add eax,1;否则余数为1,即CF1,进行加1操作goeven:call dispuid;显示结果 443运行结果第18页/共62页19例4-5个数折半程序2mov eax,886;假设一个数据shr eax,1;数据右移进行折半jc goodd;余数为1,即CF1条件成立,转移jmp goeven;余数为
14、0,即CF0无需处理,转移到显示!goodd:add eax,1;进行加1操作goeven:call dispuid;显示结果jnc goeven 何不合二为一?何不合二为一?第19页/共62页20例4-5个数折半程序3mov eax,887;假设一个数据shr eax,1;数据右移进行折半adc eax,0;余数CF1,进行加1操作;余数CF0,没有加1call dispuid;显示结果mov eax,888mov eax,888;假设一个数据假设一个数据add eax,1add eax,1;个数加个数加1 1rcr eax,1rcr eax,1;数据右移进行折半数据右移进行折半call d
15、ispuidcall dispuid;显示结果显示结果改进算法改进算法消除分支消除分支第20页/共62页21例4-6位测试程序1;数据段no_msg byte Not Ready!,0yes_msg byte Ready to Go!,0;代码段mov eax,56h;假设一个数据test eax,02h;测试D1位(D11,其他位为0)jz nom;D10条件成立,转移mov eax,offset yes_msg;D11,显示准备好jmp done;跳转过另一个分支体!nom:mov eax,offset no_msg;显示没准备好done:call dispmsg第21页/共62页22例4
16、-6位测试程序2;数据段no_msg byte Not Ready!,0yes_msg byte Ready to Go!,0;代码段mov eax,56h;假设一个数据test eax,02h;测试D1位(D11,其他位为0)jnz yesm;D11条件成立,转移mov eax,offset no_msg;D10,显示没准备好jmp done;跳转过另一个分支体!yesm:mov eax,offset yes_msg;显示准备好done:call dispmsg第22页/共62页23例4-7奇校验程序call readc;键盘输入,AL返回值call dispcrlf;回车换行(用于分隔)c
17、all dispbb;以二进制形式显示数据call dispcrlf;回车换行(用于分隔)and al,7fh;最高位置“0”、其他位不变;同时标志PF反映“1”的个数jnp next;个数为奇数,不需处理,转移or al,80h;个数为偶数,最高位置“1”、其他位不变 next:call dispbb;显示含校验位的数据第23页/共62页242.两数大小关系作为条件的条件转移指令无符号数用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符号数用大(Greater
18、)、小(Less)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG)第24页/共62页25例4-8数据比较程序1;数据段in_msg1 byte Enter a number:,0in_msg2 byte Enter another number:,0out_msg1byte Two numbers are equal:,0out_msg2byte The less number is:,0out_msg3byte 13,10,The greater number is:,0;代码段mov eax,o
19、ffset in_msg1;提示输入call dispmsgcall readsid;输入第一个数据mov ebx,eax;保存到EBXmov eax,offset in_msg2;提示输入call dispmsgcall readsid;输入第二个数据mov ecx,eax;保存到ECX第25页/共62页26例4-8数据比较程序2cmp ebx,ecx;二个数据进行比较jne nequal;两数不相等,转移mov eax,offset out_msg1call dispmsg;显示两数相等mov eax,ebxcall dispsid;显示相等的数据jmp done;转移到结束nequal:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序结构 实用
限制150内