控制转移和程序结构

上传人:tia****nde 文档编号:68231682 上传时间:2019-01-10 格式:PPT 页数:72 大小:666.31KB
返回 下载 相关 举报
控制转移和程序结构_第1页
第1页 / 共72页
控制转移和程序结构_第2页
第2页 / 共72页
控制转移和程序结构_第3页
第3页 / 共72页
控制转移和程序结构_第4页
第4页 / 共72页
控制转移和程序结构_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《控制转移和程序结构》由会员分享,可在线阅读,更多相关《控制转移和程序结构(72页珍藏版)》请在金锄头文库上搜索。

1、第5章 控制转移和程序结构,微型计算机原理及应用,2006年,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. 直接寻址方式 直接提供目标

3、地址; 目标地址(转移后的CS和EIP)指令操作数; 3. 间接寻址方式 由寄存器或存储单元提供跳转地址; 目标地址来自寄存器或存储单元、间接获得; 寄存器间接寻址:用寄存器保存目标地址; 存储器间接寻址:用存储单元保存目标地址;,5.1.3 无条件转移指令JMP,JMP label ;程序转向label标号指定的地址; ;有段内相对寻址,段间直接寻址; JMP reg16/reg32 ;程序转向寄存器指定的地址; ;为寄存器间接寻址; JMP mem16/mem32 ;程序转向存储单元指定的地址; ;为存储器间接寻址;,JMP指令的4种类型,1. 段内转移、相对寻址 标号指明目标地址,指令代

4、码包含位移量; 2. 段内转移、间接寻址 通用寄存器或主存单元包含目标指令的偏移地址; 3. 段间转移、直接寻址 标号包含目标指令的段地址和偏移地址; 4. 段间转移、间接寻址 16位段用双字存储单元包含目标地址; 32位段用3字存储单元包含目标地址;,MASM会根据存储模式等信息自动识别,例题5-1无条件转移程序-1,;数据段 0000 0000 nvar dw ? ;代码段 0010 EB 01 jmp labl1 ;8位位移量 0012 90 nop 0013 B8 FF02 labl1: mov ax,type labl1 0016 E9 0001 jmp near ptr labl2

5、 ;16位位移量 0019 90 nop 001A B8 0020 R labl2: mov ax,offset labl3 ; 001D FF E0 jmp ax 001F 90 nop 0020 B8 002B R labl3: mov ax,offset labl4 0023 A3 0000 R mov nvar,ax 0026 FF 26 0000 R jmp nvar 002A 90 nop,相对短转移,相对近转移,寄存器间接近转移,存储器间接近转移,5.2 分支程序结构 5.2.1 条件转移指令Jcc,Jcc label 根据指定的条件确定程序是否发生转移; 条件满足,发生转移;否

6、则,顺序执行下一条指令; LABEL表示目标地址,采用段内相对寻址方式; 16位CPU:字节位移量(-128+127短转移); 32位CPU:多字节位移量(达到32位的全偏移量); 条件转移指令不影响标志,但要利用标志; cc表示利用标志判断的条件,16种、两类; 单个标志状态作为条件; 两数大小关系作为条件;,转移条件cc:单个标志状态,JZ/JE ZF=1 Jump if Zero/Equal JNZ/JNE ZF=0 Jump if Not Zero/Not Equal JS SF=1 Jump if Sign JNS SF=0 Jump if Not Sign JP/JPE PF=1

7、Jump if Parity/Parity Even JNP/JPO PF=0 Jump if Not Parity/Parity Odd JO OF=1 Jump if Overflow JNO OF=0 Jump if Not Overflow JC CF=1 Jump if Carry JNC CF=0 Jump if Not Carry,转移条件cc:两数大小关系,JB/JNAE CF=1 Jump if Below/Not Above or Equal JNB/JAE CF=0 Jump if Not Below/Above or Equal JBE/JNA CF=1或ZF=1 Ju

8、mp if Below/Not Above JNBE/JA CF=0且ZF=0 Jump if Not Below or Equal/Above JL/JNGE SFOF Jump if Less/Not Greater or Equal JNL/JGE SF=OF Jump if Not Less/Greater or Equal JLE/JNG ZFOF或ZF=1 Jump if Less or Equal/Not Greater JNLE/JG SF=OF且ZF=0 Jump if Not Less or Equal/Greater,例题5-2实现指令CBW功能的程序-1,8086指令C

