chip@ateng.ateng.com (Chip Salzenberg) (03/28/89)
Several persons have requested alloca() for Xenix/386. Okay, here it is. Written in Microsoft assembler, it works with the Xenix/386 C compiler. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: Makefile alloca.s # Wrapped by chip@ateng on Mon Mar 27 12:39:18 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(236 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X# Makefile for alloca X XTARGET=Sliballoc.a XASFLAGS=-Mx $(LISTING) X Xall: $(TARGET) X Xclean: X rm -f *.o ?liballoc.a X XSliballoc.a: alloca.s X $(AS) $(ASFLAGS) -DMODEL_$(MODEL) -oalloca.o alloca.s X ar ru $@ alloca.o X rm alloca.o X ranlib $@ END_OF_FILE if test 236 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'alloca.s' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'alloca.s'\" else echo shar: Extracting \"'alloca.s'\" \(1075 characters\) sed "s/^X//" >'alloca.s' <<'END_OF_FILE' X; alloca.s X; Allocate from the stack from a Microsoft C program. X X TITLE $alloca386 X X .386 X X_DATA SEGMENT DWORD USE32 PUBLIC 'DATA' X_DATA ENDS XCONST SEGMENT DWORD USE32 PUBLIC 'CONST' XCONST ENDS X_BSS SEGMENT DWORD USE32 PUBLIC 'BSS' X_BSS ENDS XDGROUP GROUP CONST, _BSS, _DATA X X_TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' X_TEXT ENDS X X ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP X_TEXT SEGMENT X X PUBLIC _alloca X X_alloca PROC NEAR X X;; Pop return address into edx and size into eax X pop edx X pop eax X X;; Make sure that eax is greater than zero, and is a multiple of four. X cmp eax,0 X jg short pos X mov eax,4 Xpos: X add eax,3 X and eax,not 3 X X;; Remember old stack pointer X mov ecx,esp X X;; Figure new stack pointer, our return value. X sub esp,eax X mov eax,esp X X;; Copy the (hypothetical) register variables. X push [ecx+8] X push [ecx+4] X push [ecx+0] X X;; Put something on the stack so that our caller can pop it off. X push eax X X;; Return to the the caller. X jmp edx X X_alloca ENDP X X_TEXT ENDS X X END END_OF_FILE if test 1075 -ne `wc -c <'alloca.s'`; then echo shar: \"'alloca.s'\" unpacked with wrong size! fi # end of 'alloca.s' fi echo shar: End of shell archive. exit 0 -- Chip Salzenberg <chip@ateng.com> or <uunet!ateng!chip> A T Engineering Me? Speak for my company? Surely you jest! "It's no good. They're tapping the lines."