Ñïåöêóðñ «Ñèñòåìíîå ïðîãðàììèðîâàíèå»
Ëåêöèÿ 3. 12.10.2021



Cortex-R4 and Cortex-R4F Technical Reference Manual – Arm:

https://documentation-service.arm.com/static/5e8e1efa88295d1e18d36cd8?token=



Ôîðìàò ïðåäñòàâëåíèÿ èíñòðóêöèé:








ARM Instruction Set Quick Reference Card:

https://www.cl.cam.ac.uk/teaching/2004/ECADArch/datasheets/arm_quick.pdf

Òèïû èíñòðóêöèé ARM:

  1. êîïèðîâàíèå

  2. àðèôìåòè÷åñêèå

  3. ëîãè÷åñêèå

  4. ñðàâíåíèÿ

  5. âåòâëåíèÿ

  6. çàãðóçêè

  7. âûãðóçêè

  8. îáìåí

  9. ïðîãðàììíîå ïðåðûâàíèå

  10. òî÷êà ïðåðûâàíèÿ



Ïðèìåðû êîìàíä:
MOV R1, #255 – ïîëîæèòü ÷èñëî 255 â ðåãèñòð R1

MOVZ R0, R1 – ñêîïèðîâàòü ñîäåðæèìîå ðåãèñòðà R1 â ðåãèñòð R0 â òîì ñëó÷àå, åñëè çíà÷åíèå áèòà Z â ñëîâå ñîñòîÿíèÿ ïðîöåññîðà ðàâíî 1 (òî åñòü ðåçóëüòàò ïðåäûäóùåé êîìàíäû — 0, åñëè ýòî àðèôìåòè÷åñêàÿ îïåðàöèÿ èëè êîïèðîâàíèå, èëè â ñëó÷àå îïåðàöèè ñðàâíåíèÿ — åñëè îïåðàíäû ðàâíû).



Ïðèìåð èñïîëüçîâàíèÿ êîäà ’S’:

MOV R2, #7 → R2 := 7

CMP R2, #7 → Z := 1

MOVZ R0, #3 – áèòû NZVC – áóäóò îáíîâëÿòüñÿ? Íåò, òàê êàê êîä ’S’ îòñóòñòâóåò.

MOVZ R1, #2 - --”--”--”--”--

MOVZS R2, #1 – áèòû NZVC îáíîâÿòñÿ. Z, íàïðèìåð, ñòàíåò 0



Êîìàíäû MRS è MSR – íóæíû, ÷òîáû óçíàâàòü èëè ìåíÿòü çíà÷åíèÿ áèòîâ â ñëîâå ñîñòîÿíèÿ ïðîöåññîðà

MRS R0, CPSR

MOV R1, #1

LSL R1, #7

TST R0, R1 → áèò Z := 1, åñëè áèò 7 â R0 ðàâåí 0, è Z := 0, åñëè áèò 7 â R0 ðàâåí 1 (ò.å.êîãäà ïðåðûâàíèÿ IRQ çàïðåùåíû)

TST, êàê è AND – ëîãè÷åñêîå ïîáèòîâîå È.  ðåçóëüòàòå (êîòîðûé ó TST íèêóäà íå çàïèñûâàåòñÿ) çíà÷åíèå êàæäîãî áèòà áóäåò ðåçóëüòàòîì ëîãè÷åñêîãî È íàä ñîîòâåòñòâóþùèìè áèòàìè â îïåðàíäàõ.

R0 – 11110000...111111110

R1 – 0000000...0010000000

----

AND(TST) – 00000000...000010000000 – áèò 7 â ðåçóëüòàòå TST (AND) âñåãäà áóäåò ðàâåí çíà÷åíèþ áèòà 7 â R0



AND

0

1

0

0

0

1

0

1



Çàïðåòèòü ïðåðûâàíèå ìîæíî íå âî âñåõ ðåæèìàõ. Íàïðèìåð, â ïîëüçîâàòåëüñêîì ðåæèìå ïðè çàïèñè â ðåãèñòð CPSR çàïèøóòñÿ òîëüêî áèòû NZVC.

Ïðèìåð çàïðåùåíèÿ ïðåðûâàíèé IRQ:

MRS R0, CPSR

MOV R1, #1

LSL R1, #7

ORR R0, R0, R1 – çàïèñûâàåò 1 â áèò 7 â ðåøèñòðå R0

MSR CPSR, R0 – çàïèñûâàåò ñîäåðæèìîå ðåãèñòðà R0 â ñëîâî ñîñòîÿíèÿ ïðîöåññîðàõ

-----------------------------------------------

Èíñòðóêöèè ïåðåõîäà (âåòâëåíèÿ).

Ïðèìåð: ïðè çàãðóçêå BIOS’à, åñëè ïðîèñõîäèò íåïîïðàâèìàÿ îøèáêà, òî åå íàäî îáðàáîòàòü.

Ðàçðàáîò÷èê BIOS’à äîëæåí ñóìåòü ïîíÿòü, ÷òî ïðîèçîøëà îøèáêà.

Äëÿ ýòîãî èñïîëüçóþòñÿ êîìàíäû ïåðåõîäà.

ARRD:

B ADDR – êîìàíäà çàöèêëèâàíèÿ, âñå âðåìÿ áóäåò âûïîëíÿòüñÿ ýòà èíñòðóêöèÿ (ïåðåõîä íà ñàìó ñåáÿ)

Åñëè ðàçðàáîò÷èê çàïîäîçðèë, ÷òî BIOS ãðóçèòñÿ ñëèøêîì äîëãî, òî îí ïîäêëþ÷àåòñÿ îòëàä÷èêîì ê æåëåçêå è îáíàðóæèâàåò, ÷òî BIOS ïîïàë â ñîñòîÿíèå DeadLoop (ñìåðòåëüíûé öèêë) (deadbeef – ìàãè÷åñêîå ÷èñëî, ïðîïèñûâàåìîå â ïàìÿòü, ÷òîáû îòñëåäèòü íåñàíêöèîíèðîâàííóþ çàïèñü). malloc() - âûäåëåííàÿ ïàìÿòü îêðóæàåòñÿ îáëàñòüþ, â êîòîðóþ ïðîïèñûâàþòñÿ ìàãè÷åñêèå ÷èñëà.



Èíñòðóêöèè çàãðóçêè è âûãðóçêè îïåðèðóþò îòíîñèòåëüíûìè àäðåñàìè (îòíîñèòåëüíî òåêóùåé èíñòðóêöèè).

ADDR1:

.word 1234567

…...

LDR R0, ADDR1 – çàãðóçèòü â R0 ñîäåðæèìîå ïàìÿòè ïî àäðåñó ADDR1 (÷èñëî 1234567). Áóäåò âû÷èñëåíî ñìåùåíèå ADDR1 îòíîñèòåëüíî òåêóùåé èíñòðóêöèè è ýòî ÷èñëî ïîäñòàâëåíî âìåñòî ADDR1. Åñëè ñìåùåíèå ñëèøêîì áîëüøîå, òî âîçíèêíåò îøèáêà êîìïèëÿöèè (òàê êàê ìàêñèìàëüíîå immediate value ìîæåò çàíèìàòü íå áîëüøå 12 áèòîâ).

Äðóãîé âàðèàíò:

LDR R1, ADDR1

LDR R0, [R1]