`

不同的传参和返回值形式在汇编上的差异

阅读更多

从汇编级别了解高级语言的执行过程,下面的汇编代码都是VS的反汇编代码,对比可以看出不同的执行方式在汇编上的差异,现在从最简单的开始。

1:先考察传值和传引用在汇编上的差异。

 

A:简单类型

int show(int m)   //此处int show(int& m) 
{
	int n = m*5;
	return n;
}


int _tmain(int argc, _TCHAR* argv[])
{
	int n = 90;
	int result = 0;
	result = show(n);
	result = result *4;
	int j = 0;
	cin >> j;
	return 0;
}

 

 生成的汇编代码

 

	int n = 90;
00343D5E  mov         dword ptr [n],5Ah  
	int result = 0;
00343D65  mov         dword ptr [result],0  
	result = show(n);
00343D6C  mov         eax,dword ptr [n]  
	result = show(n);//参数压栈
00343D6F  push        eax  
00343D70  call        show (0341460h)  //此处是地址
00343D75  add         esp,4  
00343D78  mov         dword ptr [result],eax  
	result = result *4;
00343D7B  mov         eax,dword ptr [result]  
00343D7E  shl         eax,2  
00343D81  mov         dword ptr [result],eax  
	int j = 0;
00343D84  mov         dword ptr [j],0  
	cin >> j;
00343D8B  mov         esi,esp  
00343D8D  lea         eax,[j]  
00343D90  push        eax  
00343D91  mov         ecx,dword ptr ds:[351378h]  
00343D97  call        dword ptr ds:[351374h]  
00343D9D  cmp         esi,esp  
00343D9F  call        __RTC_CheckEsp (0341311h)  
	return 0;
00343DA4  xor         eax,eax  

 int show(int m)

 

{
	int n = m*5;
00343D1E  mov         eax,dword ptr [m]  
00343D21  imul        eax,eax,5  
00343D24  mov         dword ptr [n],eax  
	return n;
00343D27  mov         eax,dword ptr [n]  //返回值要到Register中?
}

 

传引用:

 

001C3D5E  mov         dword ptr [n],5Ah  
	int result = 0;
001C3D65  mov         dword ptr [result],0  
	result = show(n);
001C3D6C  lea         eax,[n]  
	result = show(n);
001C3D6F  push        eax  
001C3D70  call        show (01C1465h)  
001C3D75  add         esp,4  
001C3D78  mov         dword ptr [result],eax  
	result = result *4;
001C3D7B  mov         eax,dword ptr [result]  
001C3D7E  shl         eax,2  
001C3D81  mov         dword ptr [result],eax  
	int j = 0;
001C3D84  mov         dword ptr [j],0  
	cin >> j;
  
int n = m*5;
001C3D1E  mov         eax,dword ptr [m]  
001C3D21  mov         ecx,dword ptr [eax]  
001C3D23  imul        ecx,ecx,5  
001C3D26  mov         dword ptr [n],ecx  
	return n;
001C3D29  mov         eax,dword ptr [n]  
}
 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    浅析函数传参及返回值

     很多刚学指针的人多会遇到这样的情况,就是你给一个函数传递一个指针变量,在这个函数中为这个指针申请空间,赋值,可是等函数结束后这个指针还是一个空指针,对其的操作编译器会报段错误或干脆给你一个莫名其妙的...

    C++ 调用带参数EXE

    这些函数不返回,除非执行失败,因此在C++中通常不用于直接调用EXE,因为无法处理返回值或控制窗口行为。例如`execl("/path/to/exe", "exe_name", "arg1", "arg2", NULL)`。 3. **使用`WinExec`函数** 在Windows...

    汇编代码注入器

    汇编代码注入器.远程注入,代码注入

    java 形参和返回值练习

    在Java编程语言中,形参(形式参数)和返回值是方法的重要组成部分,它们定义了方法的行为和交互方式。在这个“java 形参和返回值练习”中,我们可以通过分析提供的文件来深入理解这两个概念。 首先,让我们看下`...

    asp.net 请求url 获取返回值

    在ASP.NET中,请求URL获取返回值是网络编程的一个常见任务,主要涉及到Web请求和数据交互。本篇文章将深入探讨如何使用`WebRequest`和`WebClient`这两种方式来实现这一功能。 首先,让我们理解`WebRequest`类。它是...

    Java的方法和返回值.doc

    方法分为不同的类型,根据参数和返回值的有无,主要分为无参无返回值、无参带返回值以及无返回值但有输出。下面将详细讨论这些方法的使用及其重要性。 1. 无参无返回值的方法: 这类方法不接收任何参数,并且不会...

    汇编API 汇编API 汇编API

    2. **函数原型**:定义函数的输入参数和返回值类型,尽管在汇编中没有类似高级语言的类型系统,但依然需要明确这些信息以避免错误。 3. **参数传递**:根据调用约定,将参数值放入指定的寄存器或内存位置。 4. **...

    C语言和汇编语言的混合编程

    在计算机编程领域,C语言和汇编语言是两种截然不同的编程语言,它们各自具有独特的优点和适用场景。本文将详细探讨如何进行C语言与汇编语言的混合编程,包括C语言直接插入汇编代码、C文件调用无参数无返回值的汇编...

    AT&T汇编(linux汇编)

    与Intel汇编不同,AT&T汇编语法的结构和表达方式有其独特之处,这使得它在某些场景下更适合作为编写系统级程序的工具。 1. **指令格式差异** AT&T汇编语法和Intel汇编在指令格式上有显著区别。在AT&T汇编中,操作...

    IntelliJ IDEA自动设置代码注释的方法(带参数,带返回值,如果没有则跳过参数或返回值方法

    因此,本文将详细介绍如何在IntelliJ IDEA中设置类似的自动代码注释功能,以便于快速生成包含参数和返回值的注释。 #### 准备工作 在开始之前,请确保已经安装了最新版本的IntelliJ IDEA,并熟悉其基本操作界面。接...

    VBS调用Web接口

    Dim objHTTP,xmlDOC,strWebserviceURL,strRequest,bOK,xmlStr Set objHTTP = CreateObject("MSXML2.XMLHTTP

    使用简单的注释记录函数的所有作业和返回值

    "使用简单的注释记录函数的所有作业和返回值"这个主题强调了在编写JavaScript代码时,应如何有效地进行注释以提高代码质量。 在JavaScript中,我们通常使用两种主要类型的注释:单行注释(//)和多行注释(/* ... *...

    at汇编语法讲解_汇编AT_at&t汇编_Vc_at&t汇编教程_

    AT&T汇编语法虽然在格式上与Intel汇编有所不同,但其强大的功能和灵活性使其成为开发底层软件和理解计算机工作原理的重要工具。熟练掌握AT&T汇编不仅有助于优化代码性能,也能提升对计算机体系结构的理解。通过阅读...

    执行外部exe获取返回值

    在IT领域,执行外部exe(可执行文件)并获取返回值是常见的系统...通过以上技术,开发者可以灵活地控制外部exe的执行并获取其返回值,实现不同程序间的协作和数据交换。在实际项目中,应根据具体需求选择合适的方法。

    获取(设置)应用程序返回值

    在编程和软件开发中,程序返回值扮演着至关重要的角色,它是程序执行后与调用者之间交流结果的一种方式。本文将深入探讨“获取(设置)应用程序...理解如何在不同的编程语言和环境下操作返回值是每个开发者必备的技能。

    弹出界面返回值

    在网页或应用程序中,弹出界面通常是指那些在主界面之上打开的窗口,可以是模态对话框、通知提示、下拉菜单等形式。它们用于显示信息、收集用户输入、执行特定操作等。当用户在弹出界面中进行交互后,我们可能需要...

    java 调用 powershell 并传参 返回

    java 调用 powershell 并传参 返回

    汇编课件 汇编课件(完整版)

    4.2 调用约定:学习如何在汇编语言中调用和被高级语言调用,理解参数传递和返回值处理。 五、实践应用 5.1 实验与调试:通过实际编程练习,加深对汇编语言的理解,学习使用调试工具如debug或GDB。 5.2 应用案例:...

    获取所有委托返回值

    在C#编程中,委托是一种类型安全的回调机制,它允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。...在C#编程中,熟练掌握委托的使用和返回值的处理,能够帮助我们构建更加灵活和强大的代码结构。

    掌握Python函数返回值:在函数外部访问和使用

    在Python编程中,函数的返回值是控制流和数据处理的重要组成部分。函数通过return语句返回值,这些值可以在函数外部被访问和使用,从而实现数据的传递和处理。本文将详细介绍如何在函数外部访问函数的返回值,包括...

Global site tag (gtag.js) - Google Analytics