【重点:当判断大于&小于时】(根据执行体是否紧贴着跳转指令来判断是那个条件语句)
一:执行体紧贴着跳转指令时,代码中的条件判断都会编译成否决条件的形式,原因如下:
如判断:if (a>5) printf("OK");
1为真时是让它往下继续执行printf,可是为真的跳转指令都会跳转而不会向下执行,所以才会用否决条件的跳转指令
2这样原本的JG会编译成否决条件的跳转指令,即:JLE,这样若为假(代表不小于等于5)就是不满足JLE(等于满足最初条件的真,即:大于5),就能执行紧贴着跳转指令的执行体,即位于跳转指令的下条指令.
即:否决条件的假等同于最初条件的真(最初条件是大于0,否决条件JZ的假就是大于0,这样就等同于最初条件的大于0了,且也能在执行跳转指令下方的执行体了)
二:执行体未紧贴着跳转指令,即不位于跳转指令的下条指令时则不用判断条件取反,如do...while & swich 等情况
【当判断是否为0时,代码中的判断条件用JZ &JNZ即可】
if:使用了否决条件的跳转指令 &每个执行体的最后一句都是jmp 411aa9h 用于跳出if,最后一个执行体则没有
【if...else if...else】
if(c>0 && c<10)
cmp dword ptr [c],0
jle 411a81h
cmp dword ptr [c],0ah
jge 411a81h
{
printf("c>0");
push offset string "c>0"
call printf
addesp 4
}
else if(c>10 && c<100)
jmp 411aa9h
411a81h:cmp dword ptr [c],0ah
jle 411a9ch
cmp dword ptr [c],64h
jge 411a9ch
{
printf("c>10 && c<100")
push offset string "c>10 && c<100"
call printf
addesp 4
}else
{
printf("c>10 && c<100")
jmp411aa9h
411a9ch:pushoffset string "c>10 && c<100"
call printf
addesp 4
]
switch:不使用否决条件的跳转指令 &判断部分全部在开头,执行块都连续排列在下方
【switch】
switch( c )
mov eax,dword ptr [c]
mov dword ptr [ebp-0e8h],eax
cmp dword ptr [ebp-0e8h],0
je 411a83h
cmp dword ptr [ebp-0e8h],1
je 411a90h
jmp 411a9fh
{
case 0:
printf("c>0")
411a83h:push offset string "c>0"
call printf
add esp 4 ;C 调用方式,调用者清理堆栈
case 1://由于case0和case1之间没有break所以两个执行块连在一起了
{
printf("c>10 && c<100")
411a90h:push offset string "c>10&& c<100"
call printf
add esp4
break;
jmp 411aach ; 如果有break会增加一个无条件跳转
}
default:
printf("c>10 && c<100")
411a9fh:push offset string "c>10&& c<100"
call printf
add esp 4
}
do...while:不使用否决条件的跳转指令,执行体未在跳转指令的下方,所以未用否决形式
while:使用了否决条件的跳转指令,执行体在跳转指令的下方,所以使用了否决形式
【do...while】
do{
c = c+1;
411A55h:moveax,dword ptr [c]
add eax,dword ptr [i]
mov dword ptr [c],eax
}while (c<100)
cmp dword ptr [c],64h
jl 411A55H ;执行体未在跳转指令的下方,所以未用否决形式
【while】
while(c<100){
cmp dword ptr [c],64h
jge 退出;执行体在跳转指令的下方,所以使用了否决形式
c = c+1;
mov eax,dword ptr [c]
add eax,dword ptr [i]
mov dword ptr [c],eax
}
版权声明:本文为博主原创文章,未经博主允许不得转载。