小規模の厳密に絞り込まれたアプリケーションに最適ですが、ハードウェアスタックは、深くネストしたサブルーチン(またはスタック上の少数の作業レジスタよりも数多く保存と復元を行うサブルーチン)が大規模なアセンブリアプリケーションで使用された場合、たちまちスペース不足になります。Cプログラミング言語(IARのEmbedded Workbench®などのコンパイラを使用)で記述されたアプリケーションまたはRowley Associates社のCrossworks for MAXQは、データメモリに含まれる「ソフトスタック」を利用することによって、この問題を回避します(これらの開発ツールの詳細については、開発ツールをご覧ください)。このソフトスタックは、サブルーチンのコール/リターンアドレスやローカル作業変数を格納します。しかし、MAXQ20コアには、アセンブリ専用アプリケーションで使用可能なデータメモリ内のスタックの場所を見つけるための内部機構がありません。
SS_BASE equ 0100h
ss_init:
move DPC, #1Ch ; Set all pointers to word mode
move BP, #SS_BASE ; Set base pointer to stack base location
move Offs, #0 ; Set stack to start
ret
mpush A[0] ; Save the value of the A[0] register
mpush A[1] ; Save A[1]
mpush A[2] ; Save A[2]
... ; code which destroys A[0]-A[2]
mpop A[2] ; Restore the value of A[2] (pop in reverse order)
mpop A[1] ; Restore A[1]
mpop A[0] ; Restore A[0]
SS_BASE equ 0000h
SS_TOP equ 01FFh
ss_init:
move DPC, #1Ch ; Set all data pointers to word mode
move DP[0], #SS_BASE ; Set pointer to stack base location
ret
mpush MACRO Reg
call ss_check_over ; Check for possible overflow
move @++DP[0], Reg ; Push value to soft stack
endm
mpop MACRO Reg
call ss_check_under ; Check for possible underflow
move Reg, @DP[0]-- ; Pop value from soft stack
endm
mcall MACRO Addr
LOCAL return
call ss_check_over ; Check for possible overflow
move @++DP[0], #return ; Push return destination to soft stack
jump Addr
return:
endm
mret MACRO
call ss_check_under ; Check for possible underflow
jump @DP[0]-- ; Jump to popped destination from soft stack
endm
ss_check_under:
push A[0]
push AP
push APC
push PSF
move APC, #80h ; Set Acc to A[0], standard mode, no auto inc/dec
move Acc, DP[0] ; Get current value of stack pointer
cmp #SS_BASE
jump NE, ss_check_under_ok
nop ; < Error handler should be implemented here >
ss_check_under_ok:
pop PSF
pop APC
pop AP
pop A[0]
ret
ss_check_over:
push A[0]
push AP
push APC
push PSF
move APC, #80h ; Set Acc to A[0], standard mode, no auto inc/dec
move Acc, DP[0] ; Get current value of stack pointer
cmp #SS_TOP
jump NE, ss_check_over_ok
nop ; < Error handler should be implemented here >
ss_check_over_ok:
pop PSF
pop APC
pop AP
pop A[0]
ret
上記のコードによって、プッシュまたはポップ(あるいはcallまたはret)操作が発生する前に、現在のスタック位置がチェックされます。オーバフローまたはアンダフローエラーが検出された場合、応答はアプリケーションごとに異なります。通常、この種のエラーは、アプリケーション開発時にのみ発生するものです。コードが正しく記述されている場合は発生しないはずです。エラーが発生した場合、ハードウェアスタックの使用中にアンダフロー/オーバフローが発生した場合と同様に、致命的なエラーと見なされるのが普通です。このエラーに対して可能な応答には、エラーメッセージの停止と送信、またはLEDの点灯が含まれます。開発時に役立つ巧妙な方法は、アンダフローまたはオーバフローが発生した場合に即座にフィードバックを可能にするために、MAX-IDEで、これらの2つの各ルーチン内部にブレークポイント(「Error handler should be implemented here」行など)を設定することです。