| Line |   | 
|---|
| 1 | #
 | 
|---|
| 2 | !       alloca() - allocate space on the stack          Author: Kees J. Bot
 | 
|---|
| 3 | !                                                               2 Dec 1993
 | 
|---|
| 4 | .sect .text; .sect .rom; .sect .data; .sect .bss
 | 
|---|
| 5 | 
 | 
|---|
| 6 | .sect .text
 | 
|---|
| 7 |         .align  16
 | 
|---|
| 8 | .define _alloca
 | 
|---|
| 9 | _alloca:
 | 
|---|
| 10 | #if __ACK__
 | 
|---|
| 11 |         pop     ecx             ! Return address
 | 
|---|
| 12 |         pop     eax             ! Bytes to allocate
 | 
|---|
| 13 |         add     eax, 2*4+3      ! Add space for two saved register variables
 | 
|---|
| 14 |         andb    al, 0xFC        ! Align
 | 
|---|
| 15 |         mov     ebx, esp        ! Keep current esp
 | 
|---|
| 16 |         sub     esp, eax        ! Lower stack
 | 
|---|
| 17 |         mov     eax, esp        ! Return value
 | 
|---|
| 18 |         push    4(ebx)          ! Push what is probably the saved esi
 | 
|---|
| 19 |         push    (ebx)           ! Saved edi
 | 
|---|
| 20 |                                 ! Now ACK can still do:
 | 
|---|
| 21 |                                 !       pop edi; pop esi; leave; ret
 | 
|---|
| 22 |         push    eax             ! Dummy argument
 | 
|---|
| 23 |         jmp     ecx
 | 
|---|
| 24 | #else
 | 
|---|
| 25 |         pop     ecx             ! Return address
 | 
|---|
| 26 |         pop     eax             ! Bytes to allocate
 | 
|---|
| 27 |         add     eax, 3
 | 
|---|
| 28 |         andb    al, 0xFC        ! Align
 | 
|---|
| 29 |         sub     esp, eax        ! Lower stack
 | 
|---|
| 30 |         mov     eax, esp        ! Return value
 | 
|---|
| 31 |         push    eax             ! Dummy argument
 | 
|---|
| 32 |         jmp     ecx
 | 
|---|
| 33 | #endif
 | 
|---|
       
      
  Note:
 See   
TracBrowser
 for help on using the repository browser.