[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [MiNT] Stack restore done by OS
On 10/10/2010 11:40, Miro Kropacek wrote:
just curious, to your knowledge, what is the reason behind forcing
programmer to adjust stack manually after each OS call?
That is the traditional C calling convention, named "cdecl".
Its advantages are simplicity and support for functions with variable
number of arguments, like printf().
However, the vast majority of functions have a fixed number of
arguments, so the called function could fix the stack itself.
Removing the arguments from the stack in the called function is not
easy, because the return address is pushed after them. So rts can't be
used to return and fix the stack. One could pop the return address to
a0, fix the stack, then jump to a0. Not very natural.
Such calling convention is called "stdcall", I have never seen it on m68k.
On the other side, the x86 cpus have a nice feature: the assembler ret
instruction (similar to rts) can take an optional integer argument for
cleaning the stack after return. So the stdcall calling convention is
very efficient and simple to implement on these processors. Microsoft
has used that stdcall calling convention everywhere in the Win32 API:
the caller pushes the arguments, call a function from a system DLL, and
that's all. The function has removed its own arguments.
The C compilers on Windows allows to chose the calling convention for
your own C functions. stdcall can be used for a bit more efficiency.
However, for the rare functions taking a variable number or arguments,
cdecl has to be used in any case.
So, in conclusion, I think that Atari had designed the trap interface
like classic C functions using cdecl. And also, as Andreas said, it
would have been even more complicated to fix the stack inside the traps
than in regular functions.
NB: On Atari, if your stack is big enough, you don't have to clean it up
after each system call. You can make a big cleanup at the end... or never.