asm c vc2017 混合编程互相调用

2019-07-24 16:16:21 浏览数 (3)

只要在属性-链接器-输入-附加依赖项,加入需要的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

0 人点赞