On 21/10/2022 07:44, Philipp Klaus Krause wrote:
The cleanup for stack parameters is done for both: for foo by the
callee, for bar by the caller. Which one does it depends on the type
of the function. For details, see section 4.5.1.1, "SDCC calling
convention, version 1" in the manual:
Argh, $*!% me, I did not notice this was the case. I usually work with
large memory model STM8 devices, but this is for a medium-only device,
and the void-returning function meets the criteria for callee stack
adjustment. >:(
Can you briefly remind me what is the rationale behind void-returning
functions having the stack clean-up done by caller and not callee? One
of the things I prefer about the old calling convention is that it's
just so much simpler, without exceptions like this.
Now I understand why 'i' was being trampled, as in my original code
function 'foo' is in fact a __naked inline assembly function, where I am
not cleaning the function arguments from the stack.
Regards,
Basil Hussain
P.S. By the way, now I am looking at the manual again, is there not a
mistake in section 4.5.1.2 describing calling convention version 0? It says:
All parameters are passed on the stack. The stack is not adjusted for
the parameters after the call (thus the callee has to do this
instead), unless __z88dk_callee is specified.
The second sentence is self-contradicting. Callee must adjust the stack,
unless you specify the option that says the callee will adjust the
stack!? I have never encountered functions that are attributed as
version 0 and SDCC does *not* generate stack rewind after calls to them
(i.e. caller SP rewind, not callee).
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user