News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests

Main Menu

Stack allocation function derived from chkstk

Started by Vortex, January 15, 2018, 05:01:21 AM

Previous topic - Next topic

Vortex

_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


Vortex

Here is the 64-bit version of the chkstk function extracted from \PellesC\Lib\crt64.lib