x86 MASM C Linking | Assembly x86


June 29th, 2021 06:18:36 PM

;Main.asm .386 .model small,c ;This bit is important, I think. .stack 1000h .data hello db "Hello world!",0 .code ;includelib libucrt.lib ;All this shit is already here if you have a C object file includelib legacy_stdio_definitions.lib ;Except for this. Basically printf, puts etc ;includelib libcmt.lib ;includelib libvcruntime.lib ;Visual Studio exception handling and type checking. Not needed otherwise extrn printf:near ;Extern everything you are gonna use from the c obj files extrn plusTwo:near extrn exit:near public plusOne ;Have to declare it public for the linker to see it. In NASM, it's .globl or global plusOne proc ;Our int plusOne(int) function. pop eax ;Parameters are stored on the stack. add eax, 1 ret ;eax is whatever is returned from functions. Also why you can only return one thing. plusOne endp public main main proc push offset hello call printf push 1 call plusTwo push 0 call exit main endp end ;End of file, not program //bruh.c //#include <stdio.h> Has to be included with "includelib legacy_stdio_definitions.lib" in the asm file for some reason. //int printf(const char* format, ...); extern int plusOne(int); //Extern everything you are gonna use from the asm obj files int plusTwo(int num) { return plusOne(plusOne(num)); //Plus one is defined in the assembly. }

Featured Posts