编程达人吧 关注:16贴子:35
  • 0回复贴,共1

3.4 条件执行

只看楼主收藏回复

本节主要内容:
1. Jcc、SETcc、CMOVcc指令
2. if语句
老唐语录:
我们学习汇编到现在,其实就是学习了mov指令,在“寄存器和寄存器”或者“寄存器和内存”之间移动数据,之前学过很多指令影响标志位:ADD,ADC,AND,OR,XOR……
MOV eax,ebx是无条件将ebx移动到eax里面去,现在学习有条件移动指令:CMOVcc,后面两个cc表示可以替换。比如CMOVC eax,edx表示当CF位为1时,数据从edx到eax。如果CF为0时,这条指令什么都不做,也就是说在移动数据时,首先要判断标志位;而CMOVNC是CF为0时,数据从edx到eax。如果CF位1时,不移动。除了c、nc之外还有p、np,z、nz。“CMOVcc eip,”等于“Jcc”,Jcc也有16种写法。所有条件见表3-2:
表3-2:Jcc指令
指令 条件 描述
有符号条件跳转
JA/JNBE (CF+ZF) = 0 高于/不低于等于
JAE/JNB CF = 0 高于或等于/不低于
JB/JNAE CF = 1 低于/不高于等于
JBE/JNA (CF+ZF) = 1 低于或等于/不高于
JC CF = 1 进位
JE/JZ ZF = 1 等于/零
JNC CF = 0 不进位
JNE/JNZ ZF = 0 不等于/非零
JNP/JPO PF = 0 奇数
JP/JPE PF = 1 偶数
JCXZ CX = 0 寄存器CX为零
JECXZ ECX = 0 寄存器ECX为零
无符号条件跳转
JG/JNLE ((SF^OF)+ZF) = 0 大于/不小于等于
JGE/JNL (SF^OF) = 0 大于或等于/不小于
JL/JNGE (SF^OF) = 1 小于/不大于等于
JLE/JNG ((SF^OF)+ZF) = 1 小于或等于/不大于
JNO OF = 0 不溢出
JNS SF = 0 非负
JO OF = 1 溢出
JS SF = 1 负数
SETcc AL是将条件赋给AL,比如SETC AL,将CF位赋给AL,当CF=1时,AL=1,当CF=0时,AL=0。
练习:
将CMOVcc中的每一个条件都试一下。
注:cc代表十六种条件,十六种写法。
练习:
画出内存变化:
int fun10(int a,int b,int c,int d,int e)
{
int sum;
int stub;
if(a>=0x65)
return 0;
stub = fun10(a+10,b+10,c+10,d+10,e+10);
sum = stub+a+b+c+d+e+(a+5+b+5+c+5+d+5+e+5);
return sum;
}
调用语句:result = fun10(1,2,3,4,5);
课后理解:
cmovc edx,eax : 如果cf=1, 等同于 mov edx,eax 如果 cf=0,不处理
cmovnc edx,eax : 如果cf=0, 等同于 mov edx,eax 如果 cf=1,不处理
setcc oprd:oprd可以是8bit寄存器、内存,不可为立即数
setz al:如果zf=1,置al为1, 如果 zf=0,不处理
setnz al:如果zf=0,置al为1, 如果 zf=1,不处理
课后疑问:
为什么jcc [eax]不执行?
回答:vc编译器不识别jcc [寄存器]指令,但test编译器识别。
课后总结:
条件执行指令是根据EFLAG寄存器中相应的标志位为判断条件。
课后练习:
写程序练习条件执行语句。


1楼2016-06-11 08:49回复