从代码执行的角度上来说,算法分为无条件执行算法和有条件执行算法两种。对于无条件执行算法,它的代码执行顺序总是这变的,不管发生什么情况都是从上到下依次执行;而在条件执行算法中,代码的执行并不是一路向下的,而是由程序中的其他数据所决定的。例如本节要讲的if结构,它具有选择性,当程序遇到if结构的时候只有满足某个条件才会执行某些语句,否则这些语句将会被忽略。
看C语言代码:
#include <stdio.h>
int main()
{
int a = 0;
if (a != 0)
a = 2;
return 0;
}
首先定义一个整型变量a,然后赋值0,接下来判断a是不是0,如果不是零就再次赋值1。编译后使用IDA分析,反汇编代码如下:
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 push ecx
这里向栈里压入寄存器ecx,用来向定义的变量a开辟储存空间。
.text:00401004 mov [ebp+a], 0
.text:0040100B cmp [ebp+a], 0
.text:0040100F jz short loc_401018
.text:00401011 mov [ebp+a], 1
这里给变量a赋值0,然后再和0比较,如果相等就跳过第四句代码,否则不执行跳转,给变量赋值1.
.text:00401018 xor eax, eax
.text:0040101A mov esp, ebp
.text:0040101C pop ebp
.text:0040101D retn
将if结构改为if-else结构再来看看。C语言代码:
#include <stdio.h>
int main()
{
int a = 0;
if (a != 0)
a = 1;
else
a = 2;
return 0;
}
这段代码比前面的多了一个else分支,定义一个整型变量a,然后赋值0,接下来判断a是不是0,如果不是零就再次赋值1,否则赋值2。编译后使用IDA分析,反汇编代码如下:
.text:00401000 push ebp
.text:00401001 mov ebp
.text:00401003 push ecx
这里和前一段代码一样,向栈里压入寄存器ecx,用来向定义的变量a开辟储存空间。
.text:00401004 mov [ebp+a], 0
.text:0040100B cmp [ebp+a], 0
.text:0040100F jz short loc_40101A
这里给变量a赋值0,然后再和0比较,如果相等就跳过下面的两句代码。
.text:00401011 mov [ebp+a], 1
.text:00401018 jmp short loc_401021
给变量a赋值1,然后跳转下面的一句代码,这里的跳转是绝对跳转。如果上面比较的结果是a等于0则跳过这里的两句代码,如果不相同,则跳转不执行,程序按顺序向下执行指令。
.text:0040101A mov [ebp+a], 2
.text:00401021 xor eax, eax
.text:00401023 mov esp, ebp
.text:00401025 pop ebp
.text:00401026 retn