程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 從匯編來看i++與++i

從匯編來看i++與++i

編輯:C++入門知識

從匯編來看i++與++i


故事背景,一個正在c語言的家伙,問我++i 和 i++的問題,我當時因為要去上課沒給他說,正好今晚有空就測試了一下如下代碼:

編譯環境:VS2010 語言:C++

復制代碼
 1 #include 
 2 using namespace std;
 3 
 4 int main(void)
 5 {
 6     int a = 1;
 7     int b = 1;
 8     int c;
 9 
10     c = a++;
11     c = ++b;
12 
13     return 0;
14 }
復制代碼

我們站在匯編的角度來說明一下問題:

可能你沒學過匯編,不過沒關系,我們先來科普一下匯編基本知識。(我自己也不會匯編,只是能看懂一些簡單匯編代碼)

-----------------------------------------------------------------

1)dword ptr  : dword -> double word 雙字節   ptr ->  pointer 指針
2)mov   a  b :  表示將b的值賦值給a   
3)add   x  y :  表示取x的值和y的值相加,結果再放入x中
4)另外就是cpu的8個通用寄存器 :eax, ebx, ecx, edx, esi, edi, ebp, esp
eax :是"累加器", 它是很多加法乘法指令的缺省寄存器
ecx :是"計數器", 是重復(REP)前綴指令和LOOP指令的內定計數器

-----------------------------------------------------------------

好了,下面的匯編代碼我再簡單解釋一下,就基本差不多了。

說明:以下匯編代碼解釋過程中,比如:eax=1,是表示目前eax中的值為1.

復制代碼
 1 int a = 1;
 2 00EC136E  mov         dword ptr [a],1    //給a賦值1
 3     int b = 1;
 4 00EC1375  mov         dword ptr [b],1    //給b賦值1
 5     int c;
 6 
 7     c = a++;
 8 00EC137C  mov         eax,dword ptr [a]  //將a=1放入eax=1寄存器中
 9 00EC137F  mov         dword ptr [c],eax  //將eax=1放入c=1的地址中
10 00EC1382  mov         ecx,dword ptr [a]  //將a=1放入ecx=1寄存器中
11 00EC1385  add         ecx,1              //將ecx=1和1相加,並放入ecx=2寄存器中
12 00EC1388  mov         dword ptr [a],ecx  //將ecx=2寄存器裡的值放入a=2中
13     c = ++b;
14 00EC138B  mov         eax,dword ptr [b]  //將b=1放入eax=1寄存器中
15 00EC138E  add         eax,1              //將eax=1與1相加,並放入eax=2寄存器中
16 00EC1391  mov         dword ptr [b],eax  //將eax=2寄存器裡的值放入b=2中
17 00EC1394  mov         ecx,dword ptr [b]  //將b=2放入ecx=2寄存器中
18 00EC1397  mov         dword ptr [c],ecx  //將ecx=2寄存器裡的值放入c=2中
19 
20     return 0;
21 00EC139A  xor         eax,eax  
22 }
復制代碼

從上面的一段匯編代碼中我們可以很清晰的看到,匯編後:

1)c = a++; 其中c的值是1,但是a中的值卻已經變化為2了。

2)c = ++b; 其中c的值是2,b的值也是2。

--------------------------------------------------------------

原文地址:http://www.cnblogs.com/nchar/p/3913724.html

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