首页 > 编程语言 >从汇编看函数调用传参过程

从汇编看函数调用传参过程

时间:2024-11-19 20:19:28浏览次数:1  
标签:传参 汇编 ESP int 函数调用 eax EBP param1 ebp

1 示例代码

#include <stdio.h>

int func(int param1 ,int param2,int param3)
{
        int var1 = param1;
        int var2 = param2;
        int var3 = param3;
 
        printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);
        return var1;
}
 
int main(int argc, char* argv[])
{
        int result = func(1,2,3);
 
        return 0; 
}

2 解析

首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。

2.1 调用过程

  1. 函数main执行,main的各个参数从右往左压入栈中(这样访问参数出栈的时候是从左到右的),参数param3-param1依次压栈,如图
    1
  2. 压入返回地址
    2
  3. 程序执行从main跳转到被调用函数中,EBP入栈,将ESP(当前栈顶)赋值给EBP。

当一个新的函数调用的时候,首先将旧的EBP入栈,这样是为了保存当前调用者的栈帧,然后从当前栈顶开始建立新的栈帧(将当前栈顶ESP的值作为新的栈底EBP)

push ebp
mov ebp esp

此时栈顶(ESP)和栈底(EBP)指向同一位置
3

2.2 函数执行过程

int var1 = param1;对应汇编如下:

mov 0x8(%ebp), %eax
mov %eax, -0x4(%ebp)

先将EBP+0x8地址里面的内容赋值给eax,看图中EBP+0x8刚好是param1,再把eax寄存器的内容存到ebp-0x4的位置。这个相当于开了一个新变量int,然后赋值给这个变量。其余同理。
4

2.3 函数的返回

函数返回值一般存在eax寄存器中。

mov -0x4(%ebp), %eax

之后参数依次出栈,EBP恢复原值,返回到记录的返回地址,参数param1, param2,param3依次出栈,函数调用结束。

标签:传参,汇编,ESP,int,函数调用,eax,EBP,param1,ebp
From: https://www.cnblogs.com/jye159X/p/18516636

相关文章

  • SMARTFORMS函数调用完整示例:打印工厂物料信息
    首先规划想要打印的效果和信息,这里示例的是想要打印物料数据库里面的信息。①对相关数据表创建表结构:SE11 注意数据类型,数量quan需要参考类型:创建表结构:②创建一个REPORT程序,并对相关的字段、变量、内表进行声明,并写一个SELECTION界面和一些基础的取数等,具体代码如下:DATA......
  • 汇编语言-实验10编写子程序
    名称:show_str功能,在指定的位置,用指定的颜色,显示一个用0结束的字符串。参数:(dh)行号。(dl)列号,(cl)颜色ds:si指向字符串首地址返回无应用举例:8行3列,用绿色显示data中的字符串代码如下:assumecs:codedatasegmentdb'Welcometomasm!',0dataendscodesegmentstart:movdh,8......
  • 王爽汇编笔记
    1.测试环境1.1DosBox简介:模拟dos环境的一个软件下载地址:https://www.dosbox.com/download.php?main=1安装步骤:下一步......问题1:'debug'不是内部或外部命令,也不是可运行的程序或批处理文件。debug:无法将“debug”项识别为cmdlet、函数、脚本文件或可运行程序的名......
  • SV 接口 Interface 补充(调用传参举例)
    在SystemVerilog(SV)中,接口可以作为模块的端口传递,也可以在任务和函数中传递作为参数。通过接口传递参数使得多个模块可以共享相同的信号集,减少冗余代码,提高设计的可重用性。以下是一些例子,展示了如何在模块和任务/函数中使用接口作为参数传递。1.接口作为模块的端口传......
  • 【汇编语言】更灵活的定位内存地址的方法(三)—— 不同的寻址方式的灵活应用
    文章目录前言1.比较不同的寻址方式2.问题一3.问题一的分析与求解3.1分析3.1.1数据的存储结构3.1.2分析处理过程3.2代码实现4.问题二5.问题二的分析与求解5.1分析5.1.1数据的存储结构5.1.2分析处理过程5.2代码实现6.问题三7.问题三的分析与求解7.1分......
  • 【汇编语言】更灵活的定位内存地址的方法(二)—— 从 [bx+idata] 到 [bx+si+idata]:让你
    文章目录前言1.[bx+idata]1.1更加灵活的访问内存1.2示例1.3问题一1.4问题一的分析与求解2.用[bx+idata]的方式进行数组的处理2.1问题引入2.2原来的解决方案2.3新的解决方案2.3.1改进后的程序2.3.2还可以写成这样2.3.3用C语言来描述看看2.4比较与总结3.......
  • 汇编语言-CALL和RET指令
    call和ret都是转移指令,修改Ip或同时修改csip。1.ret和retfret指令用栈中的数据,修改ip的内容。从而实现近转移retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移。CPU执行ret指令时,进行下面两步操作(IP)=((SS)*16+(SP))(SP)=(SP)+2相当于POPIPCPU执行retf指令时进行下......
  • 汇编角度看值传递类对象
    首先奉上源代码classA{private:inti;public:A(){std::cout<<"defaultconstructoriscalled"<<std::endl;i=0;}A(int_i):i(_i){}A(constA&obj){std::cout<<"c......
  • lec 02 arm汇编语言基础
    Lecture02:ARM汇编基础Contents为什么学习ARM/ISA汇编从C到汇编理解arm汇编理解机器执行1为什么学习汇编和指令集架构?1.令人困惑的应用表现2.指令集架构ISA(InstructionSetArchitecture)CPU向软件(应用程序和操作系统)提供的接口。理解软件在CPU上的运行(OS设......
  • getopt解析命令行传参
    #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<time.h>#defineSTRLENTH 1024intmain(intargc,char**argv){ intc; charstrfmt[STRLENTH]={0}; charstrTm[STRLENTH]={0}; FILE*fp=......