【问题标题】:About assembly conditional code register关于汇编条件码寄存器
【发布时间】:2010-10-21 20:27:42
【问题描述】:

假设我们使用 addl 执行等效指令 C 表达式的“t=a+b”,其中 a,b,t 是类型变量 int,那么条件码会按照下面的C来设置 表达式:

CF: (unsigned t)

ZF:(t==0) 零

SF:(t

OF: (a

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

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

我想不通为什么这些C表达式会有上面提到的效果。例如,为什么表达式(t

【问题讨论】:

  • 对您的一些帮助:CF 是 CarryFlag ZF 是 ZeroFlag SF 是 SignFlag OF 是 OverflowFlag。一切都只是猜测。你应该在你的问题中提供更多信息。你的文字到底是关于什么的?到目前为止,这听起来不像是一个问题......
  • 至少没有一个不用猜就可以回答的:)
  • 感谢您的评论,这绝对不是一个明确的问题,我编辑了它。:-)

标签: assembly flags status-register


【解决方案1】:

这仍然不是一个明确的问题,但这是我收集到的。我想你想知道“当我所做的只是 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。

我希望能回答这个问题。

【讨论】:

    【解决方案2】:

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

    或者为了解决你的具体问题,如下:

    SF:(t

    表示如果算术运算的结果是否定的,CPU 设置 SF 标志。 't

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

    【讨论】:

      【解决方案3】:

      反之亦然。当您在 C 中编写 t

      【讨论】:

        【解决方案4】:

        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)。

        【讨论】:

          猜你喜欢
          • 2021-03-25
          • 1970-01-01
          • 2014-11-21
          • 1970-01-01
          • 2016-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          相关资源
          最近更新 更多