当前位置:  开发笔记 > 运维 > 正文

处理器如何处理条件?

如何解决《处理器如何处理条件?》经验,为你挑选了2个好方法。

那么,SUPER低级IF()看起来是什么样的,x86处理器是如何处理的呢?



1> Adam Davis..:

处理器具有"分支如果"指令,当满足某个条件时,它将分支,否则它继续到下一条指令.

所以

if(A)
{
    dosomething;
}

会成为

load A into register 0
if the zero flag is set (ie, register 0 contains 0x00) then jump to endcondition)
dosomething
endcondition:

更复杂的条件(if(A || B && C))成为一个指令序列,使寄存器处于0或非零状态,因此branchif指令可以根据条件标志跳转或不跳转.

有许多条件标志(零,进位,负,溢出等),并且一些分支指令也可以在更复杂的条件下运行(即,它实际上可以检查寄存器是否等于另一个寄存器,而不是简单地查看标志).每种架构都是不同的,并且需要权衡,因此指令集是完整的,但也是快速和紧凑的.

正如moocha在评论中指出的那样,一些架构允许您对一些,许多甚至所有指令应用条件,因此您可能不仅有'branch if'指令,还有'和if','add if', '移动如果'等

一旦你进入流水线操作,乱序执行,缓存,微代码和所有其他高级主题,x86就会非常非常复杂.对于大多数目的,上述说明就足够了.但是,如果您正在编写手工制作的非常紧凑的算法,则必须考虑这些因素以获得最佳性能和吞吐量.

这是另一个问题的主题,但......

-亚当



2> ConcernedOfT..:

使用C编译器的输出(使用-Sgcc上的开关)相当容易,看看给定的C片段在编译时会产生什么输出.在玩具程序上使用优化时要小心.如果你不小心,优化器通常会优化掉总是会有这种或那种方式的条件(有关更详细的解释,请参阅有关微基准测试的文章).

例如,一个简单的C程序:

#include 

int main (int argc, char **argv) {
    int ii = 10;
    int jj = 20;
    if (jj > ii) {
        puts ("jj > ii \n");
    }
    return 0;
}

编译为以下汇编语言:

    .file   "foo.c"
    .section    .rodata
.LC0:
    .string "jj > ii \n"
    .text
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $20, %esp
    movl    $10, -8(%ebp)
    movl    $20, -12(%ebp)
    movl    -12(%ebp), %eax
    cmpl    -8(%ebp), %eax
    jle .L2
    movl    $.LC0, (%esp)
    call    puts
.L2:
    movl    $0, %eax
    addl    $20, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.3.2-1ubuntu12) 4.3.2"
    .section    .note.GNU-stack,"",@progbits

简要剖析正在发生的事情:

第一节(.rodata)用字符串' jj > ii \n' 声明一个常量

第二部分是初始化堆栈中的iijj变量的内容.

该位cmpl -8(%ebp), %eax正在进行实际比较; 该jle指令正在跳过对' puts' 的调用,这实际上是' if'语句的逻辑被颠倒了.

在标签' .L2'之后,系统正在整理堆栈顶部并从通话中返回.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有