В свое время я написал набор макроопределений для работы со стеком. Опять же, ассемблер от IAR.
LSTOUT-
;
;************************************************
;* *
;* (c) Copyright Êíÿçåâ Â.À. 2004 *
;* *
;* Ìàêðîîïðåäåëåíèÿ äëÿ ðàáîòû ñî ñòåêîì *
;* *
;************************************************
;
; File: stack.inc
;
; 25-Apr-04 BK Íà÷àëüíàÿ ðåäàêöèÿ
; 28-Aug-11 BK Ïîñëåäíåå èçìåíåíèå
;
; Îïèñàíèå:
; Äàííûå ìàêðîîïðåäåëåíèÿ ïîçâîëÿþò óïðîñòèòü ñîçäàíèå
; êîäîâ ïðîãðàìì ñ ïåðåìåííûìè, ðàñïîëîæåííûìè â ñòåêå.
; Ïðè ýòîì ïðåäïîëàãàåòñÿ, ÷òî ñòåêîâàÿ ïàìÿòü îðãàíèçîâàíà
; â ñîîòâåòñòâèè ñ ñîãëàøåíèÿìè, ïðèíÿòûìè â êîìïèëÿòîðå Ñè
; ôèðìû IAR Systems äëÿ ñåìåéñòâà ìèêðîêîíòðîëëåðîâ AVR, è
; â êà÷åñòâå óêàçàòåëÿ ñòåêîâîé ïàìÿòè èñïîëüçóåòñÿ Y-ðåãèñòð.
;
; Ïåðåìåííàÿ STACK$ â ìàêðîîïðåäåëåíèÿõ èñïîëüçóåòñÿ äëÿ
; îòñëåæèâàíèÿ òåêóùåãî óðîâíÿ ñòåêà.
; Â òåõ ìàêðîêîìàíäàõ, ãäå îäíèì èç àðãóìåíòîâ ÿâëÿåòñÿ ñïèñîê ðåãèñòðîâ,
; ïîñëåäíèé çàêëþ÷àåòñÿ â ñêîáêè â ñîîòâåòñòâèè ñ ïðàâèëàìè,
; ïðèíÿòûìè â ÿçûêå àññåìáëåðà. Ïî óìîë÷àíèþ èñïîëüçóþòñÿ ñêîáêè <>.
; Ýëåìåíòû ñïèñêà ðàçäåëÿþòñÿ ñèìâîëîì çàïÿòîé. Åñëè ñïèñîê
; ðåãèñòðîâ ñîñòîèò èç îäíîãî ýëåìåíòà, ñêîáêè ìîæíî îïóñòèòü.
;
; Ïðåäóïðåæäåíèÿ:
; 1. Õîòÿ ðàçìåð ðåçåðâèðóåìîé îáëàñòè äëÿ ñòåêà ïðàêòè÷åñêè íå îãðàíè÷åí,
; êîððåêòíûé äîñòóï ê ñòåêó ñ èñïîëüçîâàíèåì äàíûõ ìàêðîêîìàíä âîçìîæåí
; ÒÎËÜÊÎ Â ÏÐÅÄÅËÀÕ 64 ÁÀÉÒ, ñ÷èòàÿ îò âåðøèíû ñòåêà;
; 2. Ïîðÿäîê äîñòóïà ê ýëåìåíòàì ñòåêà îïðåäåëÿåòñÿ ïîðÿäêîì ðàçìåùåíèÿ
; àðãóìåíòîâ â ñïèñêå, êîòîðûé ÏÎËÍÎÑÒÜÞ ÎÏÐÅÄÅËßÅÒÑß ÏÐÎÃÐÀÌÌÈÑÒÎÌ.
; Áóäüòå âíèìàòåëüíû!
;
;
; ** STK$ALC -- Allocate stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà ïðîèçâîäèò âûäåëåíèå íåîáõîäèìîé ñòåêîé ïàìÿòè.
; Ïîñêîëüêó äàííàÿ ìàêðîêîìàíäà óñòàíàâëèâàåò íà÷àëüíîå çíà÷åíèå
; òåêóùåãî óðîâíÿ ñòåêà, îíà ÄÎËÆÍÀ ÂÛÏÎËÍßÒÜÑß ÏÅÐÂÎÉ íåçàâèñèìî
; îò òîãî, òðåáóåòñÿ ëè ôàêòè÷åñêîå âûäåëåíèå ñòåêà â äàííûé ìîìåíò
; èëè íåò.
;
; Usage: STK$ALC value
;
STK$ALC macro value ; Stack allocation
STACK$ var value ; Òåêóùèé óðîâåíü ñòåêà
if STACK$ == 0 ; Ñòåêîâàÿ îáëàñòü íå òðåáóåòñÿ,
exitm ; òî âûõîä
endif ;
;
; Âûäåëèòü ñòåê
;
if STACK$ < 64 ; One instruction is needed
sbiw r29:r28, STACK$
else ; Two instructions are used
subi r28, LOW(STACK$)
sbci r29, HIGH(STACK$)
endif
endm ; STK$ALC
;
; ** STK$RLS -- release stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà îñâîáîæäàåò ðàíåå âûäåëåííóþ ñòåêîâóþ ïàìÿòü.
; Ýòà ìàêðîêîìàíäà ÄÎËÆÍÀ ÂÛÏÎËÍßÒÜÑß ÏÎÑËÅÄÍÅÉ, ÷òîáû ãàðàíòèðîâàòü
; êîððåêòíîå çàâåðøåíèå ðàáîòû ñî ñòåêîì.
;
; Usage: STK$RLS
;
STK$RLS macro ; Stack release
if STACK$ == 0 ; Ñòåê ïóñò,
exitm ; òî âûõîä
endif ;
;
; Îñâîáîäèòü ñòåê
;
if STACK$ < 64 ; One instruction is needed
adiw r29:r28, STACK$
else ; Two instructions are used
subi r28, LOW(-STACK$)
sbci r29, HIGH(-STACK$)
endif
STACK$ var 0 ; Clear stack level
endm ; STK$RLS
;
; ** STK$PUSH -- push on stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà ïîî÷åðåäíî çàòàëêèâàåò â ñòåê ðåãèñòðû èç ñïèñêà
; àðãóìåíòîâ.
; Äàííàÿ ìàêðîêîìàíäà ÈÇÌÅÍßÅÒ çíà÷åíèå óêàçàòåëÿ òåêóùãî óðîâíÿ ñòåêà.
;
; Usage: STK$PUSH <register list>
;
STK$PUSH macro list ; Push register(s) on stack
repti rg, list
STACK$ var STACK$+1
st -Y, rg
endr
endm ; STK$PUSH
;
; ** STK$POP -- pop off stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà ïîî÷åðåäíî âûòàëêèâàåò èç ñòåêà ðåãèñòðû èç ñïèñêà
; àðãóìåíòîâ.
; Äàííàÿ ìàêðîêîìàíäà ÈÇÌÅÍßÅÒ çíà÷åíèå óêàçàòåëÿ òåêóùãî óðîâíÿ ñòåêà.
;
; Usage: STK$POP <register list>
;
STK$POP macro list ; Pop register(s) off stack
repti rg, list
STACK$ var STACK$-1
ld rg, Y+
endr
endm ; STK$POP
;
; ** STK$GET -- read from stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà ïîñëåäîâàòåëüíî çàïèñûâàåò äàííûå èç îáëàñòè ñòåêà
; ñ íà÷àëüíûì ñìåùåíèåì offset â ðåãèñòðû èç ñïèñêà àðãóìåíòîâ.
; Äàííàÿ ìàêðîêîìàíäà ÍÅ ÈÇÌÅÍßÅÒ çíà÷åíèå óêàçàòåëÿ òåêóùãî óðîâíÿ ñòåêà.
;
; Usage: STK$GET offset, <register list>
;
STK$GET macro offset, list ; Read from stack
temp$ var STACK$ - offset
repti rg, list
ldd rg, Y+temp$
temp$ var temp$ + 1
endr
endm ; STK$GET
;
; ** STK$PUT -- write to stack
;
; Îïèñàíèå:
; Ìàêðîêîìàíäà ïîñëåäîâàòåëüíî çàïèñûâàåò äàííûå â îáëàñòü ñòåêà
; ñ íà÷àëüíûì ñìåùåíèåì offset èç ðåãèñòðîâ èç ñïèñêà àðãóìåíòîâ.
; Äàííàÿ ìàêðîêîìàíäà ÍÅ ÈÇÌÅÍßÅÒ çíà÷åíèå óêàçàòåëÿ òåêóùãî óðîâíÿ ñòåêà.
;
; Usage: STK$PUT offset, <register list>
;
STK$PUT macro offset, list ; Write to stack
temp$ var STACK$-offset
repti rg, list
std Y+temp$, rg
temp$ var temp$ + 1
endr
endm ; STK$PUT
LSTOUT+
Что-то комментарии кириллицей никак не получаются.
-
- Небольшая правка реестра легко исправляет вашу проблему. rezident(125 знак., 28.08.2011 21:50, ссылка)
- СПАСИБО!!! - Bill(28.08.2011 22:06)
- Вот так rezident(4634 знак., 28.08.2011 21:35 - 21:39)
- Небольшая правка реестра легко исправляет вашу проблему. rezident(125 знак., 28.08.2011 21:50, ссылка)