Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NASM Assembler error in Windows: "undefined reference to `print_string'"

I'm getting strange errors when I try to compile a simple assembly program on Windows. The errors make it appear as if the assembler doesn't know what the functions I've used are and also is bringing Haskell into this for some reason.

This is the error I'm getting when I try to compile:

 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 `WinMain@16'
    collect2: ld returned 1 exit status

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

This is the NASM code:

;
; 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
like image 765
CodyBugstein Avatar asked Sep 20 '26 13:09

CodyBugstein


1 Answers

Try: gcc driver.c first.obj asm_io.obj -o first.exe. You will have to create asm_io.obj from asm_io.asm if it hasn't already been done.

driver.c calls asm_main (declared as global in your code). asm_io.inc declares these functions extern (and provides macros to call 'em). asm_io.obj contains the functions.

Dr. Carter's work is a little tricky to get working the first time. It gets easier.

like image 197
Frank Kotler Avatar answered Sep 22 '26 14:09

Frank Kotler



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!