二、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=1,8086/8088CPU處於單步工作方式,即在每條指令執行結束后,產生中斷。 IF中斷標志位:該標志位用來控制CPU是否響應可屏蔽中斷。若IF=1則允許中斷,否則禁止中斷。 DF方向標志:該標志位用來控制串處理指令的處理方向。若DF=1則串處理過程中地址自動遞減,否則自動遞增。 OD里能查看到 除IF標志外的 8個標志位
總結
無符號 條件轉移指令