63 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			63 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
 |