x86跳转指令如何检查各自的标志?

时间:2013-05-22 20:00:37

标签: performance assembly x86 intel

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

1 个答案:

答案 0 :(得分:2)

嗯,取决于,关于机器的构建方式。

让我指出Harry Porter's Relay Computer的PDF,这是一个特别简单的计算机示例。 查看幻灯片115,他在那里显示如何处理指令。 基本上,有一大堆组合逻辑实现了一个控制每条指令执行方式的有限状态机。 FSM中的大多数步进都涉及使用地址和数据总线在寄存器之间移动数据和地址。

如果你想知道什么是组合逻辑,它是一个blob,有一堆布尔输入和一堆布尔输出,每个输出都是一些输入的布尔函数。 blob没有记忆。获取内存的方式是将一些输出反馈给输入。

所以为了回答你的问题,在该计算机的上下文中,它可能在布尔表达式中同时测试所有条件位。