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