A frame pointer is needed for C99's variable length arrays but not otherwise. 
Only an issue if ever plan9 C is extended to handle C99 or C1x. gcc has to do 
the right thing even with -fno-frame-pointer.

On Jan 16, 2012, at 5:08 AM, Charles Forsyth <charles.fors...@gmail.com> wrote:

> 
> You should read /sys/doc/asm.pdf first. 
> careful: TOS is only for 68k. nothing else defines or uses it.
> 
> Plan 9 doesn't use a base pointer, because everything can be addressed 
> relative to the stack pointer,
> and the loader keeps track of the SP level. thus FP is a virtual register, 
> that the loader implements
> by replacing offsets relative to it by the current appropriate offset from 
> the hardware stack pointer register (whatever
> that might be on a given platform). That's esp on the x86. the TEXT directive 
> specifies the space a function
> requires for its stack frame, and the loader then adds appropriate code at 
> start and end to provide it.
> 0(FP) is the first argument, 4(FP) is the second, and so on. 0(SP) is the 
> bottom of the current frame,
> and 0(SP), 4(SP) etc are referenced to build the arguments for outgoing calls 
> (but that space must
> be accounted for in the TEXT directive).
> 
> (it's probably not very different in effect from -fno-frame-pointer or 
> whatever it is for gcc,
> which also doesn't use ebp except that is implemented entirely by the 
> compiler.)
> 
> On 16 January 2012 12:30, Alexander Kapshuk <alexander.kaps...@gmail.com> 
> wrote:
> i have a question about putting things on the stack for x86 arch under plan 
> 9...
> 
> under unix/linux, when defining a function, i would:
> (1). push the address the base pointer is pointing to prior to this function 
> being called, onto the stack; e.g. pushl %ebp
> (2). then i would have the base pointer point to the current stack pointer; 
> e.g. movl %esp, %ebp
> (3). then i would allocate space on the stack for local variables, if any; 
> e.g. subl $n, %esp;
> (4). then follows the function body;
> to return from the function i would:
> (1). restore the stack pointer; e.g. movl %ebp, %esp;
> (2). restore the base pointer, e.g. popl %ebp;
> (3). then return to the calling function;
> 
> i searched the 9fans archives for posts on assembly programming under plan 9; 
> found some bits and pieces; e.g. in one of the posts it was mentioned that BP 
> is a general purpose register, not the base pointer; and that FP is what ebp 
> is under unix/linux;
> 
> in the paper for the plan 9 assembler, it says that there are three registers 
> available to manipulate the stack, FP, SP, and TOS; would the following 
> comparison stand true then?
> plan9    unix/linux
> -------     -------------
> FP        EBP
> SP        -4(%EBP)...-n(%EBP) /* local variables */
> TOS     ESP
> 
> thanks;
> 
> sasha kapshuk
> 
> 

Reply via email to