1

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

4

1 回答 1

2

好吧,这取决于机器的制造方式。

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

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

因此,要回答您的问题,在该计算机的上下文中,它可能会在布尔表达式中同时测试所有条件位。

于 2013-05-22T21:05:36.227 回答