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 寄存器来执行不同位置的命令。
坚持做好每件事,然后再做下一件。

浙公网安备 33010602011771号