0000030A : 00
0000030B : 62 <——— ïðåäñòàâëåíèå '(R2)'
R2 = 00001000
R15 = 00000305
(00000010) = 00
(00001000) = FF (R2)
Ïîñëå...
R2 = 00001000
R15 = 00000309
(00000010) = 00
(00001000) = 00 <——— 0
Åñòü îïðåäåëåííûé êëàññ ïðîãðàìì, êîòîðûå íàçûâàþòñÿ ïîçèöèîííî-íåçàâèñèìûìè. Îíè ìîãóò áûòü çàãðóæåíû è çàïóùåíû â ëþáîé îáëàñòè ïàìÿòè áåç ïåðåòðàíñëÿöèè, ïåðåëèíêîâêè èëè ìîäèôèêàöèè àäðåñîâ îïåðàíäîâ. Ïðè ïåðåìåùåíèè â ïàìÿòè ïðîãðàììû, èñïîëüçóþùåé êîñâåííî-ðåãèñòðîâûé ðåæèì àäðåñàöèè àäðåñ àäðåñóåìîé ÿ÷åéêè íå èçìåíÿåòñÿ. Åñëè äàííûå â ïàìÿòè ïåðåìåùàþòñÿ âìåñòå ñ ïðîãðàììîé, êàê ýòî ÷àùå âñåãî áûâàåò, òî àäðåñîâàòüñÿ áóäóò ñîâñåì íå òå äàííûå, êîòîðûå äîëæíû áû. ×òî äåëàòü â òàêèõ ñëó÷àÿõ ? Ðàññìîòðèì êàê èñïîëüçîâàòü ñ÷åò÷èê èíñòðóêöèé â ðåæèìå ñî ñìåùåíèåì. Ñîäåðæèìîå ðåãèñòðà ñ÷åò÷èêà èíñòðóêöèé ñêëàäûâàåòñÿ ñî ñìåùåíèåì, êîòîðîå ðàñïîëîæåíî íåïîñðåäñòâåííî â ïîòîêå èíñòðóêöèé. Ïîëó÷åííàÿ ñóììà ÿâëÿåòñÿ àäðåñîì îïåðàíäà. Î÷åâèäíî, ÷òî â ýòîì ñëó÷àå äàííûå áóäóò àäðåñîâàòüñÿ ïðàâèëüíî, òàê êàê åñëè ïîäîáðàòü ñìåùåíèå ðàâíîå ðàçíèöå ìåæäó àäðåñîì îïåðàíäà è àäðåñîì òåêóùåé êîìàíäû, òî ýòà ðàçíîñòü âñåãäà áóäåò ïîñòîÿííîé. Ýòîò ðåæèì àäðåñàöèè íàçûâàåòñÿ îòíîñèòåëüíûì è íà àññåìáëåðå çàïèñûâàåòñÿ ïðîñòî êàê Addr, ãäå Addr - àäðåñ îïåðàíäà. Ðàññìîòðèì âûïîëíåíèå èíñòðóêöèè MOVB 10,(R2)
Äî îïåðàöèè MOVB 10,(R2)
00000305 : 90 ÊÎÏ
00000306 : CF <——— ïðåäñòàâëåíèå '@(R15)'
00000307 : 07 îòðèöàòåëüíîå ñìåùåíèå (309-10),
00000308 : FD ïðåäñòàâëåííîå â äîï. êîäå
00000309 : 62 <——— ïðåäñòàâëåíèå '(R2)'
R2 = 00001000
R15 = 00000305
(00000010) = 00
(00001000) = FF (R2)
Ïîñëå...
R2 = 00001000
R15 = 0000030A <——— + 5
(00000010) = 00
(00001000) = 00 <——— 0
Îòìåòèì, ÷òî ñìåùåíèå â äàííîì ïðèìåðå îòðèöàòåëüíîå è ïðåäñòàâëåíî â äîïîëíèòåëüíîì êîäå. Äëèíà ñìåùåíèÿ è ñîîòâåòñòâóþùèé êîíêðåòíûé êîä ðåæèìà âû÷èñëÿåòñÿ àâòîìàòè÷åñêè íà ýòàïå êîìïèëèðîâàíèÿ. Åñëè èñïîëüçîâàòü ñ÷åò÷èê èíñòðóêöèé â êîñâåííîì ðåæèìå ñî ñìåùåíèåì, òî ïîëó÷èì åùå îäèí ñïîñîá àäðåñàöèè, êîòîðûé íàçûâàåòñÿ êîñâåííî-îòíîñèòåëüíûì. Çäåñü ñóììà ñîäåðæèìîãî ñ÷åò÷èêà èíñòðóêöèé ñêëàäûâàåòñÿ ñî ñìåùåíèåì è ðàññìàòðèâàåòñÿ êàê àäðåñ àäðåñà îïåðàíäà. Äëÿ ïðîãðàììèñòà ýòîò ðåæèì ÿâëÿåòñÿ ïðîñòî ðåæèìîì êîñâåííîé àäðåñàöèè ñ èñïîëüçîâàíèåì ïðîèçâîëüíîé ÿ÷åéêè äëÿ õðàíåíèÿ àäðåñà. Êàê è â ïðåäûäóùåì ïðèìåðå ñìåùåíèå äîëæíî áûòü ðàâíî ðàçíèöå ìåæäó àäðåñîì äàííîé ÿ÷åéêè è òåêóùèì ïîëîæåíèåì èíñòðóêöèè. Íà àññåìáëåðå ýòîò ðåæèì îáîçíà÷àåòñÿ @Addr, ãäå Addr - àäðåñ ÿ÷åéêè, â êîòîðîé íàõîäèòñÿ àäðåñ îïåðàíäà. Ðàññìîòðèì èíñòðóêöèþ MOVB @10,(R2):
Äî îïåðàöèè MOVB @10,(R2)
00000305 : 90 ÊÎÏ
00000306 : CC <——— ïðåäñòàâëåíèå '@W^FD7(R15)'
00000307 : 07 îòðèöàòåëüíîå ñìåùåíèå (309-10),
00000308 : FD ïðåäñòàâëåííîå â äîï. êîäå
00000309 : 62 <——— ïðåäñòàâëåíèå '(R2)'
R2 = 00001000
R15 = 00000305
(00000000) = EE (00000010)
(00000010) = 00
(00001000) = FF (R2)
Ïîñëå...
R2 = 00001000
R15 = 0000030A <—— + 5
(00000000) = EE
(00000010) = 00
(00001000) = EE <—— EE
2.11 ÀÄÐÅÑÀÖÈß ÏÅÐÅÕÎÄÎÂ.
Ïîñëåäíèé ñïîñîá àäðåñàöèè, êîòîðûé áóäåò ðàññìîòðåí - ýòî àäðåñàöèÿ ïåðåõîäîâ. Âîò ôîðìàò èíñòðóêöèè óñëîâíîãî ïåðåõîäà:
7 0
ÊÎÄ ÎÏÅÐÀÖÈÈ
ÑÌÅÙÅÍÈÅ
Àäðåñàöèÿ â ýòèõ èíñòðóêöèÿõ îòëè÷àåòñÿ îò âñåõ ðàññìàòðèâàåìûõ òåì, ÷òî çäåñü íåò ñïåöèôèêàòîðà îïåðàíäà. Êàæäàÿ èíñòðóêöèÿ óñëîâíîãî ïåðåõîäà ñîñòîèò èç êîäà îïåðàöèè è ñëåäóþùåãî çà íèì áàéòíîãî ñìåùåíèÿ ñî çíàêîì. Ïðè ôîðìèðîâàíèè àäðåñà ïåðåõîäà ñìåùåíèå ñêëàäûâàåòñÿ ñ ñîäåðæèìûì ñ÷åò÷èêà èíñòðóêöèé ïîäîáíî òîìó, êàê ýòî äåëàëîñü ïðè îòíîñèòåëüíîé àäðåñàöèè. Ïî÷åìó âñåãî 128 áàéò ? Ýòî îáóñëîâëåíî òåì, ÷òî áîëüøèíñòâî ïåðåõîäîâ àäðåñîâàíû ê ÿ÷åéêàì, íàõîäÿùèìñÿ íà íåáîëüøîì ðàññòîÿíèè îò ñàìîé èíñòðóêöèè ïåðåõîäà. Ëèøü â íåêîòîðûõ ñëó÷àÿõ òðåáóåòñÿ èñïîëüçîâàíèå áîëåå ýôôåêòèâíûõ ðåæèìîâ àäðåñàöèè.