The MASM Forum

Miscellaneous => Irvine Book Questions. => Topic started by: arsenalftw067 on October 23, 2015, 12:29:21 PM

Title: Undefined Symbol?
Post by: arsenalftw067 on October 23, 2015, 12:29:21 PM
I get an error saying: Undefined symbol SortArray
Undefined symbol ShowArray

SortArrray and ShowArray are both procs which I'm calling from my main



TITLE Sort array (Array.asm)

; This program sorts an array with random integers
; and outputs them in order

INCLUDE Irvine32.inc ; new
includelib C:\Irvine\Kernel32
includelib C:\Irvine\User32
includelib C:\Irvine\Irvine32

.data
array BYTE 20, 10, 60, 5, 120, 90, 100 ; array with 6 values
arraysize = ($ - array) -1 ; size of array


.code
main PROC
mov esi, OFFSET array
mov ecx, arraysize;
call SortArray ; call function to sort
call ShowArray ; call function to show

call DumpRegs ; display the registers
call WaitMsg        ; Pause until a key is pressed
exit
main ENDP
END main

SortArray PROC

L1:
push ecx
mov edi, esi ; use seond pointer
mov eax, [esi]
L2:
add edi, 2
CMP eax, [edi]; compare second value with previous
call ShowArray
JGE exchg ; perform exchange
JLE dntxchg ; dont perform exchange

add esi, 2
pop ecx
loop L1

dntxchg:
loop L2 ; start loop again

exchg:
mov eax, [edi]
xchg [esi], eax
mov [edi], eax
loop L2 ;

ret
SortArray ENDP


ShowArray PROC

;show contents of array
mov esi, OFFSET array
mov ecx, arraysize
inc ecx
L3:
mov ebx, TYPE array
call DumpMem
loop L3

ret
ShowArray EndP
Title: Re: Undefined Symbol?
Post by: rrr314159 on October 23, 2015, 12:40:54 PM
You could move the two procs above the routine they're called from. Or, put two proto statements at the top:

SortArray proto
ShowArray proto
Title: Re: Undefined Symbol?
Post by: dedndave on October 23, 2015, 01:10:06 PM
for PROC's that are CALL'ed, you shouldn't need a PROTO

the problem is the location of the END statement   :biggrin:
it goes at the end of the source file, everything after END is ignored

you might want to add the .lib extension to the LIB files, too
Title: Re: Undefined Symbol?
Post by: arsenalftw067 on October 23, 2015, 01:16:10 PM
Oh yes that's correct! So at the end of my last proc, is that where I put the end main?

Originally I put the procs inside the main but my professor didn't like that so I'm doing it in traditional c++ format
Title: Re: Undefined Symbol?
Post by: dedndave on October 23, 2015, 01:18:25 PM
        .code

main proc
main endp

proc1 proc
proc1 endp

proc2 proc
proc2 endp

        end     main


in the old days, we used to "nest" procedures all the time
not in vogue, anymore - lol
Title: Re: Undefined Symbol?
Post by: arsenalftw067 on October 23, 2015, 03:58:38 PM
Thank you for the hep!
Title: Nested procs
Post by: jj2007 on October 23, 2015, 06:22:11 PM
Quote from: dedndave on October 23, 2015, 01:18:25 PM
in the old days, we used to "nest" procedures all the time

Strange idea, somehow, but the assembler doesn't complain:
include \masm32\include\masm32rt.inc

.code
proc1 proc
  mov eax, eax

proc2 proc ; nested proc2 in proc1
  mov ebx, ebx
proc2 endp

  mov ecx, ecx
  ret
proc1 endp

start:
int 3
  call proc1
  print "strange"
  exit

end start


Under the hood, you only see this:
  mov eax, eax
  mov ebx, ebx
  mov ecx, ecx
  retn
Title: Re: Undefined Symbol?
Post by: dedndave on October 24, 2015, 02:26:21 AM
here's one example
you call the proc by using the Func label

Func_Ext PROC

    stosb

Func PROC

    lodsb
    test    al,al
    jnz     Func_Ext

    ret

Func ENDP

Func_Ext ENDP


I suppose it depends on the MASM version and OPTION's
but I got an error last time I tried it