彙編代碼,傳遞指針給函數

一. 如果傳遞指針給函數

long cread(long *p){
    long result = *p;
    return result;
}

visual studio得到的彙編代碼:

    long result = *p;
 mov         eax,dword ptr [p]  
 mov         ecx,dword ptr [eax]  
 mov         dword ptr [result],ecx  
    return result;
 mov         eax,dword ptr [result]  

那麼
eax, 代表了result的值
p, 代表了&p的值, 相當於:ebp+立即數。
[p], 代表了p的值。
[[p]], 代表了*p的值(注:[[p]]這樣寫是爲了幫助理解)

而如果用gcc生成的彙編代碼:

mov rax, QWORD PTR [rdi];

這個時候,rdi相當於p值,[rdi]則相當於*p的值。

這是由於rdi是寄存器,數據可以直接保存在寄存器中。
而visual studio生成的反彙編代碼,[p]中p的值實際上是ebp+立即數,是內存地址,從內存中讀取數據。

二. 補充:如果傳遞數據給函數

在函數

long cread(long p){
    long result = p;
    return result;
}

visual studio得到的產生了彙編代碼:

    long result = p;
 mov         eax,dword ptr [p]  
 mov         dword ptr [result],eax  
    return result;
 mov         eax,dword ptr [result]  

同理,
eax, 代表了result的值,
[p], 同樣代表了p的值,
p, 同樣代表了&p的值。

而如果用gcc生成的彙編代碼:

    mov rax, rdi;

注,上面的彙編代碼是Intel格式。

彙編代碼,小括號和中括號

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