据我了解,条件跳转检查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 处理器标志是自然填充的,而不是显式设置的——我关心的是如何实际检查这些标志:逐位或包含位掩码。