c++调用汇编中函数的过程

MessageBoxA 和 MessageBoxW的使用用法 阅读详情

这篇文章探讨,c++调用汇编中函数的过程。核心在于,参数传递过程,会用到固定的寄存器,此处,汇编函数的参数和MessageBoxA 的参数一致所以没有显示传递。

实现的功能:

在汇编的 wechat_asm_call01 函数中调用弹窗MessageBoxA,在c++中引入extern "C" void __stdcall wechat_asm_call01(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT Type);该函数,然后调用汇编函数并传递参数wechat_asm_call01(0, "内容" , "123123标题", MB_YESNOCANCEL),最终实现c++调用汇编中的弹窗。

函数传参

; https://blog.youkuaiyun.com/a2831942318/article/details/127774181
; 在 Win64 里使用下面寄存器来传递参数:
; rcx - 第 1 个参数
; rdx - 第 2 个参数
; r8 - 第 3 个参数
; r9 - 第 4 个参数

MessageBoxA 参数的结构

调用MessageBoxA过程1,显示一个消息框。

; https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-messageboxa
; int MessageBoxA(
; [in, optional] HWND   hWnd,
; [in, optional] LPCSTR lpText,
; [in, optional] LPCSTR lpCaption,
; [in] UINT   uType
;);

c++调用汇编的方法

参照 MSDN 中 MessageBoxA 1 的 api 所需的参数,我们在c++中引用汇编代码中的函数。

// 引入汇编函数
extern "C" void  __stdcall wechat_asm_call01(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT Type);

// 然后在方法中调用
wechat_asm_call01(0, "内容" ,  "123123标题", MB_YESNOCANCEL);

定义函数,并使用参数

这里,为什么没有显示的接受参数,因为c++传递参数后,正好在汇编中也是用这几个寄存器读取参数,汇编函数的参数和MessageBoxA 的参数一致。所以不需要进行处理。

.code

align 16

extern MessageBoxA : proc

wechat_asm_call01 proc

    sub rsp, 28h

    call MessageBoxA

    add rsp, 28h
    ret 

wechat_asm_call01 endp

end

参数交换位置

上一篇文章23中,在汇编的结构体(函数)中这样写,就是把第一个参数rcx的值,存如第三个参数r8中。

mov		r8, rcx
; 在编写汇编代码时,通常需要为栈分配空间。在调用函数之前,需要将栈指针rsp向下移动,以便为函数的局部变量和参数分配空间。在函数返回之前,需要将栈指针恢复到原来的位置。
; 栈的大小取决于函数的局部变量和参数的数量和大小。在你的例子中,由于没有定义任何局部变量,也没有传递任何参数,因此可以不用为栈分配空间。
; 如果你的函数需要使用局部变量或者传递参数,可以使用sub rsp, n指令将栈指针向下移动n个字节,以便为局部变量和参数分配空间。在函数返回之前,可以使用add rsp, n指令将栈指针恢复到原来的位置。

; 需要注意的是,栈的大小应该是16字节的倍数,以便保证栈的对齐。在你的例子中,由于没有定义任何局部变量和参数,因此可以不用为栈分配空间。
; 在x86-64架构下,寄存器的大小为8字节,因此每个参数需要使用一个8字节的寄存器来传递。前四个参数会被依次传递到寄存器RCX、RDX、R8和R9中,因此这四个参数需要使用4个8字节的寄存器来传递。

; 在汇编语言中,16进制数通常使用h作为后缀来表示。

  1. MessageBoxA 函数 (winuser.h) ↩︎ ↩︎

  2. vs2022 x64 C/C++和汇编混编的理解 ↩︎

  3. vs2022 x64 C/C++和汇编混编 的 代码 ↩︎

【汇编程序】实现调用系统API函数MessageBox并输出不同形态 程序需求:编写一个调用Windows API 的程序,演示MessageBoxA的多种不同的组态。 编程思路:MessageBoxA函数是Windows系统提供的API函数,需要引入user32.lib这个库,同时还需要手动声明一下函数原型。MessageBoxA函数中最后一个参数为对话框风格,通过设置这个参数不同值,可以实现显示MessageBoxA的不同组态。具体参数含义可以参考微软官方手册。... 阅读详情

相关推荐

无感无刷电机控制进阶:反电动势过零检测的5种实现方案对比

