透過JCC指令可以實現有條件跳轉,而標誌暫存器是決定JCC指令是否實現跳轉的必要條件。所以JCC指令與標誌暫存器是溝通計算機的橋樑。
【什麼是JCC指令】
JCC指令是什麼?JCC指令表示以“J”開頭的一組指令,是JMP的衍生指令,JMP表示無條件跳轉執行指令,而JCC指令是一組有條件跳轉執行指令,稱為“條件執行指令”。
為什麼需要這些條件執行指令呢?在我們一個普通的程式中,充斥著很多邏輯判斷。如一個賣票的程式,首先要判斷是否有票,然後再詢問買幾張......當我們看到票數為0時,就知道票已經售罄,而計算機並不知道數字背後的意義,這個意義是我們去設定的。
計算機發展到現在可謂神通廣大,但它其實是很笨的,你讓它減1,它就減1,然後把結果告訴你,至於這個結果有什麼意義,你不告訴它,它是沒有任何的反應的。每賣一張票,我們需要知道還有沒有票了,如果已經售罄,我們需要告訴買票人,已經沒有票了;如果有票,就可以進行下一步操作。所以我們讓計算機做這樣的事情:每賣出一張票,剩餘的票數如果是0,就讓它執行列印“票已售罄”;如果不是0,讓它執行另一段程式碼。這裡邏輯判斷就需要用到“條件執行指令”。
當我們做運算時,結果會影響標誌暫存器的值,JCC指令就是透過標誌暫存器裡的值來進行條件判斷是否跳轉的。接下來先介紹標誌暫存器。
【標誌暫存器】
標誌暫存器:標誌暫存器又稱為程式狀態和控制暫存器(Program Status and Control Register),主要用於記錄當前的程式狀態。
標誌暫存器就是一個4位元組的記憶體,而這個4位元組的記憶體是在處理器(CPU)中,4位元組包含32位,這32位中的每一位都有自己特定的意義,下面我們來看圖2-17-1:
CF位:進位標誌,PF位:奇偶標誌,AF位:輔助進位標誌,ZF位:零標誌位,SF位:符號標誌,TF位:單步標誌,DF位:方向標誌,至於剩下幾位與Windows核心相關,這裡就不介紹了。
我們借用DTDebug.exe軟體來看一下標誌暫存器在軟體中是怎麼顯示的。
在DTDebug.exe軟體中開啟飛鴿軟體,如圖2-17-1所示。
圖2-17-1中,EFL代表標誌暫存器,它後面儲存的資料是00000202,轉換為二進位制為0000 0000 0000 0000 0000 0010 0000 0010,這些位透過結合JCC指令會有特定的意義,如果沒有JCC指令,那標誌暫存器存在就沒有什麼意義了。標誌暫存器是運算指令和JCC指令的橋樑,為什麼這麼說呢?因為運算指令是修改標誌暫存器,而JCC指令是根據標誌暫存器來跳轉的,標識暫存器讓運算指令間接的控制JCC指令。
透過JCC指令可以實現有條件跳轉,而標誌暫存器是決定JCC指令是否實現跳轉的必要條件。所以JCC指令與標誌暫存器是溝通計算機的橋樑。
【什麼是JCC指令】
JCC指令是什麼?JCC指令表示以“J”開頭的一組指令,是JMP的衍生指令,JMP表示無條件跳轉執行指令,而JCC指令是一組有條件跳轉執行指令,稱為“條件執行指令”。
為什麼需要這些條件執行指令呢?在我們一個普通的程式中,充斥著很多邏輯判斷。如一個賣票的程式,首先要判斷是否有票,然後再詢問買幾張......當我們看到票數為0時,就知道票已經售罄,而計算機並不知道數字背後的意義,這個意義是我們去設定的。
計算機發展到現在可謂神通廣大,但它其實是很笨的,你讓它減1,它就減1,然後把結果告訴你,至於這個結果有什麼意義,你不告訴它,它是沒有任何的反應的。每賣一張票,我們需要知道還有沒有票了,如果已經售罄,我們需要告訴買票人,已經沒有票了;如果有票,就可以進行下一步操作。所以我們讓計算機做這樣的事情:每賣出一張票,剩餘的票數如果是0,就讓它執行列印“票已售罄”;如果不是0,讓它執行另一段程式碼。這裡邏輯判斷就需要用到“條件執行指令”。
當我們做運算時,結果會影響標誌暫存器的值,JCC指令就是透過標誌暫存器裡的值來進行條件判斷是否跳轉的。接下來先介紹標誌暫存器。
【標誌暫存器】
標誌暫存器:標誌暫存器又稱為程式狀態和控制暫存器(Program Status and Control Register),主要用於記錄當前的程式狀態。
標誌暫存器就是一個4位元組的記憶體,而這個4位元組的記憶體是在處理器(CPU)中,4位元組包含32位,這32位中的每一位都有自己特定的意義,下面我們來看圖2-17-1:
CF位:進位標誌,PF位:奇偶標誌,AF位:輔助進位標誌,ZF位:零標誌位,SF位:符號標誌,TF位:單步標誌,DF位:方向標誌,至於剩下幾位與Windows核心相關,這裡就不介紹了。
我們借用DTDebug.exe軟體來看一下標誌暫存器在軟體中是怎麼顯示的。
在DTDebug.exe軟體中開啟飛鴿軟體,如圖2-17-1所示。
圖2-17-1中,EFL代表標誌暫存器,它後面儲存的資料是00000202,轉換為二進位制為0000 0000 0000 0000 0000 0010 0000 0010,這些位透過結合JCC指令會有特定的意義,如果沒有JCC指令,那標誌暫存器存在就沒有什麼意義了。標誌暫存器是運算指令和JCC指令的橋樑,為什麼這麼說呢?因為運算指令是修改標誌暫存器,而JCC指令是根據標誌暫存器來跳轉的,標識暫存器讓運算指令間接的控制JCC指令。