一. 如果传递指针给函数
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格式。