9、BW(等于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 al,bvar ;取出要判断的数据 test al,80h ;测试最高位 jz next1 ;最高位为0(ZF1)转移到标号NEXT1; mov ah,0ffh;最高位为1,顺序执行:设置AHFFH; jmp done ;无条件跳过另一个分支 next1:mov a

10、h,0;最高位为0转移到此执行:设置AH0 done:,不等于零转移,等于零转移,例题5-2实现指令CBW功能的程序-3,mov al,bvar ;取出要判断的数据 cmp al,0 ;与0比较 jns next3 ;最高位为0(SF0),转移到标号NEXT3 mov ah,0ffh;最高位为1,顺序执行:设置AHFFH jmp done ;无条件跳过另一个分支 next3: mov ah,0;最高位为0转移到此执行:设置AH00H done:,符号为正转移,5.2.2 单分支结构程序,条件成立转移,否则顺序执行。,例题5-6求绝对值程序,;数据段 dvar dd 0bd630422h ;有符

11、号数据 result dd ? ;保存绝对值 ;代码段 mov eax,dvar cmp eax,0 ;比较EAX与0 jge nonneg ;条件满足:AX0,转移 neg eax ;条件不满足:AX0,为负数,需求补得正值 nonneg: mov result,eax ;分支结束,保存结果,IF-THEN结构,5.2.3 双分支结构程序,非A即B,例题5-8显示数据最高位程序-1,;数据段 dvar dd 0bd630422h ;有符号数据 ;代码段 mov ebx,dvar shl ebx,1 ;EBX最高位移入CF标志 jc one ;CF1,最高位为1,转移 mov dl,0 ;CF

12、0,最高位为0:DL0 jmp two ;一定要跳过另一个分支体 one: mov dl,1 ;DL1 two: mov ah,2 int 21h ;显示,在屏幕上显示dvar变量的最高位的数(0、1)。,5.2.4 多分支结构程序,5.3 循环程序结构设计,循环结构程序构成: 循环初始化 循环体 循环控制,循环程序结构,循环指令,LOOP label ;ECXECX1;若ECX0,循环到LABEL; ;否则,顺序执行 JECXZ label ;ECX0,转移;否则顺序执行 JCXZ label ;CX0,转移;否则顺序执行 32位段使用ECX(16位段使用CX)作为计数器 目标地址采用相对短

13、转移,例题5-11数组求和程序-1,.data array dw 123,244,2467,335,5433 mov ecx,lengthof array xor eax,eax ;求和初值为0 mov ebx,eax ;数组指针为0 again: movzx edx,arrayebx*(type array) add eax,edx ;求和 inc ebx loop again mov sum,eax ;保存结果,例题5-11数组求和程序-2,mov ecx,lengthof array xor eax,eax ;求和初值为0 jecxz done ;数组元素为0,不再进行求和 mov eb

14、x,eax ;数组指针为0 again: movzx edx,arrayebx*(type array) add eax,edx ;求和 inc ebx loop again done: mov sum,eax ;保存结果,循环控制,计数控制循环 通过次数控制循环,常用LOOP指令实现 条件控制循环 根据条件决定是否进行循环,需用条件转移指令 “先判断、后循环”的循环程序结构 循环控制在进入循环之前进行 “先循环、后判断”的循环程序结构 循环之后进行循环条件判断,排序程序,例题5-13查找字符串特定字符个数程序,String db You are wellcom!,0 Space dd ? m

15、ov esi,offset string xor ebx,ebx ;EBX用于记录空格数 again: mov al,esi cmp al,0 jz done ;结束标志 cmp al,20h ;空格的ASCII码是20H jne next ;不相等、不是空格,转移 inc bx ;相等、是空格,个数加1 next: inc esi jmp again ;继续循环 done: mov space,ebx ;保存结果,条件控制循环,5.4 子程序结构程序设计,子程序结构,子程序:与主程序分开的、完成特定功能的一段程序。 当主程序(调用程序)执行调用指令CALL调用子程序。 子程序(被调用程序)执

16、行返回指令RET返回主程序,子程序调用指令CALL,CALL指令用在主程序中,实现子程序的调用; 分成段内调用(近调用)和段间调用(远调用); 目标地址采用相对寻址、直接寻址或间接寻址; 入栈返回地址:将CALL下一条指令的地址压入堆栈; 16位段段内:16位偏移地址,段间:再加16位段地址 32位段段内:32位偏移地址,段间:再将16位段选择器零位扩展为32位保存到堆栈; 指令调用形式 CALL label ;入栈返回地址,调用标号指定的子程序; CALL reg16/reg32 ;入栈返回地址,调用寄存器指定地址的子程序; CALL mem16/mem32 ;入栈返回地址,调用存储单元指定地址的子程序;,子程序返回指令RET,RET指令用在子程序结束,实现返回主程序 RET ;无参数返回:出栈返回地址 RET i16 ;有参数返回:出栈返回地址,ESPESPi16,MASM会根据存储模式等信息确定子程序的远近调用,并相应产生返回指令,子程序(过程)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号