3

假设我们使用addl 指令执行 C 表达式 "t=a+b" 的等价,其中 a,b,t 是 int类型的变量,那么条件代码将根据以下 C 表达式设置:

CF: (unsigned t) < (unsigned a) 无符号溢出

ZF: (t==0) 零

SF: (t<0) 负

OF: (a<0 == b<0) && (t<0 != a<0) 有符号溢出

引用自计算机系统教科书。

  • CF 是进位标志。
  • ZF 是零标志。
  • SF 是标志标志。
  • OF 是溢出标志。

我不明白为什么这些 C 表达式有上面提到的效果。例如,为什么表达式 (t<0) 会设置 SF 标志?t<0 为真或假(因为教科书只告诉了这些变量的类型),但是为什么设置了标志标志?我真的很困惑,请帮助..谢谢!

4

4 回答 4

1

CPU 在执行算术运算后设置这些标志。您所谓的“C 表达式”实际上是对设置各种 CPU 标志的条件的描述。例如,如果结果为 0,则将设置零标志。

或者为了解决您的具体问题,请执行以下操作:

SF: (t<0) 负

表示如果算术运算的结果是否定的,则 CPU 设置 SF 标志。't<0' 不是 C 表达式 - 它只是解释何时设置标志。

这些标志可以稍后用于控制流,使用根据标志值有条件地分支的指令。

于 2009-04-26T00:22:01.100 回答
1

CF、ZF、SF 和 OF 是 CC(条件代码)寄存器中的单数位。还有其他位在其他条件下设置。每当 CPU 执行某些指令(包括addsub)时,它都会根据操作的结果设置这些位。指令cmptest功能分别与suband指令相同,只是它们完全丢弃结果,唯一的输出是条件标志。

假设我们有以下 C 代码:

int a, b;
...
a -= b;
if(a < 0)
{
    // stuff...
}

一个天真的编译器可能会这样编译它:

    ; Suppose a is in the eax register and b is in the edx register
    sub %eax, %edx  ; subtract b from a, store result in a
    cmp $0, %eax    ; compare a to 0
    jl end_of_stuff ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

然而,一个更聪明的编译器会意识到sub指令已经设置了条件代码,所以它可以像这样编译它:

    sub %eax, %edx
    jl end_of_stuff   ; if a < 0, goto end_of_stuff
    ; code for stuff goes here
end_of_stuff:
    ; code after if block goes here

请注意,jl当且仅当 SF ≠ OF 时,指令(小于时跳转)才会跳转。也就是说,如果结果为负且未发生溢出,或者结果为正且确实发生了溢出,则跳转。这对于确保在差值溢出(例如与 比较)时获得正确结果是必要INT_MININT_MAX

于 2009-04-26T06:08:33.280 回答
0

这仍然不是一个明确的问题,但这是我收集到的。我想你想知道“当我所做的只是 t=a+b 时,为什么要设置标志标志 (SF)?” 我会回答的。

简单的答案是'int' C 类型是有符号的,你必须说'unsigned int' 来获得无符号版本。因此,在 t=a+b 的情况下,这些变量都是有符号的。现在为什么可以设置标志:

let a = 5, b = -10
t = a+b
t = 5 - 10
t = -5 (SF will be set because of the negative)

let a = 5, b = 10
t = a+b
t = 5 + 10
t = 15 (SF will not be set because of the positive)

如果您想了解更多关于出现在 C 中的数字符号,那么我建议您查看 Ones Complement 和 Twos Complement。

我希望这能回答这个问题。

于 2009-04-26T00:03:53.327 回答
0

反之亦然。当您在 C 中编写 t < 0 时,它会编译为以 S 标志为条件的分支(也通常称为 N 表示 Negative)。在处理器中,S 标志只​​是从结果的最高位复制而来。

于 2009-04-26T05:25:57.140 回答