從組合語言理解C++傳參方式
C++傳參方式分為傳引用和傳值,傳值是將引數的副本傳入函式,傳引用是將從引數的地址傳給函式。由於剛剛學過組合語言,而且我知道在呼叫函式之前會將函式的引數壓入堆疊,那麼我很自然想到了mov和lea。而是用vc的反彙編工具我驗證了這一點。
看如下程式:
#include "stdafx.h"
#include<iostream>
using namespace std;
void Swap(int& a,int& b){
int temp = a;
a = b;
b = temp;
cout<<"sucess"<<endl;
cout<<endl;
}
int main(int argc, char* argv[])
{
int a = 9;
int b = 8;
Swap(a,b);
cout<<a<<endl;
cout<<b<<endl;
int tem;
cin>>tem;
return 0;
}
在Swap(a,b);這條語句前設定斷點並作反彙編除錯,看到在函式呼叫處的彙編程式碼:
20: Swap(a,b);
00401B66 lea eax,[ebp-8]
00401B69 push eax
00401B6A lea ecx,[ebp-4]
00401B6D push ecx
00401B6E call @ILT+585(Swap) (0040124e)
00401B73 add esp,8
從這段彙編程式碼可以看出,程式先將第一個引數的有效地址儲存在eax暫存器中,然後將暫存器入棧,第二個引數也是,然後再呼叫函式,最後釋放堆疊中引數佔據的空間(堆疊從高地址向低地址增加)。現在再改成傳值:
#include "stdafx.h"
#include<iostream>
using namespace std;
void Swap(int a,int b){
int temp = a;
a = b;
b = temp;
cout<<"sucess"<<endl;
cout<<endl;
}
重新除錯,結果如下:
20: Swap(a,b);
00401B66 mov eax,dword ptr [ebp-8]
00401B69 push eax
00401B6A mov ecx,dword ptr [ebp-4]
00401B6D push ecx
00401B6E call @ILT+145(Swap) (00401096)
00401B73 add esp,8
從中可以看出,程式直接將第一個引數的值放入暫存器中,然後將暫存器入棧。第二個引數也是如此。最後再釋放引數佔據的記憶體空間。但是在vc中一個int佔四個位元組,這裡的dword是四個位元組嗎?或許吧,但是教材上是2個位元組啊
以上便是傳值和傳參的區別。
相關文章
- 組合語言1 - 什麼是組合語言?組合語言
- 組合語言組合語言
- 組合語言 1組合語言
- 組合語言 2組合語言
- 組合語言-棧組合語言
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- 組合語言指令大全組合語言
- 理解函數語言程式設計語言中的組合--前言(一)函數程式設計
- 從組合語言到類庫框架的隨感組合語言框架
- 徹底理解JavaScript函式的呼叫方式和傳參方式——結合經典面試題JavaScript函式面試題
- 組合語言-基礎功能組合語言
- 組合語言——更多功能組合語言
- 組合語言---判斷字元組合語言字元
- 組合語言入門教程組合語言
- Go 語言的組合之道Go
- 組合語言-基礎知識組合語言
- 8086執行組合語言組合語言
- 組合語言--單步中斷組合語言
- 組合語言學習筆記組合語言筆記
- 第二章--組合語言組合語言
- 組合語言的藝術(轉)組合語言
- ARM組合語言最常用指令組合語言
- 組合語言-CALL和RET指令組合語言
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- NLP 與 NLU:從語言理解到語言處理
- X86 定址方式、AT&T 組合語言相關知識、AT&T 與 Intel 組合語言的比較、gcc 嵌入式彙編組合語言IntelGC
- 組合語言-學習記錄(二)組合語言
- 基於MDK建立純組合語言--組合語言
- 組合語言的未來展望 (轉)組合語言
- Linux 組合語言開發指南Linux組合語言
- nand2tetris_hack組合語言NaN組合語言
- lec 02 arm組合語言基礎組合語言
- 理解函數語言程式設計中的函式組合--Monoids(二)函數程式設計函式Mono
- Go語言是徹底的面向組合的併發語言Go
- 這個處理器的組合語言:組合語言
- 讀書寫筆記-王爽《組合語言》筆記組合語言
- C語言 將函式(有參、無參)作為引數傳遞C語言函式
- 深入iOS系統底層之組合語言iOS組合語言