從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的地址压入栈 ,都是传值的地址。
给我感觉。引用是指针的语法糖?
從nasm assembly看函數參數傳遞的更多相关文章
- shell傳遞參數
Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 比如我們 ...
- 使用Expression做Linq的參數化排序
Linq非常的好用,減少大量的資料庫操作手序,使用具名的類別,減少了在程式中寫SQL寫錯字的可能性,問題來了,如果我想用QueryString中的參數,作為排序的依據,但是因為是具名的類別,不能指定字 ...
- 02.C#可空類型、默認參數、LINQ(一章1.3-1.4)
利用上班時間發個隨筆,不知領導會不會看到,可能會有同事看到也說不定啊:) 關于可空類型,在C#1中沒有這個概念,在C#3中引入的.那比如我們要實現一個表示人的類,人有名字和年齡兩個屬性,如何表示一個沒 ...
- 使用 new Q_max_capacity 參數,同樣 loading 下,粗估耗電量(UI 上的 %)。
Precondition : 除了 Q_max 外,其它參數皆同. old Q_max_capacity : 1500 mAh new Q_max_capacity : 2200 mAh 有一個 lo ...
- Linux下安裝Oracle database內核參數設置
參考:1529864.1 ************************************************** RAM ...
- 同一個Loader對象傳入不同參數時,从数据库中查询的結果每次都一樣
發現問題: LoaderManager().initLoader()方法調用時會根據第一個參數ID去判斷是否已經存在一個Loader加載器,如果存在則複 用,不存在則建一個新的加載器.由於我第一次已經 ...
- 設定 gpio 為 讀取用途,需注意的參數
Schematic 解說 上面的 線路圖, R1 R2 只能有一個被接上, R3 R4 只能有一個被接上, 是使用 gpio 讀取 電壓 判斷為0 或是 1 這時的 gpio 設定,其中一個參數需設為 ...
- 在 kernel 下打出 有帶參數的log。 怪異現象與解決方式。
code battery_log(BAT_LOG_CRTI, "youchihwang abc10010 xxxaaa8-2\r\n"); battery_log(BAT_LOG_ ...
- Csharp:操作存儲過程輸出參數,和返回值
/// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...
随机推荐
- C++继承中的构造和析构
1,构造:对象在创建的后所要做的一系列初始化的工作: 析构:对象在摧毁之前所要做的一系列清理工作: 2,思考: 1,子类中如何初始化父类成员? 1,对于继承而言,子类可以获得父类的代码,可以获得父类中 ...
- Springboot系列1_什么是Springboot
Springboot系列1_什么是Springboot */--> code {color: #FF0000} pre.src {background-color: #002b36; color ...
- Java compiler level does not match the version of the installed Java project facet错误
出现问题情景:从其他地方导入一个项目的时候报错:Java compiler level does not match the version of the installed Java project ...
- Redis数据库总结
1.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...
- python实现WordCount(第三次作业)
0x00 注明 合作者:201631062315 201631062310 代码地址:https://gitee.com/c1e4r/word-count2 作业地址:https://edu.cnbl ...
- 转:动态库路径配置- /etc/ld.so.conf文件
Linux 共享库 Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”.因为这一原因,静态可 ...
- 使用python开启你的opencv之旅---图像的读入,存储
python的便捷是如此的引人着迷,而opencv给python提供的接口使我们能够使用python来快速验证我们的想法,或者与别的模块快速结合,在这个系列文章我会通过jupyter notebook ...
- 转载 Struts2的配置 struts.xml Action详解
在学习struts的时候,我们一定要掌握struts2的工作原理.只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置.接下来我就先简 ...
- php7类型约束的意义
在PHP7之前,函数和类方法不需要声明变量类型,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格. 为了解决这个问题,PHP7引入了类型声明. 目前有两类变量可以声明 ...
- shell cut从一个文件中提取列
cut 语法 cut -d 分隔符 -f 列索引 file.txt #将文件file.txt以分隔符.进行分割,并取出第2列.cut -d '.' -f 3- file.txt #将文件file.tx ...