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

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

  • 相关阅读:
    Android开发之SQLite的使用方法
    【转】如何分析解决Android ANR
    error log
    33层高楼为什么27楼和28楼最贵 次顶层房价高原因揭秘
    Could not allocate CursorWindow size due to error -12 错误解决方法
    过来人讲述买房血泪史:什么样的房子不能碰
    cocos2d-x删除vs2010项目模板
    Lua学习笔记5:类及继承的实现
    Linux vsftpd服务配置具体解释
    Android_Dialog_设置Dialog窗体的大小
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3151718.html
Copyright © 2011-2022 走看看