函数调用约定

GEE:提取研究区 NDVI/LST/RVI 并进行时间序列线性插值填补缺失像素和Savitsky-Golay(SG)滤波平滑处理 养乐多_本文将介绍使用Landsat数据集,构建时间序列,并使用线性插值算法填补缺失数据,或者去云空洞,并进一步对完整的时间序列数据进行SG滤波处理。 阅读详情

通过名字来分析:压栈就是往栈内添加东东,因为栈是先进先出的,所以叫做压栈。

-------------------------------------------

下面是搜索到的内容,很好:

函数压栈的本质是参数传递 
这又跟汇编语言连系起来了.汇编语言的过程即proc可以理解成函数 
比如一个最简单的计算两数之和函数 
如果用汇编来写估计是这样的 

sub proc 
pop ax ;从stack取a 并放在AX寄存器中 
pop bx ;从stack取b 并放在BX寄存器中 
add ax,bx ; 计算a+b 
ret //返回 
sub endp 

显然要调用这个函数,你应当先把b值push进stack,然后再push a 
因为stack是先进后出的 
所以调用汇编像这样 
比如计算4+5 
push 5; 
push 4; 
call sub; //返回值在AX中 
在这个例子中先压5或先压4得到的结果没有变化 
但大多数程序,如果参数的顺序错误将是灾难性的 


因为不管什么高级语言最终都要编译成汇编语言,然后是机器语言 
同样下面这个C程序,计算a+b值,必然会编译成上面的汇编代码 
int sub(int a ,int b) {return a+b;} 
所以C在调用这个函数sub时,必须要压栈(即传入参数)但这些工作,在C语言里,并不需要你来完成.你只要写出 
sub(7,9); 
编译器在编译成汇编时就会自动完成相关的压栈工作. 

根据函数调用方式和参数压入顺序目前存在三种约定: 

stdcall 
cdecl 
fastcall 
这都相关压栈顺序和栈的清理工作约定 
他们的细节都不相同,但有一点是肯定的,参数比须从右向左压入栈中 
stdcall中 函数必须自已清理栈 
cdecall 由调用者清除堆栈 C的默认函数调用方式 所以这样C支持可变参数 
fastcall 是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈 

源代码: 
int function(int a, int b) 
{ 
return a + b; 
} 

void main() 
{ 
function(10, 20); 
} 

1.__cdecl 

_function 
push ebp 
mov ebp, esp 
mov eax, [ebp+8] ;参数1 
add eax, [ebp+C] ;加上参数2 
pop ebp 
retn 
_main 
push ebp 
mov ebp, esp 
push 14h ;参数 2入栈 
push 0Ah ;参数 1入栈 
call _function ;调用函数 
add esp, 8 ;修正栈 
xor eax, eax 
pop ebp 
retn 

2.__fastcall 

@function@8 
push ebp 
mov ebp, esp ;保存栈指针 
sub esp, 8 ;多了两个局部变量 
mov [ebp-8], edx ;保存参数 2 
mov [ebp-4], ecx ;保存参数 1 
mov eax, [ebp-4] ;参数 1 
add eax, [ebp-8] ;加上参数 2 
mov esp, ebp ;修正栈 
pop ebp 
retn 
_main 
push ebp 
mov ebp, esp 
mov edx, 14h ;参数 2给EDX 
mov ecx, 0Ah ;参数 1给ECX 
call @function@8 ;调用函数 
xor eax, eax 
pop ebp 
retn 

3.__stdcall 

_function@8 
push ebp 
mov ebp, esp 
mov eax, [ebp] ;参数 1 
add eax, [ebp+C] ;加上参数 2 
pop ebp 
retn 8 ;修复栈 
_main 
push ebp 
mov ebp, esp 
push 14h ;参数 2入栈 
push 0Ah ;参数 1入栈 
call _function@8 ;函数调用 
xor eax, eax 
pop ebp 
retn

【第1章】基于FPGA的图像形态学处理学习教程——目录 本课程介绍图像形态学处理技术,通过腐蚀、膨胀、开运算、闭运算等算子对图像进行优化。腐蚀可去除边缘杂色使线条更清晰,膨胀能填补缺口修复图像,开运算擅长去噪,闭运算则用于修补断裂。课程内容涵盖四大形态学处理的理论分析、MATLAB仿真和FPGA开发实现,包括腐蚀、膨胀、开闭运算以及顶帽变换等操作,最后探讨形态学处理的实际应用场景。通过仿真测试和FPGA开发实践,帮助学员掌握图像"美容塑型"的核心技术。 阅读详情

相关推荐

别再只测电压了!用STM32G474的ADC玩点花的:过采样提升精度与多通道扫描实战

本文深入探讨了STM32G474系列单片机的ADC高级应用,包括硬件过采样技术实现16位精度和多通道扫描结合DMA的自动数据采集方案。通过详细的配置步骤和实战案例,帮助开发者突破传统电压测量局限,提升信号采集精度和系统效率,适用于工业监控、医疗设备等高精度应用场景。

weixin_42647395的博客 239

x64 调用约定,参数传递以及函数返回值