本文深入探讨无感无刷电机控制中反电动势过零检测的5种实现方案,包括电阻分压虚拟中性点法、专用BEMF检测IC方案、基于ADC采样的数字锁相环、无传感器观测器技术及混合方案创新实践。通过对比分析各方案的优劣及适用场景,为电机控制工程师提供实用的技术选型指南,助力提升系统性能与成本效益。

weixin_28691741的博客 842

【C++】C++引用 (引用不会?详细解决引用诸多细节!)

c++引用,里面有好多图解,可以点进来看看!

小羊study_sheep的博客 3092

C/C++面试八股文汇总

以对象管理资源,利用的就是C++构造的对象最终会被对象的析构函数销毁的原则。上述的的申请、使用、释放资源的程序较为简单,但是如果程序很复杂的时候,需要为所有的new 分配的内存delete掉,导致极度臃肿,效率下降,更可怕的是,程序的可理解性和可维护性明显降低了,当操作增多时,处理资源释放的代码就会越来越多,越来越乱。栈在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。

wzzrh的博客 1万+

C++与汇编之间相互函数调用问题

汇编中可以直接调用C函数,C中也可以直接调用汇编函数(extern, global声明即可) 但是在C++中不能直接使用,因为C++中的函数与C的函数是不同的,因为C++支持重载,编译后的函数名会带有参数的信息(如:voidfunc(int arg)可能会被处理为func_int),而C中不需要; 所以要想在C++中使用汇编函数,不能直接void assmbly_func()来声明,...

神童i的博客 1314

通达信量化打板选股指标公式源码副图

X_2:=3*LOW;X_13:=4;X_14:=3;X_15:=2;X_16:=1;

gpzb7的博客 4480

华为MA5620配置宽带及语音实例

华为EPON配置实例1、公共部分和宽带PPPOE部分用串口用户名密码root/mduadminMA5620E>enableMA5620E#configMA5620E(config)#MA5620E(config)#sysnamebigcow/给设备起名字/****之前为公共部一、建vlan和地址bigcow(config)#vlan100...

weixin_33862041的博客 6345

C++虚函数调用的汇编过程

下面的程序改编自《Thinking in C++》的Instrument4.cpp#include using namespace std;enum note { middleC, Csharp, Cflat }; // Etc.class Instrument { public: virtual void play(note)

kenby的专栏 1246

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3227

C++函数调用的反汇编过程及Thunk应用

x86汇编基础知识 1. 汇编常用寄存器 esp,(Extended stack pointer)栈顶指针。因为x86的栈内存是向下扩展的,因此当push入栈时,esp–。pop出栈时,esp++。esp主要维护当前栈。 ebp,(Extended Base Pointer)栈基地址。一般都是在函数入口时,保存前函数的ebp,并将esp赋值给ebp,然后通过ebp来操作形参和临...

weixin_30564785的博客 100

数据分析!Python爬虫爬取B站UP主数据并分析涨粉规律(附可视化图表)

爬取更多UP主:扩充列表,增加需要分析的UP主UID数量爬取更多作品:修改的参数,增加每个UP主的作品爬取页数新增分析维度:在类中添加方法,可分析发布时间(如定时发布对涨粉的影响)、内容标签(如游戏/知识区涨粉差异)优化可视化样式:调整方法中的图表类型、颜色、标题等,适配个人展示需求播放量与粉丝数强正相关:从相关性热力图可看出,总播放量与粉丝数的相关系数通常在0.8以上,说明曝光量是涨粉的核心基础作品数量存在“边际效应”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1225

104、母线电容设计与选型

母线电容选型,容值不是最关键的,纹波电流和温度才是。很多炸机事故,不是容值不够,而是纹波电流超标导致过热。选电容时,多花点时间算纹波电流,比盲目加大容值有效得多。另外,别迷信进口品牌。国产电容(如江海、艾华)在常规应用里完全够用,价格只有进口的1/3。但高频特性确实有差距,所以高频去耦一定要用薄膜电容。最后,留个调试技巧:用示波器测母线电容两端的电压纹波,同时用电流探头测电容的纹波电流。如果纹波电流波形有尖峰,说明ESL太大,需要并联高频电容。如果纹波电压是低频波动,说明容值不够。

2401_88858637的博客 46

c,c++函数调用的汇编过程

