继续谈下调用约定

​楼市大消息!这一房贷利率即将统一下调!北京已官宣每日经济新闻2024-12-30 20:40​——12月30日,北京日报记者从北京住房公积金管理中心获悉,2025年1月1日起,北京市存量公积金贷款利 楼市大消息!这一房贷利率即将统一下调!北京已官宣12月30日,北京日报记者从北京住房公积金管理中心获悉,存量房贷款,是指2024年5月18日前发放的住房公积金个人住房贷款,于2025年1月1日起开始,按相应首套、二套利率调整。图片来源:视觉中国-VCG111493437899以一笔贷款金额剩100万元,贷款期限还剩25年的首套住房公积金个人住房贷款为例,选择等额本息还款方式,月供将由4794.29元降至4664.46元,减少129.83元,对于购房者来说,这将进一步减轻房贷还款压力。 阅读详情

今天写了个DLL是用extern "C"导出的,以前一直用.def文件,结果出现了以下错误
无法解析的外部符号 "__declspec(dllimport) int __cdecl SetStatus(int)" (__imp_?SetStatus@@YAHH@Z),该符号在函数 "public: void __thiscall CtestAntiRemoteDlg::OnBnClickedBtn(void)" (?OnBnClickedBtn@CtestAntiRemoteDlg@@QAEXXZ) 中被引用
解决是需要在导出的前面也加extern "C"。

如果定义的约定和使用的约定不一致,则将导致堆栈被破坏,导致严重问题,下面是两种常见的问题:
1) 函数原型声明和函数体定义不一致2) DLL导入函数时声明了不同的函数约定


1._cdecl是C Declaration的缩写,表示C语言默认的函数调用方法:所有参数 从右到左依次入栈,这些参数由调用者清除,称为手动清栈(由调用者把参数弹出栈)。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。

_cdecl是C和C++程序的缺省调用方法。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。VC将函数编译后会在函数名前面加上下划线前缀。是MFC缺省调用约定。

2._stdcall是Standard Call的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是retn x,x表示参数占用的字节数,cpu在ret之后自动弹出x个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。

_stdcall是Pascal程序的缺省调用方式,通常用于Win32Api中。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上“@”和参数的字节数。

3._fastcall调用约定是“人”如其名,它的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数(或若干个),剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。VC将函数编译后会在函数名前面加上“@”前缀,在函数名后面加上“@”和参数的字节数。

4._thiscall仅仅应用于C++成员函数。this指针存放于CX寄存器,参数从右到左压。_thiscall不是关键词,因此布恩那个被程序员指定。_thiscall是为了解决类成员调用this指针传递而规定的。_thiscall要求把this指针放在特定寄存器中,该寄存器由编译器决定。VC使用ecx,Borland的C++编译器使用eax。返回方式和_stdcall相当。

5.naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些 寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。

以上是粘贴,以前在看郁金香的教程时看到在函数前面加个naked 说生成纯汇编,因为如果用内联汇编的方式,编译器仍然会在函数内部的开始和结束部分自动做一些工作。如果想要编写一个纯汇编的函数,所有的栈初始化恢复工作都手动来写,就可以加这个。
这是一个很少见的调用约定,一般程序设计者建议不要使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是,不能用return返回返回值,只能用插入汇编返回结果。这一般用于实模式驱动程序设计,假设定义一个求和的加法程序,可以定义为:
Cpp代码 
  1. __declspec(naked) int  add(int a,int b)  
  2.   {  
  3.       __asm mov eax,a  
  4.       __asm add eax,b  
  5.       __asm ret  
  6.   }  

注意,这个函数没有显式的return返回值,返回通过修改eax寄存器实现,而且连退出函数的ret指令都必须显式插入。上面代码被翻译成汇编以后变成:
Cpp代码 
  1. mov    eax,[ebp+8]  
  2. add    eax,[ebp+12]  
  3. ret    8  
注意这个修饰是和__stdcall及cdecl结合使用的,前面是它和cdecl结合使用的代码,对于和stdcall结合的代码,则变成:
Cpp代码 
  1. __declspec(naked) int __stdcall function(int a,int b)  
  2.    {  
  3.        __asm mov eax,a  
  4.        __asm add eax,b  
  5.        __asm ret 8//注意后面的8  
  6.    }  
至于这种函数被调用,则和普通的cdecl及stdcall调用函数一致。

Linux内核进程管理子系统有什么第六十回 —— 进程主结构详解(56) 阅读详情

相关推荐

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 681

