I wonder why assemblers use the prologue/epilogue pair and not Enter/exit pair?
Could you explain it, I am curious and I don't understand too.
thanks.
Jokaste,
My novice understanding is that:
Quote
push rbp
mov rbp, rsp
is faster than:
Quote
enter
...and many programmers prefer higher speed. However, difference is quite small, as I understand it. The "leave" instruction (which I assume you intended when you wrote "exit") is apparently about tthe same speed as:
Quote
mov rsp, rbp
pop rbp
Regards,
Mark Allyn
Thanks for your (quick) answer.
I did not remember the mnemonic for LEAVE.
I will see if the number of bytes is the same and/or if the stack is aligned automatically.
There must be a reason for this pair of mnemonic exists.
Quote from: Jokaste on December 08, 2017, 03:04:32 AM
There must be a reason for this pair of mnemonic exists.
High level constructs to support high level languages. Probably compiler writers from ancient times would found much easier to use this instructions while programming. For example for nested procedures.
Have a look here for an aw27 authored topic related to this:
http://masm32.com/board/index.php?topic=6564.0 (http://masm32.com/board/index.php?topic=6564.0).
QuoteProbably compiler writers from ancient times would found much easier to use this instructions while programming.
With actuall assemblers it seems (to me) that with all the macros (high Level, it seems) programmers don't write assembly code but macros code.Thank you for the link, but it is not the purpose (nested procedures).I am thinking about using variables from an other proc, like GoAsm does.
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
Quote from: Jokaste on December 08, 2017, 05:38:03 AM
Thank you for the link, but it is not the purpose (nested procedures).
I'm just saying that the reason is basically a high level facility (from old times).
Thaks Hutch.
At the final time it is the same (number of bytes and speed).
Felipe, I began programming in 1980, in Cobol, APL and Assembler on BULL DPS6 and 7, on PDP and VAX, on NCR and on Digital mini-computers.
There was not DOS. It appears next year.
So the old times were when I began, I was 21 years old!
I am vexed, but I know it was not your intention, but suddenly you realized that you are an old man (58 years)!
Gamin
Philippe
:biggrin:
> but suddenly you realized that you are an old man (58 years)!
Ha ha, you are only a young fella. :P
Yup, Hutch is right. You're a wee one. I'm 75. I fought with Job Control Language on IBM 360 machines. I lost.
Mark Allyn
(https://www.bing.com/images/search?view=detailV2&ccid=1ATYeXZ8&id=8A7EB0AF0AD0FDD6A24DF89105EB376BF346F522&thid=OIP.1ATYeXZ8ZkS715tqapXgqwEsDh&q=grand+father&simid=608036091077136010&selectedIndex=404)(https://www.bing.com/images/search?view=detailV2&ccid=1ATYeXZ8&id=8A7EB0AF0AD0FDD6A24DF89105EB376BF346F522&thid=OIP.1ATYeXZ8ZkS715tqapXgqwEsDh&q=grand+father&simid=608036091077136010&selectedIndex=404)(http://1.bp.blogspot.com/_Djk7QwVjbqw/TO3TDfNYosI/AAAAAAAAL7w/UDV06KZEsBY/s1600/DSC02336_2.jpg)
Its mine on 2017/12/24 - 58 years.
I also new JCL on Punch Cards.
Quote from: Jokaste on December 08, 2017, 10:45:33 PM
Felipe, I began programming in 1980, in Cobol, APL and Assembler on BULL DPS6 and 7, on PDP and VAX, on NCR and on Digital mini-computers.
There was not DOS. It appears next year.
So the old times were when I began, I was 21 years old!
I am vexed, but I know it was not your intention, but suddenly you realized that you are an old man (58 years)!
Gamin
Philippe
Come on! I was just paraphrasing hutch, when he talks about the old DOS and old, antique instructions... :bgrin:
I wasn't saying to none of here old... :icon14:
Quote from: felipe on December 08, 2017, 02:25:58 PM
the reason is basically a high level facility
Btw, i said that, based on my reads from old (may i say old now? :redface:) Intel manuals...And my memory from those reads.
:bgrin:
Loved the cake!
The best part of PCs compared to the old days is that one doesn't have to run up and down 4 flights of stairs with the deck of cards to fix a crumby line of Fortran.
Mark
And put the sticker on a band when it is left...
We went to the same school... :eusa_boohoo: