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

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

  • 相关阅读:
    如果你的领导是力量型,你在汇报工作时应该注意()。
    项目管理的10项原则
    扑克k,你知道的人物吗?
    搭建属于您自己的软件版本控制
    Android保持屏幕常亮的方法
    BMP图像数据格式详解
    Android终止线程的方法
    使用ContentProvider访问其他应用的SharedPreferences数据
    android gps定位LocationManager
    Android属性之build.prop生成过程分析
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3151718.html
Copyright © 2011-2022 走看看