一. 如果傳遞指針給函數
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格式。