簡體   English   中英

x86跳轉指令如何檢查其各自的標志?

[英]How do x86 jump instructions check their respective flags?

據我了解,條件跳轉檢查CMP指令后設置的標志的狀態。 例如:

CMP     AX,DX    ; Set compare flags
JGE     DONE     ; Go to DONE label if AX >= DX
...
DONE:
...

在這種情況下如何實際檢查標志? 如果我沒記錯的話,這些標志是特殊寄存器中的各個位。 那么一次檢查一次還是一次檢查一次? 在C偽代碼中:

unsigned flags = 0;    /* reset all flags */

/* define the flags */
const unsigned GREATER = 1<<1;
const unsigned EQUAL = 1<<2;
const unsigned LESS  = 1<<3;

unsigned AX = 4;    /* initialize AX */
unsigned DX = 3;    /* initialize DX */

/* CMP AX,DX */
int result = AX - DX;
if(result > 0){
    flags |= GREATER;
}else if(result == 0){
    flags |= EQUAL;
}else if(result < 0){
    flags |= LESS;
}

/* -------------------------------- */

/* JGE Method 1 */
if(flags & GREATER){
    goto DONE;
}
if(flags & EQUAL){
    goto DONE;
}

/* or JGE Method 2 */
if(flags & (GREATER|EQUAL)){
    goto DONE;
}

不要深入研究標志設置代碼-我知道實際的x86處理器標志是自然填充的,而不是顯式設置的-我關心的是如何實際檢查這些標志:逐位還是環繞位掩碼。

好吧, 這取決於機器的構建方式。

讓我為您指出哈里·波特中繼計算機的PDF,這是一個特別簡單的計算機示例。 查看幻燈片115,他在其中顯示了如何處理指令。 基本上,有大量的組合邏輯實現了控制每個指令執行方式的有限狀態機。 FSM中的大多數步驟與使用地址和數據總線在寄存器之間移動數據和地址有關。

如果您想知道什么是組合邏輯,那么它是一個具有一堆布爾輸入和一堆布爾輸出的Blob,每個輸出都是其中一些輸入的布爾函數。 Blob沒有內存。 它獲取內存的方式是將一些輸出反饋回輸入。

因此,為了回答您的問題,在該計算機的上下文中,它可能同時以布爾表達式測試所有條件位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM