查看反彙編主要的思路在於將 流程,處理,算法 區分開來。
1 函數調用:
原C代碼:
int sum(int, int);
int main(){
int c = sum(1, 2);
printf("c=%d", c);
return 0;
}
int sum(int a, int b){
int c = a + b;
return c;
}
反彙編的函數調用主要使用bp-frame式(不懂自己去查去)的調用方式:
mmm
然後是被調用的sum:
ss
2 for循環:
基本的for循環是這樣的:
int sum(int b){
int c, i=0;
c = 0;
for(i=0; i<4; i++){
c += b;
}
return c;
}
然後反彙編後,for循環一般是以下的形式的:
下面看看上面的c代碼反彙編後變成了什麼:
3 do-while循環
例子代碼爲:
int sum(int b){
int c, i=0;
c = 0;
do{
c += b;
i++;
}while(i < 4);
return c;
}
do-while循環的基本結構:
然後我例子代碼的反彙編爲:
4 while循環|
例子代碼爲:
int sum(int b){
int c, i=0;
c = 0;
while(i < 4){
c += b;
}
return c;
}
while反彙編的基本結構爲:
上述代碼反彙編的結果爲:
5 if-else分支判斷:
例子代碼的c語言爲:
int sum(int b){
int c, i=0;
c = 0;
if(i<0){
c = -1;
}else if(i<1){
c = 1;
}else if(i<3){
c = 3;
}
return c;
}
if-else分支的基本結構:
然後上述代碼的反彙編結果爲:
6 switch-case 判斷分支:
int sum(int b){
int c, i=0;
c = 0;
switch(i){
case 1:
c = -1;
break;
case 2:
c = 0;
break;
case 3:
c = 1;
break;
default:
c = 2;
}
return c;
}
反彙編結果很直接:
7 使用結構體:
結構體的例子代碼:
int sum(int b){
jack j;
pjack pj = &j;
j.one = 1;
j.two = 2;
pj->one = 3;
pj->two = 4;
return pj->two;
}
結構體反彙編代碼: