1. 程式人生 > >018-JL,JNGE JLE,JNG JG,JNLE JGE,JNL帶符號條件轉移指令小結

018-JL,JNGE JLE,JNG JG,JNLE JGE,JNL帶符號條件轉移指令小結

條件轉移指令JG(>  時轉移)

條件轉移指令JNLE(<=時不轉移)

標誌暫存器PSW

標誌暫存器PSW(程式狀態字暫存器PSW)
   標誌暫存器PSW是一個16為的暫存器。它反映了CPU運算的狀態特徵並且存放某些控制標誌。8086使用了16位中的9位,包括6個狀態標誌位和3個控制標誌位。

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

標誌

   CF(進位標誌位):當執行一個加法(減法)運算時,最高位產生進位(或借位)時,CF為1,否則為0。
   ZF零標誌位:若當前的運算結果為零,則ZF1,否則為0   SF符號標誌位:該標誌位與運算結果的最高位相同。即運算結果為負,則SF1,否則為0
   OF溢位標誌位:若運算結果超出機器能夠表示的範圍稱為溢位,此時OF1,否則為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個標誌位

JMP                        //014

JE/JZ     //=                //012 Jump if

Equl

JNE/JNZ  //=              //013

//帶符號數條件轉移指令

JL /JNGE  //>=  //小於  <  //015

JLE/JNG  //不>   //小於等於<=  //016

JG/JNLE //不<=  //大於     >//017

JGE/JNL //不<   //大於等於>=  //017

Jump     跳轉/轉移

Not      不

Equal    相等

Zero    零

Less    小於

Greater大於

一、條件轉移指令

助憶符

檢測的轉移條件

功能描述

JE/JZ

ZF=1

Jump Equal    == 跳轉

Jump Zero                =不跳轉

JNE/JNZ

ZF=0

Jump Not Equal != 跳轉

Jump Not Zero             ==不跳轉

JG/JNLE

ZF=0&&SF=OF

Jump Greater   >跳轉

Jump Not Less or Equal    <=不跳轉

JGE/JNL

SF=OF

Jump Greater Equal >=跳轉

Jump Not Less             <不跳轉

JL/JNGE

SF!=OF

Jump Less   <跳轉

Jump Not Greater or Equal  >=不跳轉

JLE/JNG

ZF=1 || SF!=OF

Jump Less or Equal  <=跳

Jump Not Greater           >不跳轉

二、程式碼測試

         JE/JZ= 不跳轉

JNZ/JNE            == 不跳轉

JG/JNLE  <= 不跳轉

JGE/JNL <  不跳轉

JL/JNGE >= 不跳轉

JLE/JNG > 不跳轉

printf("begin\n");

         //unsigned

                  int a=3,b=5;

         if (a!=b) //je

                  if (a==b) //jnz

                           if (a<=b) //jg

                                    if (a<b) //jge

                                             if (a>=b) //jl

                                                      if (a>b)//jle

                                                      {

                                                               printf("do if");

                                                      }

                                                      printf("end");

return 0;