vs2022 x64 C/C++和汇编混编的理解
C++中调用汇编代码。
为什么
本来准备学习逆向,发现很多代码都是使用的内联汇编,但是vs2022中编译不通过,尝试解决后,认为内嵌的好处在于使用c++中的变量,我不用内联而用文件,然后通过参数传过去是一回事。
在vs2022中不能使用内联汇编,网上的解决方案是安装Intel Parallel,问题是它对vs版本有要求,而且我也不想安装一堆东西。
既然不支持内联汇编,那么只要支持相互传递参数,也可以直接在c++中引用汇编文件。
怎么玩
参照:vs2022 x64 C/C++和汇编混编。
- 在vs2022中分别创建asm文件和cpp文件
- 设置项目的编译器配置,asm文件的编译类型
- 配置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文件高亮