为什么说JCC指令与标志寄存器是沟通计算机的桥梁
通过JCC指令可以实现有条件跳转,而标志寄存器是决定JCC指令是否实现跳转的必要条件。所以JCC指令与标志寄存器是沟通计算机的桥梁。
【什么是JCC指令】
JCC指令是什么?JCC指令表示以“J”开头的一组指令,是JMP的衍生指令,JMP表示无条件跳转执行指令,而JCC指令是一组有条件跳转执行指令,称为“条件执行指令”。
为什么需要这些条件执行指令呢?在我们一个普通的程序中,充斥着很多逻辑判断。如一个卖票的程序,首先要判断是否有票,然后再询问买几张......当我们看到票数为0时,就知道票已经售罄,而计算机并不知道数字背后的意义,这个意义是我们去设定的。
计算机发展到现在可谓神通广大,但它其实是很笨的,你让它减1,它就减1,然后把结果告诉你,至于这个结果有什么意义,你不告诉它,它是没有任何的反应的。每卖一张票,我们需要知道还有没有票了,如果已经售罄,我们需要告诉买票人,已经没有票了;如果有票,就可以进行下一步操作。所以我们让计算机做这样的事情:每卖出一张票,剩余的票数如果是0,就让它执行打印“票已售罄”;如果不是0,让它执行另一段代码。这里逻辑判断就需要用到“条件执行指令”。
当我们做运算时,结果会影响标志寄存器的值,JCC指令就是通过标志寄存器里的值来进行条件判断是否跳转的。接下来先介绍标志寄存器。
【标志寄存器】
标志寄存器:标志寄存器又称为程序状态和控制寄存器(Program Status and Control Register),主要用于记录当前的程序状态。
标志寄存器就是一个4字节的内存,而这个4字节的内存是在处理器(CPU)中,4字节包含32位,这32位中的每一位都有自己特定的意义,下面我们来看图2-17-1:
CF位:进位标志,PF位:奇偶标志,AF位:辅助进位标志,ZF位:零标志位,SF位:符号标志,TF位:单步标志,DF位:方向标志,至于剩下几位与Windows内核相关,这里就不介绍了。
我们借用DTDebug.exe软件来看一下标志寄存器在软件中是怎么显示的。
在DTDebug.exe软件中打开飞鸽软件,如图2-17-1所示。
图2-17-1中,EFL代表标志寄存器,它后面存储的数据是00000202,转换为二进制为0000 0000 0000 0000 0000 0010 0000 0010,这些位通过结合JCC指令会有特定的意义,如果没有JCC指令,那标志寄存器存在就没有什么意义了。标志寄存器是运算指令和JCC指令的桥梁,为什么这么说呢?因为运算指令是修改标志寄存器,而JCC指令是根据标志寄存器来跳转的,标识寄存器让运算指令间接的控制JCC指令。