2013-03-03 38 views
2

當我嘗試在Windows上編譯一個簡單的彙編程序時,出現奇怪的錯誤。這些錯誤使得它看起來好像彙編程序不知道我使用的函數是什麼,並且出於某種原因也將Haskell帶入了這個問題。Windows中的NASM彙編程序錯誤:「未定義的引用'print_string'」

這是當我嘗試編譯我收到的錯誤:

C:\Users\Nick\Documents\COMP2210\>nasm -fwin32 first.asm 

    C:\Users\Nick\Documents\COMP2210\>gcc first.obj -o first 
    first.obj:first.asm:(.text+0xb): undefined reference to `print_string' 
    first.obj:first.asm:(.text+0x10): undefined reference to `read_int' 
    first.obj:first.asm:(.text+0x1f): undefined reference to `print_string' 
    first.obj:first.asm:(.text+0x24): undefined reference to `read_int' 
    first.obj:first.asm:(.text+0x3d): undefined reference to `sub_dump_regs' 
    first.obj:first.asm:(.text+0x4b): undefined reference to `sub_dump_mem' 
    first.obj:first.asm:(.text+0x55): undefined reference to `print_string' 
    first.obj:first.asm:(.text+0x5f): undefined reference to `print_int' 
    first.obj:first.asm:(.text+0x69): undefined reference to `print_string' 
    first.obj:first.asm:(.text+0x73): undefined reference to `print_int' 
    first.obj:first.asm:(.text+0x7d): undefined reference to `print_string' 
    first.obj:first.asm:(.text+0x84): undefined reference to `print_int' 
    first.obj:first.asm:(.text+0x89): undefined reference to `print_nl' 
    C:/Program Files (x86)/Haskell Platform/2012.4.0.0/mingw/bin/../lib/libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `[email protected]' 
    collect2: ld returned 1 exit status 

    C:\Users\Nick\Documents\COMP2210\> 

這是NASM代碼:

; 
; file: first.asm 
; First assembly program. This program asks for two integers as 
; input and prints out their sum. 
; 
; To create executable: 
; Using djgpp: 
; nasm -f coff -d COFF_TYPE first.asm 
; gcc -o first first.o driver.c asm_io.o 
; 
; Using Borland C/C++ 
; nasm -f obj -d OBJ_TYPE first.asm 
; bcc32 first.obj driver.c asm_io.obj 

%include "asm_io.inc" 
; 
; initialized data is put in the .data segment 
; 
segment .data 
; 
; These labels refer to strings used for output 
; 
prompt1 db "Enter a number: ", 0  ; don't forget nul terminator 
prompt2 db "Enter another number: ", 0 
outmsg1 db "You entered ", 0 
outmsg2 db " and ", 0 
outmsg3 db ", the sum of these is ", 0 


; 
; uninitialized data is put in the .bss segment 
; 
segment .bss 
; 
; These labels refer to double words used to store the inputs 
; 
input1 resd 1 
input2 resd 1 


; 
; code is put in the .text segment 
; 
segment .text 
     global _asm_main 
_asm_main: 
     enter 0,0    ; setup routine 
     pusha 

     mov  eax, prompt1  ; print out prompt 
     call print_string 

     call read_int   ; read integer 
     mov  [input1], eax  ; store into input1 

     mov  eax, prompt2  ; print out prompt 
     call print_string 

     call read_int   ; read integer 
     mov  [input2], eax  ; store into input2 

     mov  eax, [input1]  ; eax = dword at input1 
     add  eax, [input2]  ; eax += dword at input2 
     mov  ebx, eax   ; ebx = eax 
     dump_regs 1 
     dump_mem 2, outmsg1, 1 
; 
; next print out result message as series of steps 
; 
     mov  eax, outmsg1 
     call print_string  ; print out first message 
     mov  eax, [input1]  
     call print_int   ; print out input1 
     mov  eax, outmsg2 
     call print_string  ; print out second message 
     mov  eax, [input2] 
     call print_int   ; print out input2 
     mov  eax, outmsg3 
     call print_string  ; print out third message 
     mov  eax, ebx 
     call print_int   ; print out sum (ebx) 
     call print_nl   ; print new-line 

     popa 
     mov  eax, 0   ; return back to C 
     leave      
     ret 
+0

嘗試將路徑添加到'asm_io.inc' - '%include「PATH_TO_FILE \ asm_io.inc」' – Gunner 2013-03-03 03:34:04

回答

2

嘗試:gcc driver.c first.obj asm_io.obj -o first.exe。如果尚未完成,您將不得不從asm_io.asm創建asm_io.obj

driver.c調用asm_main(在您的代碼中聲明爲global)。 asm_io.inc聲明這些函數extern(並提供宏來調用'em')。 asm_io.obj包含功能。

卡特博士的工作是第一次工作有點棘手。它變得更容易。