zoukankan      html  css  js  c++  java
  • 從nasm assembly看函數參數傳遞

    在淘宝定了<<C++程序设计语言(特别版)>> 后天才能到货。从网上下了<<C++ Primer中文版>>的电子书看看。找找C++的感觉先。

    先看看基本类型的传值方式:

    写了3个方法。反编译看看。

    void fun1(int a){
         a ++;
    }

    void fun2(int &a){
        a++;
    }

    void fun3(int *a){
        (*a)++;
    }

    fun1的汇编代码:

    push    ebp
    mov     ebp, esp
    mov     eax, dword ptr ss:[ebp+8]
    add     eax, 1
    mov     dword ptr ss:[ebp+8], eax
    pop     ebp
    retn

    fun2的汇编代码:

    push    ebp
    mov     ebp, esp
    mov     eax, dword ptr ss:[ebp+8]
    mov     ecx, dword ptr ds:[eax]
    add     ecx, 1
    mov     edx, dword ptr ss:[ebp+8]
    mov     dword ptr ds:[edx], ecx
    pop     ebp
    retn

    fun3的汇编代码:

    push    ebp
    mov     ebp, esp
    mov     eax, dword ptr ss:[ebp+8]
    mov     ecx, dword ptr ds:[eax]
    add     ecx, 1
    mov     edx, dword ptr ss:[ebp+8]
    mov     dword ptr ds:[edx], ecx
    pop     ebp
    retn

    fun2和fun3的汇编代码一模一样。给我感觉。引用跟指针一样?

    在看看调用的:

    int a = 0;
    fun1(a);

    汇编1:

    mov     dword ptr ss:[ebp-4], 0
    mov     eax, dword ptr ss:[ebp-4]         
    push    eax
    call       00401000   ;函数fun1的地址

    int b =1;
    fun2(b);

    汇编2:

    mov     dword ptr ss:[ebp-8], 1
    lea       edx, dword ptr ss:[ebp-8]
    push    edx
    call      00401010  ;函数fun2的地址

    int c =2;
    fun3(&c);

    汇编3:

    mov     dword ptr ss:[ebp-C], 2
    lea       ecx, dword ptr ss:[ebp-C]
    push    ecx
    call       00401030  ;函数fun3的地址

    汇编1 把a的值压入栈,传值的拷贝; 汇编2 汇编3 分别是把 b ,c的地址压入栈 ,都是传值的地址。

    给我感觉。引用是指针的语法糖?

  • 相关阅读:
    jsp_Scriptlet
    jsp_注释
    Http状态码详解
    Tomcat服务器的安装和配置
    【BZOJ 1018】线段树 **
    【BZOJ 2054】 2054: 疯狂的馒头 (并查集特技)
    【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)
    【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)
    【UOJ 79】 一般图最大匹配 (✿带花树开花)
    【UOJ 34】 多项式乘法 (FFT)
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3151718.html
Copyright © 2011-2022 走看看