asm c vc2017 混合编程互相调用

本文详细介绍了如何在汇编语言中调用C++编写的函数,包括x64和x86架构下的具体实现方法。通过实例展示了如何使用extern关键字声明外部函数,以及如何在链接器设置中添加所需的.obj文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只要在属性-链接器-输入-附加依赖项,加入需要的obj即可链接进去,支持通配符,如:f:\dir\*.obj

汇编中的变量常量需要用public列出来,函数不需要,因为直接就是public的,直接可以通过extern ...  (c++用extern "C" ... )进行调用。

x64的通过 extern fn:proc 即可调用c或其它obj的fn,比如:

;hello64.asm
 
extrn MessageBoxA : proc
extrn ExitProcess : proc
 
.data
 
text        db  'Hello world!', 0
caption     db  'Message', 0
 
.code
 
main proc frame
    sub rsp, 28h
    .allocstack 28h
    .endprolog
    xor r9, r9          ;MB_OK
    lea r8, caption     ;lpCaption
    lea rdx, text       ;lpText
    xor rcx, rcx        ;hWnd
    call MessageBoxA
    xor rcx, rcx
    call ExitProcess
    add rsp, 28h
main endp
 
end

x86的通过 fn proto即可调用c或其它obj的fn,如果是api,要加stdcall,和后面的原型,比如:

;hello32.asm
 
.386
.model flat
 
MessageBoxA proto stdcall hwnd:dword, text:dword, caption:dword, buttons:dword
ExitProcess proto stdcall exitcode:dword ;实际上这里的原型有的可以随意填,有的却必须保持一致,大概有overload,比如下面(GetProcAddress GetCurrentProcess 这两个就必须跟原型一致):
GetModuleHandleW proto stdcall void:dword
DeleteCriticalSection proto stdcall void:dword
InitializeCriticalSection proto stdcall void:dword
EnterCriticalSection proto stdcall void:dword
LeaveCriticalSection proto stdcall void:dword
GetSystemInfo proto stdcall void:dword
GetProcAddress proto stdcall handle:dword,procname:dword
GetCurrentProcess proto stdcall

 
.data
 
text        db  'Hello world!', 0
caption     db  'Message', 0
 
.code
 
main proc
    push 0                  ;MB_OK
    push offset caption     ;lpCaption
    push offset text        ;lpText
    push 0                  ;hWnd
    call MessageBoxA
    push 0
    call ExitProcess
main endp
 
end

 

转载于:https://my.oschina.net/u/1777508/blog/2051527

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值