ifelse语句在计算机中的执行

首先表明 cpu 中有好多种寄存器

主要有

PC 寄存器:用来存放下一条执行指令位置的寄存器

指令寄存器:用来存放当前执行指令的指令码

条件码寄存器:用来存放条件和逻辑运算结果条件码,有 CF,ZF,SF,OF 等条件码

其他寄存器(讨论)

 

比如执行如下语句

// test.c


#include <time.h>
#include <stdlib.h>


int main()
{
  srand(time(NULL));
  int r = rand() % 2;
  int a = 10;
  if (r == 0)
  {
    a = 1;
  } else {
    a = 2;
  } 

经过编译成汇编代码如下

    if (r == 0)
  3b:   83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0
  3f:   75 09                   jne    4a <main+0x4a>
    {
        a = 1;
  41:   c7 45 f8 01 00 00 00    mov    DWORD PTR [rbp-0x8],0x1
  48:   eb 07                   jmp    51 <main+0x51>
    }
    else
    {
        a = 2;
  4a:   c7 45 f8 02 00 00 00    mov    DWORD PTR [rbp-0x8],0x2
  51:   b8 00 00 00 00          mov    eax,0x0
    } 

在if(r== 0) 这个语句中, 

cmp    DWORD PTR [rbp-0x4],0x0 命令先从 PC 寄存器取出DWORD PTR 命令,执行,将比较结果放入 条件码寄存器中
jne    4a <main+0x4a> 接下来 前面这条命令继续从 PC 寄存器中读取,首先会到 条件吗寄存器中取出对比结果,如果表示true则执行 if 内的语句,为false的话就会跳转
跳转的实现是将 PC 寄存器的下一条命令地址改为 else 语句下面的为 4a: c7 45... mov DOWORD PRT ...0x2

总结: 当程序在运行if else 语句时 cpu 先回根据 PC 寄存器中下一个命令的位置取出命令执行,然后将执行结果放入条件码寄存器,然后在执行下一个命令用于确认对比条件,该命令会
从条件吗寄存器取出计算结果,根据结果来修改 PC 寄存器来执行不同位置的命令。

 

 

posted @ 2019-05-13 16:56  vwa  阅读(622)  评论(0)    收藏  举报