程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 自增操作的反匯編分析

自增操作的反匯編分析

編輯:關於C語言
 

在考試或者做題的時候,經常遇到這類問題,出題的老師就是愛在這點上面鑽牛腳尖,那就是自增自減操作的組合運算,我個人認為,考這樣的題,沒多大意思,因為各個編譯器不同,出來的結果也不同,而且這樣有一種誤導,而失去了語言學習的本質,真正的程序員,也不會寫出這樣的代碼,除非有神經病,呵呵。但是我們還是得面對……悲哀啊。下面我用匯編來分析一下這個例子:

#include "stdio.h"
int main()
{
int i=0,n = 0;
n = (++i)+(++i)+(++i);
printf(" n = %d\n",n);
printf(" i = %d\n",i);
return 0;
}

 

我在VC++.NET下編譯通過,結果為:n=9,i=3
讓我用STUDIO2003.NET的調試器來分析一下:
相關反匯編代碼如下:(各語句後面有我的注釋)


1

int i=0,n = 0;
00411A4E mov dword ptr [i],0 ;i初始化為0
00411A55 mov dword ptr [n],0 ;n初始化為0
n = (++i)+(++i)+(++i);
00411A5C mov eax,dword ptr [i] ;eax=0;
00411A5F add eax,1 ;eax=eax+1,所以eax=1
00411A62 mov dword ptr [i],eax ;把1賦值給i
00411A65 mov ecx,dword ptr [i] ;把i裝入ecx,此時ecx=1
00411A68 add ecx,1 ;ecx=ecx+1,此時ecx=2
0041A6B mov dword ptr [i],ecx ;把ecx賦值給i,此時i=2
00411A6E mov edx,dword ptr [i] ;把i裝入edx,(edx)=2
00411A71 add edx,1 ;edx=edx+1,(edx)=3
00411A74 mov dword ptr [i],edx ;把edx的置放回i,i=3
00411A77 mov eax,dword ptr [i] ;eax=3
00411A7A add eax,dword ptr [i] ;eax=eax+i=3+3=6
00411A7D add eax,dword ptr [i] ;eax=eax+3=6+3=9
00411A80 mov dword ptr [n],eax ;n=(eax)=9

 

從以上反匯編過程可以看出,n=9,i=3,輸出後也如此。輸出的匯編代碼就不貼了。

不同的編譯器輸出的結果可能不同,我想,可能反匯編出來的代碼也不一樣,所以結果自然也不一樣了。

從這裡可以看出,通過反匯編的代碼來分析,思路會清晰很多。studio2003.net的編譯器,對於(++i)+(++i)+(++i);這種運算,是先算i,也即將三個++i先算出來,結果等於3,然後才算括號外面的加法,結果當然是n=3+3+3=9。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved