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:
êîïèðîâàíèå
àðèôìåòè÷åñêèå
ëîãè÷åñêèå
ñðàâíåíèÿ
âåòâëåíèÿ
çàãðóçêè
âûãðóçêè
îáìåí
ïðîãðàììíîå ïðåðûâàíèå
òî÷êà ïðåðûâàíèÿ
Ïðèìåðû êîìàíä:
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]