2009-12-21 19 views
7

'a erişmek için bir NASM extern deyimi kullanırken, bu kodu derlemeyi (bu kodu here bulduğum) derledim. printf.o içinGCC çıktıları "printf" ile tanımsız "hatası", printf

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

ama bu gcc bağlama komutu:

gcc -o printf1 printf1.o 

hatayla başarısız: Neyi yanlış yapıyorum

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

Bu NASM komutunu kullanarak bir araya? Şimdiden teşekkürler. (DÜZENLEME: Windows 7'deyim);

; 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 

cevap

4

inanıyorum sen (siz _main yerine main kullandığı gibi) _printf C çağırma kuralı maç için emin olmak gerekir.

+0

Bu şimdi derler ama "printf1.exe" yi açtığımda çöküyor, yalnızca çöküyor. NASM'in çalıştığı sırada hata ayıklamalarının bir yolu var mı? –

+0

Sadece WinDBG'de veya benzerlerinde açın. –

+1

Tüm gcc bağlantılı NASM programlarında başarısız oluyor: (Merak ediyorum neden? –