美文网首页从汇编到C++
C语言2-参数的传递与返回值

C语言2-参数的传递与返回值

作者: Asura_Luo | 来源:发表于2018-05-04 02:44 被阅读0次

C语言2-参数的传递与返回值

short plus(short x,short y,short z,short m)
{
        return x+y+z+m; 
}

void main()                        //入口程序 程序开始执行的地方
{

        //调用函数
        plus(1,2,3,4);

        return;                        //执行结束
}
找到plus函数的反汇编  理解每一行汇编代码  找到参数是如何传递  返回值是如何返回的

plus函数对应反汇编代码和意义

调用函数调用:

push 4
push 3
push 2
push 1
call  (plus) 0041100f
add esp,10h
image

下面是call内部

push    ebp     
mov     ebp,esp
sub     esp,40h     
以上三步都是为了提升堆栈,并且方便使用ebp寻址。并且esp在此时提升了 0x40,留下了 0x40大小的缓冲区
image
push    ebx
push    esi
push    edi

以上三条目的是为了保存函数调用前的三个寄存器的值,方便函数结束后恢复原值

image
lea     edi,[ebp-40h]       执行后edi=刚刚提升堆栈时的esp
mov     ecx,10h   
mov     eax,0cccccccch
rep stos    dword ptr [edi]

此步骤将缓冲区全部置CC  CC在硬编码中标志着中断

image
movsx   eax,word ptr [ebp+8]
movsx   ecx,word ptr [ebp+0ch]
add     eax,ecx
movsx   edx,word ptr [ebp+10h]
add     eax,edx
movsx   ecx,word ptr [ebp+14h]
add     eax,ecx


这里就是真正的计算过程 

堆栈没有变化

pop     edi
pop     esi
pop     ebx

恢复备份的三个寄存器

image
mov     esp,ebp
pop     ebp
ret

恢复堆栈
image

出了call,在调用后执行的语句

恢复堆栈,返回调用地址  此时并没有平衡堆栈,据观察在调用后会使用
add esp,10h
恢复堆栈 
image

此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!

相关文章

  • C语言2-参数的传递与返回值

    C语言2-参数的传递与返回值 plus函数对应反汇编代码和意义 调用函数调用: 下面是call内部 堆栈没有变化 ...

  • 高质量C++编程指南 ----函数设计

    6.函数设计 函数接口的两个要素是参数和返回值。C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass ...

  • C语言22 调用约定和函数指针

    C语言22 调用约定和函数指针 函数调用约定 就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈 常见的几...

  • 使用ctypes模块在Python代码调用C函数

    使用Python语言进行编程的时候可能会需要调用用C语言开发的库,那么如何调用呢,传递给C函数的参数以及返回值如何...

  • jna对结构体、指针、引用、拷贝参数传递的使用

    虽然之前也用过jna,但是对于[结构体]的传递、指针参数数与返回值、引用参数与返回值、拷贝变量传递使用没有总结。 ...

  • go 语言函数

    go 语言函数 函数定义格式: 不同形式的函数定义: 无返回值 有一个返回值 有多个返回值 参数传递, 传递一个函...

  • C语言参数传递

    C语言参数传递 前言 最近复习Block相关知识,其中有个问题:block中为什么不能改变(这里值重新复制)被截获...

  • 参数传递与返回值

    参数传递与返回值 写法的注意事项: 关于参数的传递:尽可能的pass by reference (to const...

  • go 语言基础--函数

    1、函数 和C语言类型,Go语言也有函数的概念,语法如下: 2 参数和返回值 2.1 返回值 go 语言可以返回零...

  • 基于c语言的linux嵌入式开发入门

    前言 本文主要包含,c语言基本结构与语法、make及makefile的使用、main函数参数与返回值的说明、标准输...

网友评论

    本文标题:C语言2-参数的传递与返回值

    本文链接:https://www.haomeiwen.com/subject/inyrrftx.html