asm c vc2017 混合编程互相调用

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

汇编中的变量常量须要用public列出来,函数不须要,由于直接就是public的,直接能够经过extern ...  (c++用extern "C" ... )进行调用。api

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,和后面的原型,好比:code

;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
相关文章
相关标签/搜索