View Single Post
Old 08-11-2009, 03:07 AM   #2

Crosma's Avatar
Exclamation Re: Including C functions in Assembly
I did not write this. It's in NASM format. It's the same basic idea in other assemblers. It's up to you to make sure all of the function names resolve upon linking.

Basically, you just push the function arguments onto the stack and then it's up to you to remove them afterwards. This stack methodology is what makes recursion possible (because the stack just keeps growing).

To load libraries dynamically and such, your best bet is to call the appropriate C functions.

; printf1.asm   print an integer from storage and from a register
; Assemble:	nasm -f elf -l printf.lst  printf1.asm
; Link:		gcc -o printf1  printf1.o
; Run:		printf1
; Output:	a=5, eax=7

; Equivalent C code
; /* printf1.c  print an int and an expression */
; #include <stdio.h>
; int main()
; {
;   int a=5;
;   printf("a=%d, eax=%d\n", a, a+2);
;   return 0;
; }

; Declare some external functions
        extern	printf		; the C function, to be called

        SECTION .data		; Data section, initialized variables

	a:	dd	5		; int a=5;
fmt:    db "a=%d, eax=%d", 10, 0 ; The printf format, "\n",'0'

        SECTION .text                   ; Code section.

        global main		; the standard gcc entry point
main:				; the program label for the entry point
        push    ebp		; set up stack frame
        mov     ebp,esp

	mov	eax, [a]	; put a from store into register
	add	eax, 2		; a+2
	push	eax		; value of a+2
        push    dword [a]	; value of variable a
        push    dword fmt	; address of ctrl string
        call    printf		; Call C function
        add     esp, 12		; pop stack 3 push times 4 bytes

        mov     esp, ebp	; takedown stack frame
        pop     ebp		; same as "leave" op

	mov	eax,0		;  normal, no error, return value
	ret			; return
(define love (lambda () (map conquer all)))
Last edited by Crosma; 08-11-2009 at 03:10 AM.
Crosma is offline