tags:

views:

428

answers:

1

I am learning NASM and am tying to compile this code (which I found here). It assembles using this NASM command:

nasm -f coff -l printf.lst  printf1.asm

to printf.o but this gcc linking command:

gcc -o printf1  printf1.o

fails with the error:

printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status

What am I doing wrong? Thanks in advance. (EDIT: I'm on Windows 7);

; printf1.asm   print an integer from storage and from a register
; Assemble: nasm -f coff -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 
; 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
+2  A: 

I believe you need to make that _printf to match the C calling convention (just like you used _main instead of main).

R Samuel Klatchko
This now compiles but it crashes when I open "printf1.exe" it simply crashes. Is there a way to debug NASM made programs while they are running?
Callum Rogers
Just open it up in WinDBG or similar.
Anon.
All of my gcc linked NASM programs are failing :( I wonder why?
Callum Rogers