分享
分销 收藏 举报 申诉 / 69

类型第4部分程序的逻辑流程控制.ppt

  • 上传人:知****运
  • 文档编号:14661113
  • 上传时间:2026-10-26
  • 格式:PPT
  • 页数:69
  • 大小:574.54KB
  • 下载积分:10 金币
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    部分 程序 逻辑 流程 控制
    资源描述:
    Asl balk stili iin tklatn,Asl metin stillerini dzenlemek iin tklatn,İkinci dzey,nc dzey,Drdnc dzey,Beinci dzey,*,第4部分 程序的逻辑流程控制,Assembly Language Programming,1,基本的逻辑控制无条件转移,Assembly Language Programming,程序的逻辑控制,顺序执行,依照程序的指令顺序直线式执行,大多程序是测试分支或者循环执行的,前向执行:跳过一些指令执行前面的的指令,后向执行:重新执行一些指令,这需要通过改变IP(偏移量)实现程序执行的跳转,跳转的地址类型,依据程序执行跳转的距离长短,区分3种地址类型,SHORT短,相对地址是具有1字节的偏移量,即-128到127字节的长度,NEAR近,相对地址是具有2字节的偏移量,FAR远,任意相对地址长度,一般指的是跨段跳转时的偏移量。,JMP指令,格式:,label:JMP short/near/far address,作用:无条件的改变,IP使之指向目的地址,举例:,段内直接:,JMPTARGET,段内间接:,JMPCX,JMPWORD PTR BX,段间:,JMP FAR PTR TARGET,JMP DWORDPTR BXSI,LOOP指令,格式,:label:LOOP,short-address,动作:,CX减去1,若CX!=0则跳转到目的地址,注意:,只适用于短地址,对标志寄存器没有影响,举例:,page 60,132,TITLEA07LOOP(COM)Illustration of LOOP,.MODEL SMALL,.CODE,ORG 100H,A10MAINPROC NEAR,MOV AX,0;Initialize AX and,MOV BX,0;BX to zero,MOV DX,1;DX to 01,MOV CX,8;CX for 8 loops,A20:,INC AX;Add 01 to AX,ADD BX,AX;Add AX to BX,SHL DX,1;Double DX,LOOP A20;Decrement CX,;loop if nonzero,MOV AX,4C00H;End processing,INT 21H,A10MAINENDP,END A10MAIN,例1,LOOP的变种,Loop while(ZF/equal),|(,CX,=,=0),LOOPZ=LOOPE,Loop while(NZ/not equal),|(,CX!=0),LOOPNZ=LOOPNE,依据ZF是否被设置,进行循环,注意:对标志寄存器没有影响,举例,该程序最多从键盘接收9个字符,当第9个字符按下,或者enter键按下时,程序结束。,MOV AH,1,MOV CX,9,next_char:,INT 21H,CMP AL,13,LOOPNE next_char,2,条件转移逻辑控制,Assembly Language Programming,Recap:标志寄存器,算术、逻辑和比较指令影响各个位的设置,保存了当前程序的执行状态,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,OF DF IF TF SF ZF,AF PF CF,在转移控制中,,经常使用的标志,ZF(Zero Flag),:set if the result of the operation is zero,CF(Carry Flag):,set if there is carry out of the addition of two unsigned numbers,SF(Sign Flag):,set if the result is a negative number,条件转移指令,格式:,Jnnn short-address,通常条件转移指令列表,JZ jump if zero ZF=1,JE jump if equal ZF=1,JNZ jump if not zero ZF=0,JNE jump if not equal ZF=0,JC jump if carry CF=1,JNC jump if no carry CF=0,JCXZ jump if CX=0 CX=0,无符号数:相等equal,高于above,低于below,有符号数:相等equal,大于greater,小于less,无符号数转移指令,JA,jump if above,op1 op2,CF=0且ZF=0,JNBE,jump if not below or equal,!(op1=op2,CF=0,JNB,jump if not below,!(op1 op2),CF=0,JB,jump if below,op1=op2),CF=1,JBE,jump if below or equal,op1 op2),CF=1或 ZF=1,有符号数的条件转移,TITLEA07CASE(COM)Change uppercase to lowercase,.MODEL SMALL,.CODE,ORG 100H,BEGIN:JMP A10MAIN,;-,CONAMEDB LASER-12 SYSTEMS,$,;-,A10MAINPROC NEAR,LEA BX,CONAME+1;1st char to change,MOV CX,15;No.of chars to change,举例:字符串的大小写转换,A20:,MOV AH,BX;Character from CONAME,CMP AH,41H;Is it,JB A30;upper,CMP AH,5AH;case,JA A30;letter?,XOR AH,00100000B;Yes,convert,MOV BX,AH;Restore in CONAME,A30:,INC BX;Set for next char,LOOP A20;Loop 15 times,;Done,MOV AH,09H;display,LEA DX,CONAME;CONAME,INT 21H,MOV AX,4C00H;End processing,INT 21H,A10MAINENDP,END BEGIN,If结构,C/C+code,if(op1=op2,;,;,;,Assembly Implementation,方案1,CMP op1,op2,JE true,JMP,endif,true:,endif,:,方案2,CMP op1,op2,JNE,endif,endif,:,If-else结构,C/C+code,if(op1=op2,;,else,;,;,Assembly Implementation,CMP op1,op2,JNE else,JMP endif,else:,endif:,组合OR条件,C/C+code,if(op1 op2|op3=op4),;,;,Assembly Implementation,CMP op1,op2,JG L1,CMP op3,op4,JGE L1,JMP L2,L1:,L2:,组合AND条件,C/C+code,if(op1 op2&op3=op4),;,;,Assembly Implementation,CMP op1,op2,JLE L2,CMP op3,op4,JL L2,L2:,While循环结构,C/C+code,while(op1 7)do_it();,;if(n7),mov ax,n,cmp ax,7,jna skip_it,;then-part,call do_it,;end if,skip_it:,for(x=9;x0;x-)n+=x;,;for(x=9;x0;x-),mov cx,9,top_loop:,add n,cx ;n=n+x,loop top_loop,char n,k;unsigned int w;,if(nk|w=10),whatever();,;if(nk|w=A&w=x),whatever();,;if(n=A&w=x),cmp n,A,jl no_go,mov ax,w,cmp ax,x,jne no_go,;then-part,call whatever,no_go:,int n;,while(n0)n-=2;,;while(n0),while_:,cmp n,0,jle end_while,;loop-body,sub n,2,jmp while_,end_while:,char n;,if(n=7),do_it();,else,do_that();,;if(n=7),cmp n,7,jne else_,;then-part,call do_it,jmp short endif,else_:,call do_that,endif:,TITLEA06MOVE(EXE)Repetitive move operations,.MODEL SMALL,.STACK 64,;-,.DATA,HEADNG1DB InterTech,HEADNG2DB 9 DUP(*),$,;-,.CODE,A10MAINPROC FAR,MOV AX,data;Initialize segment,MOV DS,AX;registers,MOV ES,AX,MOV CX,09;Initialize to move 9 chars,LEA SI,HEADNG1;Initialize offset addresses,LEA DI,HEADNG2;of HEADNG1 and HEADNG2,A20:,MOV AL,SI;Get character from HEADNG1,MOV DI,AL;move it to HEADNG2,INC SI;Incr next char in HEADNG1,INC DI;Incr next posn in HEADNG2,DEC CX;Decrement count for loop,JNZ A20;Count not zero?Yes,loop,;Finished,MOV AH,09H;Request display,LEA DX,HEADNG2;of HEADNG2,INT 21H,MOV AX,4C00H;End processing,INT 21H,A10MAINENDP,END A10MAIN,3 堆栈,Assembly Language Programming,堆栈Stack,LIFO,数据结构,支持,PUSH,和,POP,操作,作用,发生中断处理和过程调用时,保护当前执行的现场;返回时,依据堆栈保存的地址继续执行,堆栈的构造,所有的可执行程序都有堆栈结构,堆栈是通过堆栈段寄存器和偏移量访问的一段内存区域,SS,:指向了堆栈的开始地址,SP,:指向了堆栈的顶部,堆栈的初始化,堆栈定义的伪指令,方法1:,The_Stack DB Stack_Size dup(?),方法2:,.,STACK Stack_Size,例如:,.stack 12 ;,分配预留的堆栈空间大小,SP:000C,SS:0340,Stack Size:000C,动作,PUSH,:,压栈操作,减少SP,POP,:,出栈操作,增加SP,SP:0008,SS:0340,Stack Size:000C,PUSH,POP,PUSH,PUSH,source,source,指的是任何16/32位通用或者段寄存器,或者字/双字的地址,PUSHF or PUSHFD,将标志寄存器的内容压栈,动作:,SP,减去2/4,在SS:SP地址存放,source,数据,PUSH,举例,PUSH AX,3C,09,A4,40,2C,FF,A2,43,2A,09,46,SP:0008,07,06,4C,SS:0340,Stack Size:000C,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0006,01,06,4C,SS:0340,AX:0123,POP,POP,destination,destination,指的是任何16/32位通用或者段寄存器,或者字/双字的地址,POPF or POPFD,将标志寄存器的内容出栈,存入标志寄存器,动作:,将,SS:SP,地址的数据拷贝到,destination,SP,加2/4,POP,举例,POP ES,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0008,01,06,4C,SS:0340,3C,09,A4,40,2C,FF,A2,23,2A,09,46,SP:0006,01,06,4C,SS:0340,ES:0123,PUSH和POP程序举例,page 60,132,TITLE PUSHPOP(EXE)push and pop a number of data,;.386,.MODEL SMALL,.STACK 64,.DATA,flda dw 2a45h,fldb dw 4567h,;-,.CODE,MAIN PROC FAR,mov ax,data,mov ds,ax,mov ax,flda,push ax;push word,push word ptr fldb;push word from fldb,pop bx;pop word to bx,pop ax;pop word to ax,MOV AX,4C00H;End processing,INT 21H,MAIN ENDP,END MAIN,跟踪调试,-n pushpop.exe,-l,-R,AX=0000 BX=0000 CX=0018 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1D CS=0B1B IP=0000 NV UP EI PL NZ NA PO NC,0B1B:0000 B81C0B MOV AX,0B1C,-t,AX=0B1C BX=0000 CX=0018 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1D CS=0B1B IP=0003 NV UP EI PL NZ NA PO NC,0B1B:0003 8ED8 MOV DS,AX,-t,AX=0B1C BX=0000 CX=0018 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B1C ES=0B0B SS=0B1D CS=0B1B IP=0005 NV UP EI PL NZ NA PO NC,0B1B:0005 A10400 MOV AX,0004 DS:0004=2A45,-t,AX=2A45 BX=0000 CX=0018 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B1C ES=0B0B SS=0B1D CS=0B1B IP=0008 NV UP EI PL NZ NA PO NC,0B1B:0008 50 PUSH AX,-D SS:00 L40,0B1D:0000 CA 00 76 03 E9 F8 00 E8-C2 29 A3 34 37 05 03 00.v.).47.,0B1D:0010 2B D2 01 06 14 38 11 16-16 38 A1 5C 36 24 FE 2D+.8.8.6$.-,0B1D:0020 80 00 A8 01 75 57 3D 4A-00 77 52 93 2E FF A7 31.uW=J.wR.1,0B1D:0030 5F 87 5F 87 45 2A 45 2A-00 00 08 00 1B 0B 2D 05 _._.E*E*.-.,-t,堆栈的越界,Over/Underflow,处理器没有对堆栈进行非法操作检查,程序一般需要考虑堆栈的错误检查,Overflow,occurs when SP is smaller than the address of the start of the stack array,Usually this means SP is decremented past 0!,Underflow,occurs if SP gets bigger than its starting value,Out Of Bounds!,Stack Overflow,Stack Underflow,SP:000D,SS:0340,Stack Size:000C,SP:FFFE,SS:0340,Stack Size:000C,4 过程,Procedure,Assembly Language Programming,模块化编程和过程,过程相当于C/C+语言中的函数,作用模块化编程,代码重用,信息的包装和隐藏,便于组织、调试和维护程序,过程的定义,proc_name,PROC,type,;,过程体,RET;,返回调用处,proc_name,ENDP,type,对应的值,NEAR,或,FAR,默认为,NEAR,过程的定义中可能含有一个或者多个,RET,近过程调用和返回,调用过程(,NEAR),CALL,proc_name,把当前IP的内容压栈,SP,=,SP-2,move the contents of,IP,to locations,SP,SP+1,将,proc_name,地址拷贝到,IP,中,过程返回(,NEAR),RET,将栈顶数据出栈到IP中,move the contents of locations,SP,SP+1,into,IP,SP,=,SP,+2,远过程,调用(,FAR),CALL,proc_name,将当前,CS,和,IP,内容入栈,将远地址拷贝到,CS:IP,中,返回(,FAR),RET,将栈顶的数据依次出栈到IP和CS中,注:远过程调用最后涉及,现在只是讲述近过程调用,近过程调用举例,page 60,132,TITLEA07CALLP(EXE)Calling procedures,.MODEL SMALL,.STACK 64,.DATA,;-,.CODE,A10MAINPROC FAR,CALL B10;Call B10,;.,MOV AX,4C00H;End processing,INT 21H,A10MAINENDP,;-,B10PROC NEAR,CALL C10;Call C10,;.,RET,;Return to,B10ENDP;caller,;-,C10PROC NEAR,;.,RET,;Return to,C10ENDP;caller,;-,END A10MAIN,跟踪调试,-n a07callp.exe,-l,-R,AX=0000 BX=0000 CX=000D DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1C CS=0B1B,IP=0000,NV UP EI PL NZ NA PO NC,0B1B:0000 E80500,CALL 0008,-t,AX=0000 BX=0000 CX=000D DX=0000 SP=003E BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1C CS=0B1B,IP=0008,NV UP EI PL NZ NA PO NC,0B1B:0008 E80100,CALL 000C,-t,AX=0000 BX=0000 CX=000D DX=0000 SP=003C BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1C CS=0B1B,IP=000C,NV UP EI PL NZ NA PO NC,0B1B:000C C3,RET,过程调用数据上下文的保护,寄存器的内容是过程运行的上下文,假如过程A调用过程B:,过程B一开始应该保存过程中所有使用的寄存器,过程B在返回之前,应该恢复所保存的数据,这样过程A调用过程之后具有一致的上下文,使用堆栈的操作进行数据上下文保护,数据上下文保护举例,page 60,132,TITLE REGSAVE(EXE)Saving registers in procedures,.MODEL SMALL,.STACK 64,.DATA,;-,.CODE,A10MAIN PROC FAR,MOV AX,data,MOV DS,AX,MOV AX,3456H,CALL B10;Call B10,CMP AX,3456H,MOV AX,4C00H;End processing,INT 21H,A10MAIN ENDP,;-,B10 PROC NEAR,PUSH AX,MOV AX,0ABCDH,CALL C10,CMP AX,0ABCDH,POP AX,RET;Return to,B10 ENDP;caller,;-,C10 PROC NEAR,PUSH AX,MOV AX,23,ADD AX,45,POP AX,RET;Return to,C10 ENDP;caller,;-,END A10MAIN,跟踪调试,-n regsave.exe,-l,-R,AX=0000,BX=0000 CX=0028 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1E CS=0B1B IP=0000 NV UP EI PL NZ NA PO NC,0B1B:0000 B81D0B MOV AX,0B1D,-t,AX=0B1D BX=0000 CX=0028 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B0B ES=0B0B SS=0B1E CS=0B1B IP=0003 NV UP EI PL NZ NA PO NC,0B1B:0003 8ED8 MOV DS,AX,-t,AX=0B1D BX=0000 CX=0028 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B1D ES=0B0B SS=0B1E CS=0B1B IP=0005 NV UP EI PL NZ NA PO NC,0B1B:0005 B85634 MOV AX,3456,-t,AX=3456 BX=0000 CX=0028 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000,DS=0B1D ES=0B0B SS=0B1E CS=0B1B IP=0008 NV UP EI PL NZ NA PO NC,0B1B:0008 E80800 CALL 0013,-D SS:00 L40,0B1E:0000 2B D2 01 06 14 38 11 16-16 38 A1 5C 36 24 FE 2D+.8.8.6$.-,0B1E:0010 80 00 A8 01 75 57 3D 4A-00 77 52 93 2E FF A7 31.uW=J.wR.1,0B1E:0020 5F 87 5F 87 5F 7D 5F 7D-5F 8C 5F 91 5F AC 5F B1 _._._._._._.,0B1E:0030 5F B6 5F 7D 5F 7D 56 34-00 00 08 00 1B 0B 2D 05 _._V4.-.,-t,过程间参数的传递,当调用过程时,两种主要的方法实现过程参数的传递:,值传递,传递实际的数据值,引用传递,传递数据的地址,这两者可以利用,寄存器,或者,堆栈,实现,C语言的形式,值传递,short int abc10(short int);,引用传递,short int abc10(short int*);,值传递参数寄存器实现,mov ax,multiplicand,mov bx,multiplier,call m30mult,.,m30mult proc near,mul bx ;result is ax,ret,m30mult endp,通过寄存器传递参数值,值传递参数堆栈实现,push multiplicand ;put paramenters onto the stack frame,push multiplier,call m30mult,.,m30mult proc near,PUSH BP,;save bp of the calling procedure,MOV BP,SP;freeze sp into bp,MOV AX,BP+6;use bp to access parameters,MUL WORD PTR BP+4;result is in ax,POP BP;restore bp of the calling procedure,RET 4;return and increase SP by 4,;to discard the input parameters,m30mult endp,解释,将SP拷贝到BP非常重要,因为SP一直随着push,pop和ret等操作而发生变化。而,BP作为调用过程的堆栈的基地址,一般保持不变。因此,BP适合作为访问参数和局部变量使用。,POP BP 恢复调用时堆栈的基地址,最后返回时,SP=SP+4 将传递的参数移除掉,同时恢复调用时IP的内容。,引用参数传递寄存器,LEA BX,multiplicand,LEA SI,multiplier,call m30mult,.,m30mult proc near,MOVAX,BX;get the vaule indirectly,MUL WORD PTR SI;result is ax,RET,m30mult endp,引用参数传递堆栈,push offset multiplicand;put paramenter references,push offset multiplier;onto the stack frame,call m30mult,.,m30mult proc near,push bp;save bp of the calling procedure,mov bp,sp;freeze sp into bp,mov bx,bp+6;get the address of the multiplicand,mov di,bp+4;get the address of the multiplier,movax,bx;get the value of the multiplicand,mul work ptr di;result is in ax,pop bp;restore bp of the calling procedure,ret 4;return and increase SP by 4,;to discard the input parameters,m30mult endp,局部变量的实现,局部变量的实现是借助被调用过程的堆栈实现的,利用减少SP分配局部变量的空间,利用堆栈的基址BP访问局部变量,局部变量,动态连接,返回地址,参数列表,SP,BP,举例C语言实现的例子,short int xyz=16;,short int result;,short int abc10(short int);,short int main(),result=abc01(xyz);,return 0;,short int abc01(short int x),short int aa=32;/局部变量,return x*aa;,举例汇编的实现,TITLE Lab2(EXE)call-by-value and local variables,.MODEL SMALL,.STACK 64,;-,.DATA,xyz dw 16,result dw?,;-,.CODE,main PROC FAR,MOV AX,data;Initialize data segment,MOV DS,AX;registers,mov ax,xyz,push ax;pass parameter into the stack frame,call abc01;push return address into the stack frame,add sp,2;increase sp to pass the parameter,mov result,ax;put return value into varaible result,MOV AX,4C00H;End processing,INT 21H,main ENDP,abc01 proc near,push bp;push bp into stack as the dynamic link,mov bp,sp;change bp to point to the dynamic link,add sp,-2;allocate local variable,mov word ptr bp-2,32;initialize local variable,mov ax,bp+4 ;fetch the actual of the parameter,mul word ptr bp-2 ;multiply it with the local variable,mov sp,bp;restore sp,pop bp;restore the bp of calling,procedure,ret,abc01 endp,END main,跟踪调试,查看,值传递参数调用,返回值在AX中,A Typical Stack Frame,LW,LW,LB,BP,RA,P1,P2,P3,BP,SP,BP+4,BP+6,BP+8,BP-2,BP-3,BP-5,Parameters,Locals,
    展开阅读全文

    开通VIP折扣优惠下载文档

    提示  咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。

    咨信网小贴示:
    1、浏览或下载可查看了解,请点击【咨信网告知】。
    2、下载文件中如有侵权或不适当内容,将立即纠正。
    3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
    4、开具发票登录电脑端申请,请点击【索取发票】。

    咨信网客服组:【微信客服】

    自信AI创作助手
    关于本文
    本文标题:第4部分程序的逻辑流程控制.ppt
    链接地址:https://www.zixin.com.cn/doc/14661113.html

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork