2009-12-21 12 views
7

Estoy aprendiendo NASM y estoy intentando compilar este código (que encontré here). Reúne el uso de este comando NASM:Error de salida de GCC "referencia indefinida a` printf '"cuando se usa una declaración externa de NASM para acceder a printf

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

a printf.o pero este comando gcc vinculación:

gcc -o printf1 printf1.o 

falla con el error:

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

¿Qué estoy haciendo mal? Gracias por adelantado. (EDITAR: Estoy en 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 

Respuesta

4

Creo que necesita para hacer que _printf para que coincida con la convención de llamada C (al igual que utilizó en lugar de _mainmain).

+0

Esto ahora se compila, pero se bloquea cuando abro "printf1.exe", simplemente se bloquea. ¿Hay alguna forma de depurar los programas NASM mientras se ejecutan? –

+0

Simplemente ábralo en WinDBG o similar. –

+1

Todos mis programas NASM vinculados a gcc están fallando :(Me pregunto por qué? –

Cuestiones relacionadas