• 汇编 sub减法指令 比较指令CMP JZ条件跳转指令


    二、SUB指令
    减法指令SUB (SUBtract) 
    格式: SUB A,B //A=A-B;
    功能: 两个操作数的相减,即从A中减去B,其结果放在A中.
    二、CMP 和JZ 指令
    比较指令CMP  
    格式: CMP A,B //  A-B;
    功能: 两个操作数的相减,即从A中减去B,其结果会影响标志位, 对标志位的影响与SUB指令相同。本条指令主要是用于配合条件转移指令使用。如JZ ZF=0时,跳转
    
    条件转移指令 JE/JZ 
    格式: JE/JZ标号 //等于跳转
    功能: ZF=1,转到指定地址执行
    说明:
    1. 指令JE与JZ等价,它们是根据标志位ZF进行转移的指令
    2. JE,JZ均为一条指令的两种助记符表示方法
    
         printf("begin
    ");
        int a=3;
        if (a!=3)
        {
            printf("do code
    ");
        }
    printf("end");

     条件跳转指令

    二、 不等于转移指令 JNE/JNZ (等于JE/JZ)
    1、 JNE/JNZ功能
    条件转移指令JNE/JNZ  //不等于转移
    格式: JNE/JNZ 标号
    功能: ZF=0,转至标号地址处执行
    2、代码测试
     printf("begin
    ");
        int a=4;
        //if (a==3) //ZF=0
        //{
        //    printf("未跳转ZF==1
    ");
        //}
        //printf("ZF==0跳转
    ");
        __asm
        {      mov eax,3
          sub eax,a //3-4
          jz end; //ZF=1
        }
        printf("未跳转
    ");
    end:
        printf("跳转
    ");
        printf("end
    ");
    getchar();
    00401004  |.  68 F4204000   PUSH JNE_JNZ.004020F4                    ; /format = "begin
    "
    00401009  |.  FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>]    ; printf
    0040100F  |.  83C4 04       ADD ESP,4
    00401012  |.  C745 FC 04000>MOV DWORD PTR SS:[EBP-4],4               ;  a=4
    00401019  |.  B8 03000000   MOV EAX,3                                ;  eax=3
    0040101E  |.  2B45 FC       SUB EAX,DWORD PTR SS:[EBP-4]             ;  3-4 cmp eax,[ebp-4]
    00401021  |.  74 0E         JE SHORT JNE_JNZ.00401031
    00401023  |.  68 FC204000   PUSH JNE_JNZ.004020FC                    ; /format = "未跳转"
    00401028  |.  FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>]    ; printf
    0040102E  |.  83C4 04       ADD ESP,4
    00401031  |>  68 04214000   PUSH JNE_JNZ.00402104                    ; /format = "跳转"
    00401036  |.  FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>]    ; printf
    0040103C  |.  83C4 04       ADD ESP,4
    0040103F  |.  68 0C214000   PUSH JNE_JNZ.0040210C                    ; /format = "end
    "
    00401044  |.  FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.printf>]    ; printf
    0040104A  |.  83C4 04       ADD ESP,4
    0040104D  |.  FF15 9C204000 CALL DWORD PTR DS:[<&MSVCR90.getchar>]   ;  MSVCR90.getchar 
    一、GOTO与JMP
    无条件跳转指令  
     格式: JMP  A
    1. 其中A为转移的目的地址。程序转移到目的地址所指向的指令继续往下执行。
    // JZ/JE  JNZ/JNE 都需要一个条件,条件成立才跳转,而jmp不需要。
    2. 本组指令对标志位无影响.
    3、代码测试
    //goto jmp
        printf("begin
    ");
        goto end;
        printf("do this");
    end:
        printf("end
    ");
    getchar();
    二、优化后的指令
       /0d 禁用优化
       /01 最小化大小
       /02 最大化速度
       /0x 完全优化
    一、指令格式
    条件转移指令 JL/JNGE  
     格式: JL/JNGE 标号地址
     功能: 小于/不大于等于时转移 标号地址
    JNGE 有符号 不大于等于 则跳转  //Jump if Not Greater or Equal
    JL    有符号 小于       则跳转 //Jump if Less
    
        SF=1; 符号标志位为1 则跳转到标号地址执行
    二、代码测试 
        printf("begin
    ");
        //>=
        int a=0xA;
        int b=0x20;
        //if (a>=b) //jl
        //{
        //    printf("do this");
        //}
        __asm 
        {
            mov ebx,b
            sub a,ebx
            jnge end
            mov ebx,ebx
            jl  end
        }
        //<
       end:
        printf("end
    ");
    一、指令格式
    条件转移指令 JLE/JNG  
     格式: JLE/JNG 标号地址
     功能: 小于等于/不大于  时转到标号地址
    JNG    有符号 不大于         则跳转    //Jump if Not Greater 
    JLE    有符号 小于等于       则跳转    //Jump if Less or Equal
        SF=1,ZF=1,OF=1 //其中一个或者多个为1 则跳转
    二、代码测试     
       {
        printf("begin
    ");
        int a=3;
        int b=5;
        if (a>b) //JLE/JNG 小于等于/不大于时转移
        {
            printf("do this");
        }
         //JNG 不大于
        printf("end;
    ");
        return 0;
    }
    一、指令格式
    JG/JNLE 标号地址  //不<=  //大于     >    // ZF=0 && SF=0 && OF=0
    JGE/JNL 标号地址  //不<   //大于等于 >=   
    JG :  Jump if Greater            //   >  跳
    JNLE:Jump if Not Less or Equal   //不<= 跳
    
    JGE :Jump if Greater or Equal // >=  跳
    JNL: Jump if Not Less        //不< 跳
    
    二、代码测试     
        printf("begin
    ");
        int a=4;
        //if (a<=3)
        //if (!(a>3))
        // 
        //{
        //    printf("小于等于");
        //}//大于时跳转//不小于等于跳转
    
        __asm
        {
            cmp a,3
            JNLE end //JG end
        }
        printf("do this
    ");
        printf("小于等于");
    end:
        printf("end");
        return 0;
    PWS 寄存器
    CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。 ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0。 SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。 OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF
    =1,否则OF=0 PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0 AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0 另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。 TF跟踪标志:该标志位为方面程序调试而设置。若TF=18086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。 IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。 DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。 OD里能查看到 除IF标志外的 8个标志位

     总结

    无符号 条件转移指令

  • 相关阅读:
    深入分析String类型(一)
    创建泛型类
    XML数据的读取—数据库配置文件
    Config配置文件读写
    jQuery动画
    设置屏幕快捷键
    jQuery事件
    jQuery操作DOM
    Python 二进制文件网址
    Centos使用crontab自动定时备份mysql的脚本
  • 原文地址:https://www.cnblogs.com/whzym111/p/6364872.html
Copyright © 2020-2023  润新知