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 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 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 > >