ASM编译器:32位ml.exe
C编译器:32位cl.exe
完整项目下载:CMixAsm.rar,需要使用VS2017打开:
main.cpp:
#include <stdio.h>
#include <conio.h>
#pragma warning(disable:4996)
// 下面的函数与变量被Asm调用
extern "C"
{
void __stdcall CFunc(int nArg, const char* pArg)
{
printf("C print: %X, %s\n", nArg, pArg);
}
int g_nCVal = 0xC00;
char g_szCStr[] = "C 字符串";
}
// 使用ASM中的函数和变量
extern "C" int __stdcall AsmFunc(int pnArg, const char* pszStr);
extern "C" char g_szAsmStr[];
extern "C" int g_nAsmVal;
int main()
{
// 使用ASM中的函数
AsmFunc(0x100, "开始");
// 使用ASM中的变量
printf("使用ASM中的变量: %X, %s\n", g_nAsmVal, g_szAsmStr);
return _getch();
}
Asm.asm:
.386
.model flat, stdcall
option casemap:none
;printf在VS2017中被声明为内联函数(实际并没有被内联,在应用程序中生成正常函数),
;不能直接使用API入口,如果要使用可以在C/C++文件中至少调用一次printf
;或者 用绝对路径使用MASM32中的msvcrt.lib。
printf proto C lpFmt:DWORD, args:VARARG
CFunc proto nArg:DWORD, pArg:DWORD
;使用外部变量
extern g_nCVal:DWORD
extern g_szCStr:DWORD
;供外部使用
public g_nAsmVal
public g_szAsmStr
.data
g_nAsmVal dd 0A00h
g_szAsmStr db 'Asm 字符串', 0
g_szFmt db '使用C中的变量: %X, %s', 10, 0
.code
AsmFunc proc nArg:DWORD, psz:DWORD
;使用C中的函数
invoke CFunc, nArg, psz
;使用C中的变量
invoke printf, addr g_szFmt, g_nCVal, addr g_szCStr
ret
AsmFunc endp
end