《软件调试分析技术》学习笔记(七)

 从代码执行的角度上来说,算法分为无条件执行算法和有条件执行算法两种。对于无条件执行算法,它的代码执行顺序总是这变的,不管发生什么情况都是从上到下依次执行;而在条件执行算法中,代码的执行并不是一路向下的,而是由程序中的其他数据所决定的。例如本节要讲的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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值