I have a problem with calling C function from asm project created in visual studio (Win10 x64, Visual Studio 2015). Project consist of one asm file:
.586
.model flat, stdcall
option casemap:none
includelib msvcrt.lib
ExitProcess PROTO return:DWORD
extern printf:near
.data
text BYTE "Text", 0
.code
main PROC
push offset text
call printf
add esp,4
invoke ExitProcess,0
main ENDP
end main
When I build project, linker outputs the error:
Error LNK2019 unresolved external symbol _printf referenced in function _main@0
Linker output parameters:
/OUT:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.exe" /MANIFEST:NO /NXCOMPAT /PDB:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MACHINE:X86 /SAFESEH:NO /INCREMENTAL:NO /PGD:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\SP_Lab7_Demo.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
If I comment call print
, then everything executes normally (even Windows API function). Is there any way to call C function from asm file without creating cpp file that includes <cstdio>
?
Is it possible to do?
You can call C functions, but then you'll need to link with the C library. Exactly how that is done will depend on what C library you want to link with. I'd suggest finding a minimal C runtime, such as the WCRT library.
The library will probably require initialization, and might require you to define a bunch of buffers somewhere for its book keeping.
Instead of going to all this trouble, I'd suggest you just stick to Windows API, and in your case use the WriteConsole function.
It appears that it' possible to use the Visual Studio 2015 Toolset with a few modifications.
includelib
to include these libraries in your assembly file.main
procedure usingPROC C
end main
, useend
only. Not fixing this may cause unexpected crashes.ret
to return. The C runtime calls ourmain
function, and will call the shutdown code for us upon returning.The code could look like:
Microsoft refactored much of the C runtime and libraries in VS 2015. Some functions are no longer exported from the C library (some are defined in a C header file). Microsoft has some compatibility libraries like legacy_stdio_definitions.lib and legacy_stdio_wide_specifiers.lib, but you can also choose to use the older Visual Studio 2013 platform toolset with the older C libraries.
To change the platform toolset: pull down the
Project
menu; selectProperties...
; go toConfiguration Properties
/General
, and changePlatform Toolset
to Visual Studio 2013 (v120)