开始温习C,C++,以前都是看effective c++之类的书籍,对c++原理不甚了解,为了知其所以然, 今天仔细研究了一下一个简单的函数的汇编过程。请各位大侠多指教。     /* 如下代码使用GUN GCC编译,反汇编如下 */ int main(int argc,char **args) {     int a=20;     int b=30;     int c...

kingj126的专栏 368

工业级实战:C#上位机集成YOLO实现多目标跟踪(含数据库存储+报表导出)

推理核心:ONNX Runtime实现C#直接推理YOLO模型,GPU优先+CPU降级适配工业机;跟踪核心:SORT算法轻量级实现多目标跟踪,保证工业场景实时性与稳定性;数据核心:MySQL存储+本地缓存,Excel报表标准化导出,满足工业数据追溯与质检需求;部署核心:模型优化、GPU加速、开机自启,保证工业级7x24小时运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 473

C/C++从汇编指令上看函数的调用过程

c++函数调用过程

weixin_39861267的博客 321

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C/C++】汇编解析:函数调用的压栈、弹栈过程;

文章目录前言常见指令待分析代码release 模式下分析 (单纯的压栈弹栈过程)debug 模式下分析 (主要是看rep 指令初始化的问题)总结 前言 首先知道release下就算关闭优化也和dubug下的汇编差了很多,主要是debug 要有很多调试信息存在; 如果只需要分析函数调用过程,那么直接看关闭了优化的release 的代码即可; 栈空间的开辟与释放,是没有默认初始化的过程的,直接减sp指针或者恢复sp指针即可; 所以会存在报错:局部变量不初始化就直接使用; 常见指令 rep 指令主要是循环

多丰富下自己呀 1379

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++函数调用过程的汇编代码分析(arm64指令集)

函数调用过程的汇编代码分析(arm64指令集),顺便关注一下栈空间的分配与回收。

海洋饼干叔叔 1079

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[C++反汇编] 栈帧(函数调用过程)

该系列文章是依据本人平时对反汇编的学习,归纳总结,所做的学习笔记。如有错误或待改善之处,请留下您宝贵的意见或建议。   栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。栈帧是在程序的运行时栈中分配内存块,专门用于特定的函数调用。   当一个函数没有执行时,它可能并不需要内存;但是当一个函数被执行后,它就可能因为某种原因需要用到内存。原因有:1.函数的调用方可能希望以参数

智者千虑 必有一失 1234

FreeNOS中C++源码部分相关类构造函数以及方法函数的初始化过程(六)

上节分析到从汇编代码正式跳转到C++代码,即kerne/Main.cpp中的kmain函数,接下来分析相关类构造函数以及方法函数的初始化过程。

jeremy的博客 986

通过汇编语言分析C++函数的调用过程,以及引用传递、形式传递和以数组为参数时的内存分配分析。

通过汇编语言来理解C++的函数调用

DongMaoup的博客 808

C++代码反汇编后的函数调用过程,堆栈寄存器EBP和ESP

栈是从高地址向低地址生长的。  ebp始终指向当前栈帧的栈底部 ,

SauceJ的专栏 1628

cpp 程序调用 c 程序(extern “C“ 的使用) error2019解决方案

文章讲述了在编译过程中,.cpp文件调用.c文件中的函数出现错误的原因,主要是由于C++编译器对函数名进行了修饰。解决方案是使用externC来确保C和C++编译器使用相同的命名规则。通过条件编译宏__cplusplus,可以在头文件中正确地为C和C++代码提供函数声明。

duiwangxiaomi的博客 508

c语言ADD的作用,C语言与C++混合开发?命中会遇见的extern "C"!

原标题:C语言与C++混合开发?命中会遇见的extern "C"! 这个系列进行到这里,我们完成了main方法的本质,命令行参数怎么解析,编译过程,指针的反向思考,以及extern的用途,静态库动态库的拆解,可变参数,static的妙用,inline的内联意义,const为啥还能改?这一节我们来看下一个好玩的内容,就是C和C++的混合编程,我们来逐步拆解,就能够明白。回顾下之前的内容,我们的源码...

weixin_39934613的博客 1533

c++函数堆栈调用

由一个.cpp/.c文件到达一个可执行文件分为以下几部分 预编译阶段:进行宏替换,删除注释,展开头文件,添加行号等 编译阶段:进行词法,语法,语义分析,和代码优化,生成汇编指令 汇编:翻译指令 连接阶段:合并段和符号表,符号解析 运行阶段:建立虚拟地址和物理映射,加载指令和数据,程序入口地址写入寄存器中 c++内存分布 c++函数调用参数传递(编译器为vs2013) 执行一个简单的函数 #inc...

qq_43440004的博客 527
上一篇: vs2022 x64 C/C++和汇编混编的理解
下一篇: 如何把多个ts文件合并为一个mp4文件
topcss
博客等级 码龄18年 24粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值