Author Topic: Nested Procedures  (Read 190 times)

aw27

  • Member
  • ****
  • Posts: 852
  • Let's Make ASM Great Again!
Nested Procedures
« on: September 24, 2017, 11:53:23 PM »
MASM supports nested procedures and at the same time does not support nested procedures  :dazzled:- it is always ready to give the "Cannot nest procedures" error  :shock:. Period.

This is a 4 level deep procedure nesting exercise. I just made it to understand how the ENTER instruction that nobody uses work.  :t

Code: [Select]
.386

.MODEL FLAT, stdcall

includelib \masm32\lib\msvcrt.lib
printf proto C :ptr, :vararg
 
.data
fmt db "Variable from level %d to level %d",10,0
   
.code

OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE

LOC1 equ <dword ptr [ebp-4]>

nestum PROC
enter  4,0
mov eax, [ebp+8]
mov LOC1, eax
jmp n0
nest1 PROC
enter 4,1
jmp n1
nest2 PROC
enter 4,2
jmp n2
nest3 proc
enter 4, 3
mov eax, [ebp+8]
mov LOC1, eax
INVOKE printf, offset fmt, LOC1, 4
push ebp
mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 4

mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 4
mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 4

pop ebp
leave
ret 4
nest3 endp
n2:
mov eax, [ebp+8]
mov LOC1, eax
INVOKE printf, offset fmt, LOC1, 3

push ebp
mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 3

mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 3
pop ebp

push 3
call nest3

leave
ret 4
nest2 ENDP
n1:
mov eax, [ebp+8]
mov LOC1, eax
INVOKE printf, offset fmt, LOC1, 2

push ebp
mov ebp, [ebp]
INVOKE printf, offset fmt, LOC1, 2
pop ebp

push 2
call nest2

leave
ret 4
nest1 ENDP
n0:
INVOKE printf, offset fmt, LOC1, 1
push 1
call nest1
leave
ret 4
nestum ENDP

main PROC public
push 0
call nestum
ret
main ENDP

end main   

Variable from level 0 to level 1
Variable from level 1 to level 2
Variable from level 0 to level 2
Variable from level 2 to level 3
Variable from level 1 to level 3
Variable from level 0 to level 3
Variable from level 3 to level 4
Variable from level 2 to level 4
Variable from level 1 to level 4
Variable from level 0 to level 4

hutch--

  • Administrator
  • Member
  • ******
  • Posts: 4926
  • Mnemonic Driven API Grinder
    • The MASM32 SDK
Re: Nested Procedures
« Reply #1 on: September 25, 2017, 01:22:28 AM »
It is an interesting study although not many higher level languages use internal procedure nesting, what I wonder is if the is much difference between conventional nesting by calling a chain of external procedures as against building the nesting within one procedure. I have very occasionally nested a procedure within another by defining a normal stack frame manually but I don't see any real advantage in doing so.
hutch at movsd dot com
http://www.masm32.com    :biggrin:  :biggrin:

aw27

  • Member
  • ****
  • Posts: 852
  • Let's Make ASM Great Again!
Re: Nested Procedures
« Reply #2 on: September 25, 2017, 02:01:43 AM »
It is an interesting study although not many higher level languages use internal procedure nesting, what I wonder is if the is much difference between conventional nesting by calling a chain of external procedures as against building the nesting within one procedure. I have very occasionally nested a procedure within another by defining a normal stack frame manually but I don't see any real advantage in doing so.

The Pascal Language, namely Delphi support nested procedures. What I find nice is the capability to access variables of outer functions without passing them as parameters. There are a few other alternatives, including anonymous functions but they carry a larger overhead. BTW, I don't think Delphi uses the ENTER instruction.  :badgrin: