汇编代码,传递指针给函数

一. 如果传递指针给函数

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格式。

汇编代码,小括号和中括号

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