Article View: comp.os.msdos.programmer
Article #1859alloca() for TurboC
From: Roger Neil Hook
Date: Fri, 17 Aug 1990 21:48
Date: Fri, 17 Aug 1990 21:48
58 lines
3101 bytes
3101 bytes
I am trying to compile GNU bison version 1.10 on a PC running DOS 3.3, using
Turbo C v2.0. The source references a function called 'alloca' to allocate
memory off the stack which is automatically freed when the function calling it
returns.
'alloca' is not included in the TurboC library, and is anyway not standard C.
I have come across two sets of assembly sources for a __680x0__ version, but
do not understand precisely how they function, not having much experience in
assembly.
Turbo C describes two methods of calling C functions which it calls 'cdecl'
and 'pascal' conventions.
I have been trying to work out how to write an 80x86 assembly version of
alloca to work with Turbo C. The problems I have encountered relate to not
understanding what the conventions for calling a function are, and also
confusion arising from trying to work out what the stack pointer is doing.
To whit:
I assume it is possible for a C compiler (on a PC but not necessarily
TurboC) to have a function, say A(), which does some stuff which ends
up with data stored on the stack. Then it calls alloca() which I assume
modifies the stack pointer to hide the alloca'd block.
1) This being the case, how does A find it's stacked data?
2) Also how does the memory get freed?
3) How can I write a version of alloca in 8086 assembly for the PC, and
TurboC in particular?
4) Finally, could someone please explain what alloca _should_ do, and also
what the version below (extracted from a GNU library for the Atari GCC)
does, especially the last op:
.text
.even
.globl _alloca
_alloca:
movel sp@+,a0 ;get return addr
movel sp@+,d0 ;get size -- assist in bug fix, add 4 to sp
addql #1,d0 ;ensure address even
andl #0xFFFFFFFE,d0 ;lop off extra bits
subl d0,sp ;increase stack frame size by that much
movel sp,d0 ;set up to return it
lea sp@(-4),sp ;new top of stack (real bug fix here)
jmp a0@ ;return by jumping via saved addr
In summary, I am mainly interested in finding out how to get an alloca() for
the PC for Turbo C, and also what it is that alloca() actually does.
My apologies in advance if bits of this aren't relevant to any particular
group.
Please email me, and I will endeavour to summarize to the net if there is
enough interest. Thanks,
Alias
JANET: ssuhook@susssys1.rdg.ac.uk
Technical Details
Message-ID:
<2745@onion.reading.ac.uk>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!ukc!reading!rosemary!ssuhookShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!ukc!reading!rosemary!ssuhook From: ssuhook@rosemary.cs.reading.ac.uk (Roger Neil Hook) Newsgroups: comp.os.msdos.programmer,alt.msdos.programmer,comp.lang.c Subject: alloca() for TurboC Summary: Need alloca() for PC running DOS Keywords: alloca, DOS, TurboC, assembly Message-ID: <2745@onion.reading.ac.uk> Date: 17 Aug 90 21:48:20 GMT Sender: news@reading.ac.uk Reply-To: ssuhook@susssys1.cs.reading.ac.uk Organization: Comp. Sci. Dept., Reading Univ., UK. Lines: 58