The MASM Forum

Projects => Poasm => Topic started by: Vortex on January 15, 2018, 05:01:21 AM

Title: Stack allocation function derived from chkstk
Post by: Vortex on January 15, 2018, 05:01:21 AM
_chkstk.asm extracted from \PellesC\lib\crt.lib :

.386
.model flat
option casemap:none

PAGE_SIZE equ 4096

.code

__chkstk PROC

    push    ecx
    cmp     eax,PAGE_SIZE
    lea     ecx,[esp+8H]
    jb      last_page

probe_stack:

    sub     ecx,PAGE_SIZE
    sub     eax,PAGE_SIZE
    test    DWORD PTR [ecx],eax
    cmp     eax,PAGE_SIZE
    jae     probe_stack
   
last_page:

    sub     ecx,eax
    mov     eax,esp
    test    DWORD PTR [ecx],eax
    mov     esp,ecx
    mov     ecx,DWORD PTR [eax]
    mov     eax,DWORD PTR [eax+4]
    push    eax
    ret   

__chkstk ENDP

END


With some slight modifications, the function above is converted to allocmem allowing stack reservations exceeding 4096 bytes :

include     Demo.inc

.data

string  db '%s',13,10
        db 'Address of the string = %Xh',0

.code

start:

    call    main
    invoke  ExitProcess,0

main PROC

LOCAL pMem:DWORD

     invoke allocmem,8200

     mov    pMem,esp

     mov    DWORD PTR [esp],'sihT'
     mov    DWORD PTR [esp+4],' si '
     mov    DWORD PTR [esp+8],'et a'
     mov    DWORD PTR [esp+12],'.ts'

     invoke printf,ADDR string,pMem,esp

     ret

main ENDP


END start

Title: Re: Stack allocation function derived from chkstk
Post by: Vortex on November 03, 2018, 08:05:36 PM
Here is the 64-bit version of the chkstk function extracted from \PellesC\Lib\crt64.lib