C++表達式的執行原理

C++表達式的執行原理

通過下面一個簡單的例子來說明C++表達式的執行過程

int a,b,c,d;
int main()
{
    a=4;
    b=2;
    c=3;
    d=(a+b)*c;
    retuen 0;
}

下面分別分析各行代碼的目標代碼的反彙編結果。先看a=4到c=3這三條語句,他們的反彙編結果爲:

mov1 $0x4,0x80495d8 //對應"a=4",將32位整數4寫入地址0x80495d8
mov1 $0x2,0x80495dc //對應"a=2",將32位整數2寫入地址0x80495dc
mov1 $0x3,0x80495e0 //對應"a=3",將32位整數3寫入地址0x80495e0

mov1用來把一個4字節(32位)的常數存入一個內存地址中,第一個操作數爲常數,第二個操作數爲內存地址。這3條指令分別把4,2,3存入a,b,c所對應的內存單元中。
下面的指令都用來執行d=(a+b)*c:

mov  0x80495dc,%eax //將0x80495dc地址內的32位整數裝入eax寄存器
mov  0x80495d8,%ecx //將0x80495d8地址內的32位整數裝入ecx寄存器
add  %eax,%ecx      //將eax和ecx兩寄存器內的數相加,結果放在ecx寄存器中
mov  0x80495e4,%eax //將0x8049e4地址內的32位整數裝入eax寄存器
imul %ecx,%eax      //將eax和ecx兩寄存器內的32位有符號整數相乘,得到一個64位整數,
                    //結果低32位放入eax寄存器,高32位放入edx寄存器中
mov  %eax,0x80495e4 //將eax寄存器中的32位整數存入0x80495e4地址中

  mov指令用來在寄存器和內存之間交換數據,前兩條mov指令分別把b變量的值放到eax寄存器中,把a變量的值放到ecx寄存器中。
  下面執行add指令,他會把eax寄存器的值與ecx寄存器的值相加,結果存到eax寄存器中。執行完這條指令後,ecx寄存器的值是a+b。
  接下來是一條mov指令,把內存中c變量的值放到eax寄存器中。
  imul指令是一條執行有符號整數的乘法指令。高32位放到edx寄存器中是imul指令的規定,與imul使用的操作數無關。執行完這條指令後,eax寄存器的值變成了(a+b)*c 的低32位。
  最後一條mov指令用來將eax寄存器的值放到0x80495e4內存單元中,這就會d變量所對應的內存單元。由於d變量也是一個32位整數,所以這裏只取乘法結果的低32位即可,edx寄存器中所存儲的高32位整數無需理會。

總結

  雖然內存是存儲C++變量值的主要場所,但不可能一切讀寫操作都通過內存,事實上,CPU的大部分讀寫操作都是對寄存器進行的,寄存器在CPU內部,讀寫速度非常快,而且CPU可通過內部電路同時讀寫多個寄存器。
  IA-32的通用寄存器有eax,ebx,ecx,edx,esp,ebp,esi,edi八個,他們都是32位寄存器。 在運算過程中寄存器發揮了重要作用,不僅需要用寄存器存儲變量值,還需要保存每一步運算的中間結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章