函数名修饰约定规则

 文章参考了:http://blog.youkuaiyun.com/yxin1322/articles/564597.aspxhttp://hi.baidu.com/wyuanshiy/blog/item/82f709339ad5a2f81b4cff4d.htmlhttp://blog.youkuaiyun.com/orbit/archive/2005/08/10/450413.aspxhttp://bl

FISH 的专栏 2278

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 242

cdecl和stdcall调用约定的汇编代码对比

decl和stdcall调用约定的汇编代码对比 --- d:\projects\lab\call_type\call_type.cpp ------------------------------------ #include <stdio.h> int __stdcall add(int a, int b) { 013D13B0 ...

weixin_33671935的博客 257

3D高斯溅射融合Gabor滤波器:频率感知如何提升神经渲染效率与质量

在计算机视觉与图形学领域,3D场景重建旨在从多视角图像中恢复真实世界的三维结构与外观。其核心原理是通过优化场景表示,使渲染出的二维图像与输入照片尽可能一致。传统方法在效率与细节保真度间常面临权衡,高频细节(如精细纹理、锐利边缘)的重建尤为消耗算力。频率感知技术为此提供了突破方向,它借鉴信号处理思想,将场景分解为不同空间频率的成分进行针对性建模。Gabor滤波器作为经典的频率-方向分析工具,能有效刻画纹理的局部频域特征。将Gabor的频率选择性与3D高斯溅射(3DGS)这一高效显式表示结合,构成了神经Gabo

weixin_33087827的博客 272

一分钟教会你搭建steam新游幻兽帕鲁服务器

总结: 游戏对服务器搭建要求相对较高、且对服务器网络协议有要求不能封堵UDP、多开、游戏运行久、同时在线人数多了这些会很吃内存 我自己用的64G内存多开4区测试玩家同时在线50多人的情况下内存已经跑满了、对于想用服务器搭建联机的小伙伴建议根据开区数量以及玩家人数去选择配置、当然也可以直接找我阿杰购买、我可以提供技术搭建服务。注:如果用的是本地电脑局域网搭建直接输入127.0.0.1:8211就行 如果用的是服务器搭建输入自己服务器IP+端口或解析的域名+端口进入游戏。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 2237

error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureSignalHandle

error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureSignalHandler(void)" (__imp_?InstallFailureSignalHandler@google@@YAXXZ) D:\VS_PROJECT\caffe\caffe\common.obj

SnailTyan 1万+

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2558

名字修饰约定: extern "C"、extern "C++" 和__stdcall、__cdecl相关的约定、__imp_前缀

__imp,说明那不是真正的静态库,而是某个动态库的导入库 导入函数和函数自己不同名,所以加__imp 比如__imp_printf忘了有没有后缀了,就是printf函数 所谓名字修饰约定,就是指变量名、函数名等经过编译后重新输出名称的规则。 比如源代码中函数名称为int Func(int a,int b),经过编译后名称可能为?Func@@YAHHH@Z、?Func@@YGHHH@Z、_...

随意的风的专栏 1127

利用恒源云在云端租用GPU服务器训练YOLOv8模型(包括Linux系统命令讲解)

为当涉及到深度学习的训练任务时,GPU的计算能力是不可或缺的。相对于传统的中央处理器(CPU),图形处理器(GPU)具有更强大的并行计算能力,能够显著加速深度学习模型的训练过程。深度学习算法通常涉及大量的矩阵运算和张量操作,而GPU的并行计算架构使得它们能够高效地执行这些计算,从而加速模型训练的速度。恒源云是一个经济高效的云计算平台,您可以通过恒源云的控制台或者命令行界面来管理实例、上传和下载数据、执行训练任务等。

Snu77的博客 6726

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 477

x86 x64下调用约定浅析

x86平台下调用约定     我们都知道x86平台下常用的有三种调用约定,__cdecl、__stdcall、__fastcall。我们分别对这三种调用约定进行分析。   __cdecl   __cdecl是C/C++的默认调用约定,如果不显示声明调用约定的情况下,就是该调用约定。下面我们来从汇编层次来熟悉这种调用约定。 我写了一个函数,如下: 1 int __c...

156

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

采用软核进行串口升级的原因主要有以下几点:1、官方推荐:官方以前也推出了针对逻辑进行升级的程序《XAPP1081_QuickBoot》,但是从今年起(2024年)官方就停止更新相关例程了(详见下面截图),所以采用官方推荐的软核更新;2、简单并具有通用性:针对SPI或者BPI官方都有相关的IP,可应对市场上80%以上的FLASH,并且官方IP通用性极强,只需要修改几个参数就可以对不同厂家的芯片进行升级操作;

