Its generally the case that where you have to write high level code in assembler (API, CRT etc ...) the code takes so much longer than the entry and exit of the proc that it simply does not matter what you use to create the stack frame. The next factor is how would you test the entry and exit speed of a procedure when the techniques for constructing a stack frame do not lend themselves to loop code at all.
MASM has used the mnemonic LEAVE for many years but used the well known stack construction,
push ebp ; preserve base pointer
mov ebp, esp ; stack pointer into ebp
as the entry method for 32 bit procedures.
Here is a test piece for the 2 main methods of creating a stack frame in win64.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include64\masm64rt.inc
.data
mtxt db "How D",0
ttxt db "Title",0
pmsg dq mtxt
pttl dq ttxt
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
entry_point proc
conout str$(rsp)," stack pointer on entry",lf
; --------------------------
; full manual procedure call
; --------------------------
; mov rcx, 0
; mov rdx, pmsg
; mov r8, pttl
; mov r9, MB_OK
; call testproc
; ---------------------------
; proc call with shadow space
; ---------------------------
; invoke testproc,0,pmsg,pttl,MB_OK
; ------------------------
; same as full manual call
; ------------------------
rcall testproc,0,pmsg,pttl,MB_OK
conout str$(rax)," procedure return value",lf
conout str$(rsp)," stack pointer on exit",lf
waitkey
invoke ExitProcess,0
ret
entry_point endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
NOSTACKFRAME
testproc proc
; push rbp ; manually construct stack frame
; mov rbp, rsp
enter 80h, 0h
sub rsp, 256 ; allocate local space on the stack
call MessageBox ; call API with arguments loaded in 1st 4 registers
leave ; exit the stack frame
; mov rsp, rbp ; exit the stack frame
; pop rbp
ret
testproc endp
STACKFRAME
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end
comment ^
.text:0000000140001000 C8800000 enter 0x80, 0x0
.text:0000000140001004 4883EC60 sub rsp, 0x60
.text:0000000140001104 C9 leave
.text:0000000140001105 C3 ret
versus
.text:0000000140001106 55 push rbp
.text:0000000140001107 488BEC mov rbp, rsp
.text:000000014000110a 4881EC00010000 sub rsp, 0x80
.text:0000000140001117 488BE5 mov rsp, rbp
.text:000000014000111a 5D pop rbp
.text:000000014000111b C3 ret
^
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
This is the batch file to build it.
@echo off
set appname=manual
if exist %appname%.obj del %appname%.obj
if exist %appname%.exe del %appname%.exe
\masm32\bin64\ml64.exe /c %appname%.asm
\masm32\bin64\polink.exe /SUBSYSTEM:CONSOLE /MACHINE:X64 /ENTRY:entry_point /nologo /LARGEADDRESSAWARE %appname%.obj
dir %appname%.*
pause