C语言调用函数时参数传递实测(好久以前记录的)
上面是函数原型。来看看它编译后的反汇编是怎样执行的。理解函数的调用过程。
第一步:int i= 10
在执行完i= 10后,可以查到i的地址是0x0028FAAC,然后查对应的内存地址
从图中可以看到,10已经被写到对应的内存中去了。
第二步:f(&i);这句话对应的汇编有以下4句
011E1405 lea eax,[i]
011E1408 push eax
011E1409 call f (11E105Ah)
011E140E add esp,4
Lea eax,[i] 将i的有效地址传递给eax,执行完可观察到eax的值已经发生变化
Push eax ,将eax的值压栈,然后call函数f
第三步
void f(int * x)
{
011E13A0 push ebp
011E13A1 mov ebp,esp
011E13A3 sub esp,0C0h
011E13A9 push ebx
011E13AA push esi
011E13AB push edi
011E13AC lea edi,[ebp-0C0h]
011E13B2 mov ecx,30h
011E13B7 mov eax,0CCCCCCCCh
011E13BC rep stos dword ptr es:[edi]
这一段汇编来逐个看一下
Push ebp将旧的ebp压栈
Mov ebp,esp 对栈底指针重新赋值,指向现在的栈顶
然后将bx,si,di压栈
Lea edi,[ebp-c0h]将[ebp-c0h]的地址传递给edi寄存器
011E13B2 mov ecx,30h
011E13B7 mov eax,0CCCCCCCCh
011E13BC rep stos dword ptr es:[edi]
对F9D0到F910的区域初始化,全部写成ccH,共C0H个字节,每次写4个字节,共写30H次。
上面三句话是一起的,相当于是一个循环。先将cx寄存器设为30h,然后对eax赋值为cccccccch。
Rep stos dword ptr es:[edi]的作用是将 eax的值写入到es:[edi]对应的地址。
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址. 如果设置了direction flag, 那么edi会在该指令执行后减小, 如果没有设置direction flag, 那么edi的值会增加, 这是为了下一次的存储做准备。
第四步:*x = 100;
mov eax,dword ptr [x]
Mov dword ptr [eax],64h
mov eax,dword ptr [x] ,将 [x]的值传递给eax。[x]的值就是实参i的地址,即
此时0028FAAC地址对应的值还是10.
Mov [eax],64h 往这个地址写入100,即64h
第5步:下括号
先是将edi,esi,ebx出栈。可以看到,出栈后寄存器中的值变化了,但是原来的栈区中的内容没有被清除。
然后将ebp的值赋给esp,让栈顶指针指向ebp所在的位置
C语言调用函数时参数传递实测(好久以前记录的)相关推荐
- c语言:当数组作为形参调用函数时,需要连同数组长度一起传进来!
以前一直不知道为什么数组作为形参调用函数时需要连同数组长度一起传进来,难道不能在被调用函数当中利用sizeof()自己算吗?答案是不可以! 下面来做个实验: /*project:test editor ...
- python 函数的调用的时候参数的传递_python定义函数时的参数调用函数时的传参...
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- 在C语言程序中 当调用函数时,c语言程序设计第2版) 教学课件 作者 梅创社试题库 期末试卷一.docx...
期末试卷一 一.单项选择题(每题1分,共45分)1.在计算机系统中,可以执行的程序是( )A.源程序 B.汇编语言程序C.机器语言程序 D.ASCII码2.C语言程序的基本单位是( )A.程序行 B. ...
- c语言函数调用找不到标识符,C语言在main中调用函数时找不到标识符
把定义的函数放在,main函数之前即可. (推荐学习:phpstorm) 自定义的函数需要声明在调用之前,比如说在main函数里调用自定义的fun(),则fun()的方法体需要写在main函数之前. ...
- python调用子函数时参数传递问题
场景: python建立子函数,在主程序中进行调用. 问题描述 将全局变量传入子函数,子函数中对局部变量进行修改导致全局变量发生. 示例代码: import numpy as np def softm ...
- c语言调用函数计算分段函数值,输入x,计算并输出下列分段函数f(x)的值(保留2位小数) c语言...
计算分段函数输入 x ,计算并输出 y 的值.公式如下 当x >= 0时,f(x) = x^0.5,当x小于0时,f(x #include#include//[1{intmain()//你所写的 ...
- js传参不是数字_js调用函数时传入的参数个数与函数定义时的参数个数不符时的操作...
1.在js中函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最有一个有效,其他的函数声明都是无效的.比如说声明了两个函数fn(),第一次声明时没有形参,第二次声明时形参有 ...
- C语言调用函数如何返回多个变量值?【基础】
最近用到了一部分C/C++的相关知识,但是C/C++的函数只能返回一个变量值,如果要返回多个就很难做.经过多方面查找资料,发现如果想返回多个变量值一般只有两种方法: 设置指针和地址: 构造结构体: 设 ...
- python中调用函数时必须有实参_Python之函数(一)定义函数以及传参
定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...
最新文章
- python写小程序-你用python写过那些好玩的微信小程序?
- keras从入门到放弃(九) 处理过拟合
- Windows 2003 Server服务器上IIS发布网站具体步骤
- inkscape生成g代码_三点二. 量子对抗生成网络 (Quantum GAN)
- 关于VC++6.0中getline函数的一个bug
- python排名上升_TIOBE:2019年7月全球编程语言排行 Python热度继续上升
- 20万RMB!学数据分析的朋友一定要看!
- 微型计算机中的数据总线用来,微型计算机技术及应用(戴梅萼4)练习题答案.doc...
- libsvm-3.1-[FarutoUltimate3.1Mcode]——辅助函数简介(修改)
- python3 ftplib_python3从零学习-5.10.9、ftplib—FTP 协议客户端
- mysql覆盖索引和回表
- (售前)销售经理和产品经理的区别以及未来发展
- 使用MMAction2处理UCF-101数据集
- ffmpeg复杂滤镜-filter_complex
- 用Python写一个简单的24点计算器
- linux编译trinitycore,[MAC] 编译安装和测试《魔兽世界》模拟服务端 TrinityCore
- Python备份Mysql脚本_python备份mysql脚本
- 华为云 对象存储服务 OBS 上传文件 上传图片 PHP Laravel
- 大话通信和计算机网络,《大话通信》读后感 - 通信人读书 - 通信人家园 - Powered by C114...
- IC高级工程会议——DVCon中国2019欢迎您的论文投稿!
热门文章
- 缓存和数据库如何保证一致性
- 2022年智源社区年度热点推荐丨新春集锦
- 强化学习 之 探索与利用
- RH358管理打印机和打印文件--配置和管理打印机
- [答疑]两个客户A,B,都要求你给找一个性感女郎
- matlab simulink 代数环问题解决
- 北航计算机学院王华峰,软件学院学术论坛第四次宣讲会
- Matlab中的diag函数用法
- 拼多多将追回不当订单;微信公布2018年辟谣成果;“多闪”正式上线App Store | 雷锋早报...
- 成为第三大操作系统,YunOS用了这四大招