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

这两天学JAVA,没更新过了。。switch结构
    C语言代码:

#include <stdio.h> 
int main() 
{ 
  int a = 1; 
  switch (a) 
  { 
  case 0: 
    a = 1; 
    break; 
  case 1: 
    a = 0x10; 
    break; 
  case 2: 
    a = 0x20; 
  } 
  return 0; 
}


  简单理解一下这段代码,定义一个整型变量a,并给它赋值1,然后是一个switch结构,检测a的值,为0时给a赋值1,为1时给a赋值0x10,为2时给a赋值x20。编译这段代码,使用IDA分析,反汇编代码如下:

.text:00401000    push    ebp 
.text:00401001    mov     ebp, esp 
.text:00401003    sub     esp, 8

 

上一节中就说过一个int型的变量占用4字节的内存空间,但是明明程序只定义了一个int型的变量a,为什么这里会从栈里压出8字节的内存空间?继续向下看:

.text:00401006    mov     [ebp+a], 1 
.text:0040100D    mov     eax, [ebp+a] 
.text:00401010    mov     [ebp+var_8], eax


这里给变量a赋值1,然后保存一个副本到刚才从栈里压出来8个字节里的另外4个字节。

.text:00401013    cmp     [ebp+var_8], 0 
.text:00401017    jz      short loc_401027 
.text:00401019    cmp     [ebp+var_8], 1 
.text:0040101D    jz      short loc_401030 
.text:0040101F    cmp     [ebp+var_8], 2 
.text:00401023    jz      short loc_401039 
.text:00401025    jmp     short loc_401040 


这里把刚才储存的副本分别和0、1、2比较,如果相等就跳转到对应位置,如果都不相等则跳到最后。

 

.text:00401027    mov     [ebp+a], 1 
.text:0040102E    jmp     short loc_401040 
.text:00401030    mov     [ebp+a], 10h 
.text:00401037    jmp     short loc_401040 
.text:00401039    mov     [ebp+a], 20h 


 这里是刚才的三个比较对应的处理部分,可以发现break语句对应的是一句jmp指令,直接跳转到switch结构的结尾。

.text:00401040    xor     eax, eax 
.text:00401042    mov     esp, ebp 
.text:00401044    pop     ebp 
.text:00401045    retn


 

你可能感兴趣的:(《软件调试分析技术》学习笔记(八))