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的地址压入栈 ,都是传值的地址。

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

  • 相关阅读:
    StopAllSounds
    GotoAndPlay
    区间(interval)
    因数(factor)
    [HAOI2009]逆序对数列
    生物分子gene
    数轴line
    [SCOI2008]配对
    精力(power)
    bzoj4987: Tree(树形dp)
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3151718.html
Copyright © 2011-2022 走看看