匯編 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\n");
    int a=3;
    if (a!=3)
    {
        printf("do code\n");
    }
printf("end");

 條件跳轉指令

二、 不等於轉移指令 JNE/JNZ (等於JE/JZ)
1、 JNE/JNZ功能
條件轉移指令JNE/JNZ  //不等於轉移
格式: JNE/JNZ 標號
功能: ZF=0,轉至標號地址處執行
2、代碼測試
 printf("begin\n");
    int a=4;
    //if (a==3) //ZF=0
    //{
    //    printf("未跳轉ZF==1\n");
    //}
    //printf("ZF==0跳轉\n");
    __asm
    {      mov eax,3
      sub eax,a //3-4
      jz end; //ZF=1
    }
    printf("未跳轉\n");
end:
    printf("跳轉\n");
    printf("end\n");
getchar();
00401004  |.  68 F4204000   PUSH JNE_JNZ.004020F4                    ; /format = "begin\n"
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\n"
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\n");
    goto end;
    printf("do this");
end:
    printf("end\n");
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\n");
    //>=
    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\n");

 

一、指令格式
條件轉移指令 JLE/JNG  
 格式: JLE/JNG 標號地址
 功能: 小於等於/不大於  時轉到標號地址
JNG    有符號 不大於         則跳轉    //Jump if Not Greater 
JLE    有符號 小於等於       則跳轉    //Jump if Less or Equal
    SF=1,ZF=1,OF=1 //其中一個或者多個為1 則跳轉
二、代碼測試     
   {
    printf("begin\n");
    int a=3;
    int b=5;
    if (a>b) //JLE/JNG 小於等於/不大於時轉移
    {
        printf("do this");
    }
     //JNG 不大於
    printf("end;\n");
    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\n");
    int a=4;
    //if (a<=3)
    //if (!(a>3))
    // 
    //{
    //    printf("小於等於");
    //}//大於時跳轉//不小於等於跳轉

    __asm
    {
        cmp a,3
        JNLE end //JG end
    }
    printf("do this\n");
    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個標志位

 總結

 

無符號 條件轉移指令

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM