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

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

  • 相关阅读:
    ajax请求发送json数据
    jQuery与Prototype冲突解决办法
    cookie设置HttpOnly、Secure属性
    web.config,system.web中加<machineKey
    登陆页面粒子效果
    cmd命令登陆oracle
    oracle 千万级数据表增加索引
    springboot报错:expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    数据库备份
    unixbench性能测试跑分工具
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3151718.html
Copyright © 2020-2023  润新知