vs2022 x64 C/C++和汇编混编的理解

C++中调用汇编代码。

为什么

本来准备学习逆向,发现很多代码都是使用的内联汇编,但是vs2022中编译不通过,尝试解决后,认为内嵌的好处在于使用c++中的变量,我不用内联而用文件,然后通过参数传过去是一回事。

在vs2022中不能使用内联汇编,网上的解决方案是安装Intel Parallel,问题是它对vs版本有要求,而且我也不想安装一堆东西。

既然不支持内联汇编,那么只要支持相互传递参数,也可以直接在c++中引用汇编文件。

怎么玩

参照:vs2022 x64 C/C++和汇编混编。

  1. 在vs2022中分别创建asm文件和cpp文件
  2. 设置项目的编译器配置,asm文件的编译类型
  3. 配置vs2022使asm文件高亮。(不是必须)

怎么理解(基于copilot)

1. c++中的GetMsgBoxType() 是如何传递给汇编代码的。

在汇编代码文件中,使用了 extern 关键字来声明了一个名为 GetMsgBoxType 的过程,该过程在 C++ 代码中定义。这样,汇编代码就可以调用 C++ 代码中的 GetMsgBoxType 函数了。

在汇编代码文件中,使用了 call 指令来调用 GetMsgBoxType 过程,这会将程序的控制权转移到 C++ 代码中的 GetMsgBoxType 函数。在 C++ 代码中,GetMsgBoxType 函数返回一个无符号整数类型的值,该值为 MB_YESNOCANCEL,表示消息框中有“是”、“否”和“取消”三个按钮。

在汇编代码文件中,使用了 mov 指令将 GetMsgBoxType 函数的返回值存储在寄存器 r9 中,然后将 r9 寄存器的值传递给 MessageBoxA 函数,以设置消息框的类型。这样,C++ 代码中的 GetMsgBoxType 函数就被成功地传递给了汇编代码,并被用于设置消息框的类型。

2. 该代码的执行逻辑关系是怎么样的。先编译汇编代码,然后在c++中引用吗。解释这个过程。

这个代码包含两个文件,一个是汇编代码文件(文件2),一个是C++头文件(stdafx.h)。

首先,C++代码需要包含stdafx.h头文件,该头文件包含了Windows.h头文件和其他必要的标头文件。

然后,汇编代码文件中定义了一个名为asm_func的过程,该过程调用了MessageBoxA函数来显示一个带有“是”、“否”和“取消”三个按钮的消息框。在asm_func过程中,使用了GetMsgBoxType过程来获取消息框的类型,使用了msgCaption字符串来设置消息框的标题。

在C++代码中,可以通过声明asm_func函数来调用汇编代码中的asm_func过程。在C++代码中,可以使用MessageBox函数来显示一个消息框,该函数会调用asm_func函数来显示消息框。

因此,整个过程的执行逻辑关系是:首先编译汇编代码文件,然后在C++代码中引用asm_func函数,最后在C++代码中调用MessageBox函数来显示消息框。

3. 解释.data 和 .code 以及end

.data 和 .code 是汇编语言中的两个伪指令,用于指示汇编器如何处理下面的代码。

.data 用于定义数据段,即程序中需要使用的全局变量和常量。在数据段中定义的变量和常量可以在整个程序中使用。

.code 用于定义代码段,即程序中的指令和过程。在代码段中定义的指令和过程可以被其他部分调用和执行。

end 用于标记程序的结束。在汇编语言中,程序的开始和结束都需要用特定的标记来标识。在这个代码中,end 标记表示程序的结束。

4. 解释 align 16

align 16 是汇编语言中的一个指令,它的作用是将下一个数据或指令的地址对齐到16字节的边界上。这个指令通常用于优化内存访问,因为许多CPU架构都支持对齐访问,这样可以提高内存访问的效率。在这个代码中,align 16指令将下一个数据或指令的地址对齐到16字节的边界上,以便更好地利用CPU的缓存和预取机制,提高代码的执行效率。

[1]:vs2022 x64 C/C++和汇编混编
[2]:Intel Parallel Studio XE 2016 Cluster Version,最高支持到VS2015
[3]:配置vs2022使asm文件高亮

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值