Hi I was wondering if anyone could help me figure out why every time I try to run this code it keeps bringing up an error of "cannot nest procedures". I need to use the PROTO and PROC directives in this program for my HW assignment. I'm also trying to use the INVOKE command as well in the program to learn it better but it isn't required. This is the exact problem from the book (I'm barely in the first section of the problem as you can tell from the code I have written):

"Create two procedures: (1) SetColor receives two byte parameters: forecolor and backcolor. It calls the SetTextColor procedure from the Irvine32 library. (2) WriteColorChar receives three byte parameters: char, forecolor, and backcolor. It displays a single character, using the color attributes specified in forecolor and backcolor. It calls the SetColor procedure, and it also calls WriteChar from the Irvine32 library. Both SetColor and WriteColorChar must contain declared parameters. Write a short test program that tests both procedures. Be sure to create PROTO declarations for SetColor and WriteColorChar."

And this is my code:

INCLUDE Irvine32.inc

.data

	ccolor DWORD 13
	bcolor DWORD 16
	SetColor PROTO,cc:DWORD,bc:DWORD
	prompt BYTE "Hi",0

.code
main PROC

	INVOKE SetColor,ccolor,bcolor
	mov edx,OFFSET prompt
	call WriteString
	jmp final

	SetColor PROC,cc:DWORD,bc:DWORD
		mov eax,cc
		add eax,bc
		call SetTextColor
		ret
	SetColor ENDP

	final:
	exit
main ENDP
END main

Exactly what the error description says - you cannot nest procedures.

Try this instead:
INCLUDE Irvine32.inc

.data
 
	ccolor DWORD 13
	bcolor DWORD 16
	SetColor PROTO,cc:DWORD,bc:DWORD
	prompt BYTE "Hi",0
 
.code
main PROC
 
	INVOKE SetColor,ccolor,bcolor
	mov edx,OFFSET prompt
	call WriteString
	
	exit
main ENDP

SetColor PROC,cc:DWORD,bc:DWORD
		mov eax,cc
		add eax,bc
		call SetTextColor
		ret
SetColor ENDP
END main

Edited 5 Years Ago by GunnerInc: n/a

Thank you very much for your help yet again! Now I understand what the error meant, didnt think of main proc as being a procedure itself even though it clearly is.

This question has already been answered. Start a new discussion instead.