C与ASM混合编程

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值