OpenFPGA的博客 2000

Java数据结构:堆与PriorityQueue优先级队列的使用

堆实质上就是对完全二叉树进行了一些调整。而在 Java 的 PriorityQueue 优先级队列中,底层就是堆这样的结构。所以,我们尝试通过模拟堆的实现,来更好的理解优先级队列。知识补充:何为完全二叉树?答:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

黄小黄的博客 1044

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

优先级队列_堆

Java集合框架提供了两种优先级队列PriorityQueue和PriorityBlockingQueue,PriorityQueue是线程不安全的,后者是线程安全的。2.向下调整,则是指 找出子树中最小值,和根节点比较,若根节点大就交换,持续往下进行,直到根节点比子树小,或没有子树时。先把新元素进行尾差,然后向上调整(从最后的飞叶子节点开始调整成小堆,然后一次往上走,直到标记的child下标小于0)队列是一种先入先出的数据结构,优先级队列又特殊一点,优先级队列出队列时,是先对优先级高的元素出队列。

suger__salt的博客 828

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

分析驱动程序在IRQL>=DISPATCH_LEVEL时和DPC过程中不能用KeWaitForSingleObject等待对象的原因

M$ddk对调用KeWaitForSingleObject接口有下面约定: Callers of KeWaitForSingleObject must be running at IRQL <= DISPATCH_LEVEL. However, if Timeout = NULL or *Timeout != 0, the caller must be running at IRQL <= A

lixiangminghate的专栏 4085

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

堆排序算法精讲:从数据结构基础到408考研真题解析

排序算法是计算机科学的核心基础,旨在将数据集合按特定顺序重新排列,其效率直接影响程序性能。堆排序作为一种基于比较的排序算法,其核心原理在于利用“堆”这种特殊的数据结构。堆在逻辑上是一棵完全二叉树,在物理上通常用数组存储,通过维护堆序性质(大顶堆或小顶堆)来快速访问最大或最小元素。其技术价值在于兼具了O(n log n)的最坏时间复杂度与O(1)的原地排序空间复杂度,是一种高效且空间友好的选择。在工程实践中,堆排序及其衍生结构(优先队列)广泛应用于任务调度、实时系统以及解决经典的Top K问题。对于备战计算机

weixin_30432579的博客 418

顺应行业和经济形势,泰然金融宣布降息

#subheadlines div {font-size: 17px;} #dvContent table[name=logo_release]+p+div[id^=prni_] {clear:both;} ...

美通社 303

C++ priority_queue深度解析:从堆原理到仿函数实战应用

堆(Heap)作为一种基于完全二叉树的高效数据结构,其核心原理是通过维护特定堆序性质(如大顶堆或小顶堆),在O(log n)时间内实现元素的插入与删除,同时保证极值元素(堆顶)的O(1)访问。这种特性使其在需要动态获取最优解的场景中极具技术价值,广泛应用于任务调度、实时系统、图算法(如Dijkstra最短路径)以及数据流的中位数查找等。在C++ STL中,priority_queue正是堆的容器适配器实现,它通过仿函数(Functor)机制灵活定义优先级规则,例如在合并K个有序链表的经典问题中,结合自定义比

weixin_33754065的博客 433

【PWN】HappyNewYearCTF_5_ret2text 32位

摘要:本题为32位ROP利用题,通过分析发现存在可控溢出点和/bin/sh字符串。解题思路是修改返回地址为后门函数system的调用地址0x08049278,并在栈上布置参数0x0804C028。利用256字节的缓冲区溢出,构造payload时需注意32位程序通过栈传递参数的特点。文章还探讨了传参与非传参场景下跳转地址选择的区别,指出传参场景必须跳转到call func指令才能正确重建栈帧。最后给出了利用代码和参考资料。

452

就业协议中的服务器是什么,关于就业协议,你必须知道的

原标题:关于就业协议,你必须知道的“关于就业协议,你必须知道的”就业指导处 何峰就业季,毕业生们投入了大量的时间投递简历、笔试、面试,除此之外,还有一项需要毕业生们高度重视的内容就是就业协议,它的签订意味着毕业生结束大学学习生活后有了确定的第一份工作。就业协议是什么?就业协议是《全国普通高等学校毕业生就业协议书》的简称,是应届毕业生在第一次就业时由毕业生本人、用人单位和学校签订的就业协议。山东省高...

weixin_30670053的博客 468
上一篇: Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
下一篇: 上例中便是调用GetSystemMenu函数的
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值