ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
269293 Топик полностью
Bill (28.08.2011 20:54 - 21:19, просмотров: 255) ответил ReAl на Если эти переменные используются в рамках одной функции, то их можно завести на стеке. Так и делает большинство С-компиляторов. По-другому (статическое дерево «скомпилированного стека» aka «оверлеев данных») делают только тогда, когда стек
В свое время я написал набор макроопределений для работы со стеком. Опять же, ассемблер от 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+ Что-то комментарии кириллицей никак не получаются.