mirror of https://github.com/n-hys/bash.git
64 lines
1.7 KiB
ArmAsm
64 lines
1.7 KiB
ArmAsm
;; alloca386.s 1.2
|
|
;; GNU-compatible stack allocation function for Xenix/386.
|
|
;; Written by Chip Salzenberg at ComDev.
|
|
;; Last modified 90/01/11
|
|
;;> Is your alloca clearly better than the one in i386-alloca.s? I haven't
|
|
;;> looked at either.
|
|
;;
|
|
;;They're different because Xenix/386 has a different assembler. SCO
|
|
;;Xenix has the Microsoft C compiler and the Microsoft macro assembler,
|
|
;;called "masm". MASM's assembler syntax is quite different from AT&T's
|
|
;;in all sorts of ways. Xenix people can't use the AT&T version.
|
|
;;--
|
|
;;Chip Salzenberg at ComDev/TCT <chip@tct.uucp>, <uunet!ateng!tct!chip>
|
|
|
|
TITLE $alloca386
|
|
|
|
.386
|
|
DGROUP GROUP CONST, _BSS, _DATA
|
|
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
|
|
_DATA ENDS
|
|
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
|
|
_BSS ENDS
|
|
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
|
|
CONST ENDS
|
|
_TEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
|
|
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
|
|
|
|
PUBLIC _alloca
|
|
_alloca PROC NEAR
|
|
|
|
; Get argument.
|
|
pop edx ; edx -> return address
|
|
pop eax ; eax = amount to allocate
|
|
|
|
; Validate allocation amount.
|
|
add eax,3
|
|
and eax,not 3
|
|
cmp eax,0
|
|
jg aa_size_ok
|
|
mov eax,4
|
|
aa_size_ok:
|
|
|
|
; Allocate stack space.
|
|
mov ecx,esp ; ecx -> old stack pointer
|
|
sub esp,eax ; perform allocation
|
|
mov eax,esp ; eax -> new stack pointer
|
|
|
|
; Copy the three saved register variables from old stack top to new stack top.
|
|
; They may not be there. So we waste twelve bytes. Big fat hairy deal.
|
|
push DWORD PTR 8[ecx]
|
|
push DWORD PTR 4[ecx]
|
|
push DWORD PTR 0[ecx]
|
|
|
|
; Push something so the caller can pop it off.
|
|
push eax
|
|
|
|
; Return to caller.
|
|
jmp edx
|
|
|
|
_alloca ENDP
|
|
|
|
_TEXT ENDS
|
|
END
|