从 x86 到 x64 的两个重要修改是:64 位寻址功能和一组平面的用于常规使用的 16 个 64 位寄存器。对于展开的寄存器集,x64 仅使用 __fastcall 调用约定和基于 RISC 的异常处理模型。__fastcall 模型使用寄存器(对前四个变量)和堆栈帧传递其他参数。 调用约定 x64 应用程序二进制接口 (ABI) 是一个 4 寄存器快速调用调用约定,具有用于

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1万+

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8759

函数调用约定的详解

概述 在工作的过程中,我们总是需要调用底层函数或者使用第三方的库,在使用的过程中我就发现了有一些函数前面总有一些__stdcall,之初我只知道那是调用约定,但别人问我什么是调用约定,我也答不上来。今天就把调用约定整理一下,以备下次跟别人吹牛用。 1、什么是调用约定(函数调用约定) 首先让我们看看一个函数被调用都经历了哪几个过程,编译器帮我们做了什么: 调用要使用的函数,现在把调用者的地址入栈(...

weixin_39640298的博客 2456

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 307

【Hypermesh】TetraMesh Panel 常用选项详解

结合Hypermesh 2020 帮助文档和自己的一点使用经验,整理了这个博客。

qgm1702的博客 3677

c语言函数调用约定,函数调用约定

函数调用约定常见的函数调用约定[5]:cdecl,stdcall,fastcall,thiscall,naked callMFC调用约定(VS6:Project Settings->C/C++ Calling convention:)1. __cdecl(C调用约定.The C default calling convention)C/C++ 缺省调用方式a.压栈顺序:函数参数从右到左.b...

weixin_39630410的博客 917

unity 在透明物体上投射阴影

unity版本:2019.4.16 创建一个shader,代码如下: Shader "ChuckLee/ARShadow" { Properties { _ShadowColor("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53) } SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Geometry+1" } Blend SrcAlpha OneMinusSrcAlph

Abel02的博客 2953

什么是函数调用约定?

函数调用约定()是在程序设计中定义函数如何调用和返回的一套规则。它规定了函数参数的传递方式、返回值的处理、堆栈的管理以及函数名的修饰方式等。不同的调用约定可能会影响程序的性能和可移植性,因此理解它们对于高效编程和调试非常重要。一、函数调用约定的主要内容参数传递方式传递顺序:参数是从左到右还是从右到左依次压入堆栈。传递方式:参数是通过寄存器传递还是通过堆栈传递。堆栈管理堆栈清理者:调用者(caller)还是被调用者(callee)负责在函数调用结束后清理堆栈上的参数。返回值处理。

weixin_47151388的博客 1377

谷歌(Google) Pixel 8/9 Pro(xl)如何获取 root 权限

谷歌(Google)Pixel8/9Pro(xl)等系列手机破解后,会在你的init_boot.img同路径生成一个magisk_patched.img,把这个文件拷贝到adb目录下,稍后还得把它刷回手机,这样手机才能获得Root权限,因为安卓14、15以后的内核结构调整,和Pixel7及以下的6、5、4、3、2等系列手机破解稍微不一致。因为ROOT权限的获取,需要使用ROM中的内核文件,个人强烈建议在官网下载ROM,直接刷最新版,其他地方的ROM如果没有校验码,请自行斟酌是否使用。

bugsycrack的博客 3486

鼎阳示波器SCPI指令与MD5算法解锁带宽升级实战

本文详细介绍了鼎阳示波器通过SCPI指令与MD5算法实现带宽升级的实战流程。从设备连接、信息获取到Python密钥生成脚本解析,逐步指导用户完成升级操作,并涵盖常见问题排查与功能选件激活指南,帮助用户充分释放设备潜能。

www00的博客 348

函数调用约定与名字修饰约定

在Windows下,由于很多语言支持动态链接库技术,因此动态链接库是一种很好的混合编程方法。语言对函数的约定有两种:函数调用约定和名字修饰约定。不同语言默认的调用调用约定和函数的命名方式是不同的,要想不同的语言开发的动态链接库能够相互调用,那么开发动态链接库的语言和调用链接库的语言的函数约定必须相同,同时在编译时函数的修饰名也必须一样。

一只菜鸟的专栏 2105

【AUTOSAR-E2E】-2.1-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--

「汽车电子助手」的博客 4417

函数调用约定总结

1. 函数调用约定,主要约束两件事:参数传递顺序;调用堆栈由谁(调用函数或被调用函数)清理2. 常用函数调用约定:stdcall, cdecl, fastcall, thiscall, naked call3. __stdcall表示:参数从右向左压入堆栈;函数被调用者清理堆栈;C编译器函数名的修饰规则为:__functionname@number;(functionname为函数名,number...

HXBCJF的博客 654

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

3 种关键函数调用约定

高级语言翻译成机器码后,计算机没有办法知道函数调用的参数个数、类型,也没有硬件可以保护这些参数。 另外,在C++中,因为重载的原因,所以对函数的命名方式和普通C语言并不一致,该方式称为名字改编。 函数调用者与函数之间,尤其是跨语言调用接口时,需要一个协议约定来传递参数——栈。 关键流程: 调用时,调用者依次把参数压栈,然后调用函数, 被调用函数,在堆栈中取得数据,并进行计算。 函...

weixin_34007886的博客 1882

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言函数调用约定

 在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递

Make Progress Everyday! 701

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: UAC相关注册表问题备份
下一篇: C++中的空类,编译器默认可以产生哪些成员函数
wcppcw
博客等级 码龄18年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值