Ответ: Я определяю на практике... Включаю в проект нижепреведенный исходник. _InitStacks вызывается в самом начале для обнуления памяти в стеках возврата и данных.
_CalcculateRStack и _CalcculateCStack вызываются из любого места для определения размера неиспользованной (обнуленной) области.
PUBLIC _InitStacks
PUBLIC _CalcculateRStack
PUBLIC _CalcculateCStack
; Forward declarations of segments used in initialization
RSEG CSTACK:DATA:NOROOT(0)
RSEG RSTACK:DATA:NOROOT(0)
RSEG CODE
_InitStacks:
LDI R18,0
LDI R26,LOW(SFB(RSTACK))
LDI R27,HIGH(SFB(RSTACK))
LDI R24,LOW((SIZEOF RSTACK)-10)
LDI R25,HIGH((SIZEOF RSTACK)-10)
; CLI
RCALL _FillStackArea
LDI R26,LOW(SFB(CSTACK))
LDI R27,HIGH(SFB(CSTACK))
LDI R24,LOW(SIZEOF CSTACK)
LDI R25,HIGH(SIZEOF CSTACK)
RCALL _FillStackArea
; SEI
RET
_FillStackArea:
ST X+,R18
SBIW R24,1
BRNE _FillStackArea
RET
_CalcculateRStack:
PUSH R18
PUSH R24
PUSH R25
PUSH R26
PUSH R27
LDI R26,LOW(SFB(RSTACK))
LDI R27,HIGH(SFB(RSTACK))
RJMP calcspace
_CalcculateCStack:
PUSH R18
PUSH R24
PUSH R25
PUSH R26
PUSH R27
LDI R26,LOW(SFB(CSTACK))
LDI R27,HIGH(SFB(CSTACK))
calcspace:
LDI R24,0xFF
LDI R25,0xFF
loop: ADIW R24,1
LD R18,X+
CPI R18,0
BREQ loop
MOVW R16,R24
POP R27
POP R26
POP R25
POP R24
POP R18
RET
END