第5章控制转移和程序结构.ppt
《第5章控制转移和程序结构.ppt》由会员分享,可在线阅读,更多相关《第5章控制转移和程序结构.ppt(72页珍藏版)》请在课桌文档上搜索。
1、第5章 控制转移和程序结构,微型计算机原理及应用,5.1 目标地址寻址方式5.2 分支程序结构5.3 循环程序结构5.4 子程序结构,5.1 目标地址的寻址方式,程序代码在代码段;CS:指明代码段在主存中的开始位置、即段基地址;EIP:给出将要执行指令的偏移地址;程序顺序执行,微处理器自动增量EIP;程序控制转移,EIP随之改变;程序转移到另外的代码段,EIP和CS都将改变;控制转移类指令:改变EIP(有时CS),即改变程序执行顺序(实现程序控制转移)的指令;目标地址寻址方式:指明目的地、即目标地址的方法;,目标地址目的地址转移地址,5.1.1 转移范围,1.段内转移在当前代码段范围内的程序转
2、移;不需更改CS,只改EIP(偏移地址);近转移(Near):16位段是16位近转移NEAR16,32位段是32位近转移NEAR32;短转移(Short):转移范围在127-128字节;2.段间转移需要更改CS(段地址)和EIP(偏移地址);远转移(Far):16位段是32位远转移FAR16,32位段是48位远转移FAR32;,5.1.2 目标地址寻址方式,1.相对寻址方式提供目标地址相对于当前指令指针EIP的位移量;目标地址(转移后的EIP)当前EIP位移量;相对寻址都是段内转移,最常用、最灵活;2.直接寻址方式直接提供目标地址;目标地址(转移后的CS和EIP)指令操作数;3.间接寻址方式由
3、寄存器或存储单元提供跳转地址;目标地址来自寄存器或存储单元、间接获得;寄存器间接寻址:用寄存器保存目标地址;存储器间接寻址:用存储单元保存目标地址;,5.1.3 无条件转移指令JMP,JMP label;程序转向label标号指定的地址;有段内相对寻址,段间直接寻址;JMP reg16/reg32;程序转向寄存器指定的地址;为寄存器间接寻址;JMP mem16/mem32;程序转向存储单元指定的地址;为存储器间接寻址;,JMP指令的4种类型,1.段内转移、相对寻址标号指明目标地址,指令代码包含位移量;2.段内转移、间接寻址通用寄存器或主存单元包含目标指令的偏移地址;3.段间转移、直接寻址标号包
4、含目标指令的段地址和偏移地址;4.段间转移、间接寻址16位段用双字存储单元包含目标地址;32位段用3字存储单元包含目标地址;,MASM会根据存储模式等信息自动识别,例题5-1无条件转移程序-1,;数据段0000 0000nvardw?;代码段0010 EB 01jmp labl1;8位位移量0012 90nop0013 B8 FF02labl1:mov ax,type labl10016 E9 0001jmp near ptr labl2;16位位移量0019 90nop001A B8 0020 Rlabl2:mov ax,offset labl3;001D FF E0jmp ax001F 9
5、0nop0020 B8 002B Rlabl3:mov ax,offset labl40023 A3 0000 Rmov nvar,ax0026 FF 26 0000 Rjmp nvar002A 90nop,相对短转移,相对近转移,寄存器间接近转移,存储器间接近转移,5.2 分支程序结构5.2.1 条件转移指令Jcc,Jcc label根据指定的条件确定程序是否发生转移;条件满足,发生转移;否则,顺序执行下一条指令;LABEL表示目标地址,采用段内相对寻址方式;16位CPU:字节位移量(-128+127短转移);32位CPU:多字节位移量(达到32位的全偏移量);条件转移指令不影响标志,但要利
6、用标志;cc表示利用标志判断的条件,16种、两类;单个标志状态作为条件;两数大小关系作为条件;,转移条件cc:单个标志状态,JZ/JEZF=1Jump if Zero/EqualJNZ/JNEZF=0Jump if Not Zero/Not EqualJSSF=1Jump if SignJNSSF=0Jump if Not SignJP/JPEPF=1Jump if Parity/Parity EvenJNP/JPOPF=0Jump if Not Parity/Parity OddJOOF=1Jump if OverflowJNOOF=0Jump if Not OverflowJCCF=1Ju
7、mp if CarryJNCCF=0Jump if Not Carry,转移条件cc:两数大小关系,JB/JNAECF=1Jump if Below/Not Above or EqualJNB/JAECF=0Jump if Not Below/Above or EqualJBE/JNACF=1或ZF=1Jump if Below/Not AboveJNBE/JACF=0且ZF=0Jump if Not Below or Equal/AboveJL/JNGESFOFJump if Less/Not Greater or EqualJNL/JGESF=OFJump if Not Less/Grea
8、ter or EqualJLE/JNGZFOF或ZF=1Jump if Less or Equal/Not GreaterJNLE/JGSF=OF且ZF=0Jump if Not Less or Equal/Greater,例题5-2实现指令CBW功能的程序-1,8086指令CBW(等于IA-32指令MOVSX AX,AL)如果AL最高位为0,则设置AH0;如果AL最高位为1,则设置AHFFH;如何判断AL最高位是“0”,还是“1”;逻辑与“80H”结果为0,AL最高位0;否则是1运算结果是否为0,零位标志ZF反映;JZ或JNZ指令判断并转移;,例题5-2实现指令CBW功能的程序-2,mov
9、al,bvar;取出要判断的数据 test al,80h;测试最高位 jz next1;最高位为0(ZF1)转移到标号NEXT1;mov ah,0ffh;最高位为1,顺序执行:设置AHFFH;jmp done;无条件跳过另一个分支next1:mov ah,0;最高位为0转移到此执行:设置AH0 done:,不等于零转移,等于零转移,例题5-2实现指令CBW功能的程序-3,mov al,bvar;取出要判断的数据cmp al,0;与0比较jns next3;最高位为0(SF0),转移到标号NEXT3mov ah,0ffh;最高位为1,顺序执行:设置AHFFHjmp done;无条件跳过另一个分支
10、next3:mov ah,0;最高位为0转移到此执行:设置AH00Hdone:,符号为正转移,5.2.2 单分支结构程序,条件成立转移,否则顺序执行。,例题5-6求绝对值程序,;数据段dvardd 0bd630422h;有符号数据resultdd?;保存绝对值;代码段mov eax,dvarcmp eax,0;比较EAX与0jge nonneg;条件满足:AX0,转移neg eax;条件不满足:AX0,为负数,需求补得正值nonneg:mov result,eax;分支结束,保存结果,IF-THEN结构,5.2.3 双分支结构程序,非A即B,例题5-8显示数据最高位程序-1,;数据段dvard
11、d 0bd630422h;有符号数据;代码段mov ebx,dvarshl ebx,1;EBX最高位移入CF标志jc one;CF1,最高位为1,转移mov dl,0;CF0,最高位为0:DL0jmp two;一定要跳过另一个分支体one:mov dl,1;DL1two:mov ah,2int 21h;显示,在屏幕上显示dvar变量的最高位的数(0、1)。,5.2.4 多分支结构程序,5.3 循环程序结构设计,循环结构程序构成:循环初始化循环体循环控制,循环程序结构,循环指令,LOOP label;ECXECX1;若ECX0,循环到LABEL;;否则,顺序执行JECXZ label;ECX0,
12、转移;否则顺序执行JCXZ label;CX0,转移;否则顺序执行32位段使用ECX(16位段使用CX)作为计数器目标地址采用相对短转移,例题5-11数组求和程序-1,.data array dw 123,244,2467,335,5433mov ecx,lengthof arrayxor eax,eax;求和初值为0mov ebx,eax;数组指针为0again:movzx edx,arrayebx*(type array)add eax,edx;求和 inc ebxloop againmov sum,eax;保存结果,例题5-11数组求和程序-2,mov ecx,lengthof arra
13、yxor eax,eax;求和初值为0jecxz done;数组元素为0,不再进行求和mov ebx,eax;数组指针为0again:movzx edx,arrayebx*(type array)add eax,edx;求和 inc ebxloop againdone:mov sum,eax;保存结果,循环控制,计数控制循环通过次数控制循环,常用LOOP指令实现条件控制循环根据条件决定是否进行循环,需用条件转移指令“先判断、后循环”的循环程序结构循环控制在进入循环之前进行“先循环、后判断”的循环程序结构循环之后进行循环条件判断,排序程序,例题5-13查找字符串特定字符个数程序,String d
14、b You are wellcom!,0 Space dd?mov esi,offset stringxor ebx,ebx;EBX用于记录空格数again:mov al,esicmp al,0jz done;结束标志cmp al,20h;空格的ASCII码是20Hjne next;不相等、不是空格,转移inc bx;相等、是空格,个数加1next:inc esijmp again;继续循环done:mov space,ebx;保存结果,条件控制循环,5.4 子程序结构程序设计,子程序结构,子程序:与主程序分开的、完成特定功能的一段程序。当主程序(调用程序)执行调用指令CALL调用子程序。子程
15、序(被调用程序)执行返回指令RET返回主程序,子程序调用指令CALL,CALL指令用在主程序中,实现子程序的调用;分成段内调用(近调用)和段间调用(远调用);目标地址采用相对寻址、直接寻址或间接寻址;入栈返回地址:将CALL下一条指令的地址压入堆栈;16位段段内:16位偏移地址,段间:再加16位段地址32位段段内:32位偏移地址,段间:再将16位段选择器零位扩展为32位保存到堆栈;指令调用形式CALL label;入栈返回地址,调用标号指定的子程序;CALL reg16/reg32;入栈返回地址,调用寄存器指定地址的子程序;CALL mem16/mem32;入栈返回地址,调用存储单元指定地址的
16、子程序;,子程序返回指令RET,RET指令用在子程序结束,实现返回主程序RET;无参数返回:出栈返回地址RET i16;有参数返回:出栈返回地址,ESPESPi16,MASM会根据存储模式等信息确定子程序的远近调用,并相应产生返回指令,子程序(过程)定义,格式:过程名PROC;过程体过程名ENDPPROC后面可加参数:NEAR或FAR简化段定义源程序格式中,通常不需指定;微型、小型和紧凑存储模式:默认属性NEAR;中型、大型和巨型存储模式:默认属性FAR;,子程序设计,利用过程定义,获得子程序名和调用属性;CALL指令调用子程序,RET指令返回主程序;压入和弹出操作要成对使用,保持堆栈平衡;子
17、程序的开始保护寄存器,返回前相应恢复;子程序安排在代码段的主程序之外;子程序允许嵌套;子程序可与主程序共用一个数据段,也可具有独立数据段;,最好有完整的注释,难点是参数传递,例:,将一个字(16进制)分别转换为ASCII码送显示(要转换的字放在WVAR变量中)。,子程序的参数传递,主程序与子程序间通过参数传递建立联系入口参数(输入参数):主程序子程序出口参数(输出参数):子程序主程序参数的具体内容数据本身(传递数值)数据的存储地址(传递地址,传递引用)参数传递方法:寄存器、变量或堆栈;,寄存器传递参数,最简单和常用的参数传递方法;把参数存于约定的寄存器;少量数据直接传递数值;大量数据只能传递地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 控制 转移 程序结构
![提示](https://www.desk33.com/images/bang_tan.gif)
链接地址:https://www.desk33.com/p-747655.html