2009-12-21 2 views
7

Я изучаю NASM и связываю этот код (который я нашел here). Он собирает с помощью этой команды NASM:GCC выводит ошибку «неопределенная ссылка на` printf »при использовании инструкции extern NASM для доступа к printf

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

к printf.o, но это Gcc связывающую команду:

gcc -o printf1 printf1.o 

терпит неудачу с ошибкой:

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

Что я делаю неправильно? Заранее спасибо. (EDIT: Я нахожусь в 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 

ответ

4

Я считаю, что вам нужно сделать, что _printf в соответствии с C соглашение о вызовах (так же, как вы использовали _main вместо main).

+0

Теперь это компилируется, но он падает, когда я открываю «printf1.exe», он просто сбой. Есть ли способ отлаживать программы, созданные NASM во время их работы? –

+0

Просто откройте его в WinDBG или аналогичном. –

+1

Все мои программы, связанные с gcc NASM, терпят неудачу :(Интересно, почему? –