前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >asm c vc2017 混合编程互相调用

asm c vc2017 混合编程互相调用

作者头像
战神伽罗
发布2019-07-24 16:16:21
9470
发布2019-07-24 16:16:21
举报

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

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

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

代码语言:javascript
复制
;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,和后面的原型,比如:

代码语言:javascript
复制
;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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档