Programowanie mikroprocesorów jednoukładowych

Podobne dokumenty
Programowanie w asemblerze ARM: instrukcje

Programowanie mikroprocesorów jednoukładowych

Programowanie mikroprocesorów jednoukładowych

PROCESORY ARM TRUDNO ZNALEŹĆ PROCESORY O TAK LICZNYCH, ORYGINALNYCH, NOWYCH, POMYSŁOWYCH ROZWIĄZANIACH!

Programowanie w asemblerze ARM wprowadzenie

Mikroprocesory i mikrosterowniki

Mikroprocesory i Mikrosterowniki

Dariusz Makowski Katedra Mikroelektroniki i Technik Informatycznych tel

Podstawy Techniki Mikroprocesorowej

Politechnika Świętokrzyska

AGH Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

architektura komputerów w 1 1

Dariusz Makowski Katedra Mikroelektroniki i Technik Informatycznych tel

Rdzeń Mikroprocesorowy CORTEX M0+

Procesory rodziny x86. Dariusz Chaberski

Lista Rozkazów: Język komputera

Procesory osadzone ETD 7211 W

Architektura typu multi cycle

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Architektura typu Single-Cycle

MIKROPROCESORY I MIKROKONTROLERY INSTRUKCJE / KOMENDY / ROZKAZY: PRZEGLĄD I KILKA PRZYKŁADÓW DLA PRZYPOMNIENIA, GŁÓWNE REJESTRY ROBOCZE CPU:

Procesory osadzone ETD 7211 W

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

002 Opcode Strony projektu:

Struktura i działanie jednostki centralnej

Komputery klasy PC. Dariusz Chaberski

Procedury. int mult (int mcand, int mlier){ int product = 0; while (mlier > 0) { product = product + mcand; mlier = mlier -1; } return product; }

Budowa linii asemblera

Wstęp do informatyki. Architektura co to jest? Architektura Model komputera. Od układów logicznych do CPU. Automat skończony. Maszyny Turinga (1936)

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Zmiany techniczne wprowadzone w wersji Comarch ERP Altum

Programowanie mikroprocesorów jednoukładowych

Jak przenieść kod z ARM7 do Cortex-M3?

(Rysunek z książki T.Starecki. Mikokontrolery jednoukładowe rodziny 51. NOZOMI W-wa 1996)

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

LCD (Liquid Crystal Display)

Mikrokontrolery STR91x od podstaw, część 1

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Jednostka mnożąco-sumującą EMAC (Enhanced Multiply-ACcumulate unit)

Wstęp do programowania

Programowanie mikroprocesorów jednoukładowych

Programowanie w asemblerze Uwagi o ARM

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Programowanie Niskopoziomowe

Projektowanie. Projektowanie mikroprocesorów

Programowanie niskopoziomowe

WOJSKOWA AKADEMIA TECHNICZNA

Mikroprocesor RISC Power PC 603. Literatura: MPC603e & EC603e RISC Microprocessors User's Manual

Programowalne układy logiczne

Rozszerzalne kody operacji (przykład)

Systemy wbudowane. Przykłady kodu Assembler

List s a R ozkazó z w: w Ję J z ę y z k y k k o k mp o u mp t u er e a a ( cd c. d )

Architektura komputerów, Informatyka, sem.iii. Rozwiązywanie konfliktów danych i sterowania w architekturze potokowej

Programowanie w asemblerze MIPSa

Dariusz Makowski Katedra Mikroelektroniki i Technik Informatycznych tel dmakow@dmcs.pl

Procesory sygnałowe (Analog Devices)

IEEE Centronics

LABORATORIUM nr 1. Temat: Wstęp do mikrokontrolerów rodziny MCS-51

Materiały do wykładu. 4. Mikroprocesor. Marcin Peczarski. Instytut Informatyki Uniwersytet Warszawski

Dariusz Makowski Katedra Mikroelektroniki i Technik Informatycznych tel dmakow@dmcs.pl

PROGRAMOWANIE STRUKTUR CYFROWYCH. Konwencje dla asemblera KCPSM3. Simple IO. PicoBlaze - projekty. c Dr inż. Ignacy Pardyka. Rok akad.

Architektura potokowa RISC

Urządzenia peryferyjne RS-232. Wykład 2

Wstęp do Reverse engineeringu

Jednostka centralna. dr hab. inż. Krzysztof Patan, prof. PWSZ

Podstawy Techniki Mikroprocesorowej

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

RAM. MIKROPROCESOR wielki inwalida" MIKROKONTROLER - przykł. AVR

PLC2: Programowanie sterowników logicznych SIEMENS SIMATIC S7-300/400 - kurs zaawansowany

Architektura komputerów. Asembler procesorów rodziny x86

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH. Babbage i jego komputer mechaniczny. Ada programuje maszynę Babbage a. architektura. c Dr inż.

1. Struktura urządzeń z wykorzystaniem mikrokontrolerów...13

PX101A. Frezy do PLEXI/ Router bits for Plexi Acrylic ALU Z= str. 122

Architektura systemów komputerowych. Lista instrukcji procesora

MIKROKONTROLERY - ŁADOWANIE KODU

Documentation. Podstawy techniki mikroprocesorowej ETEW006 Architektura wybranych mikrokontrolerów. high performance based microcontroller (3/3)

Przetwarzanie instrukcji w mikroprocesorach

Helena Boguta, klasa 8W, rok szkolny 2018/2019

LISTA ROZKAZÓW i TRYBY ADRESOWANIA

Architektura mikroprocesorów z rdzeniem ColdFire

Plan wykładu. Architektura systemów komputerowych. Cezary Bolek. Składowe architektury komputera

Little / Big Endian Machines. Podstawy techniki mikroprocesorowej ETEW006. Przetwarzanie danych Typy procesorów. Algorytm.

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

Przetwarzanie potokowe pipelining

SQL 4 Structured Query Lenguage

Programowanie mikroprocesorów jednoukładowych

Technika mikroprocesorowa - laboratorium Informatyka studia dzienne

Procesory ARM w systemach wbudowanych

Camspot 4.4 Camspot 4.5

Programowanie komputera

Model programowy komputera I: format rozkazów, lista rozkazów, tryby adresowania, cykl rozkazowy, realizacja programu w komputerze.

Mikroinformatyka. Koprocesory arytmetyczne 8087, 80187, 80287, i387

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Shellcody a architektura MIPS na systemach IRIX. Adam Zabrocki.

Jerzy Nawrocki, Wprowadzenie do informatyki

Architektura mikroprocesorów z rdzeniem ColdFire

organizacja procesora 8086

Wybrane zagadnienia elektroniki współczesnej

Transkrypt:

Programowanie mikroprocesorów jednoukładowych Instrukcje procesora ARM Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 1 / 44

Instrukcje asmeblera Instrukcje obróbki danych Instrukcje koprocesora Instrukcje wczytywania i zapisu Rozszerzenia ARMv5E Plan I

Zestaw instrukcji procesora ARM I Mnemoniki ARM ISA Opis ADC v1 add two 32-bit values and carry ADD v1 add two 32-bit values AND v1 logical bitwise AND of two 32-bit values B v1 branch relative +/ 32 MB BIC v1 logical bit clear (AND NOT) of two 32-bit values BKPT v5 breakpoint instructions BL v1 relative branch with link BLX v5 branch with link and exchange BX v4t branch with exchange CDP CDP2 v2 v5 coprocessor data processing operation CLZ v5 count leading zeros CMN v1 compare negative two 32-bit values Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 3 / 44

Zestaw instrukcji procesora ARM II Mnemoniki ARM ISA Opis CMP v1 compare two 32-bit values EOR v1 logical exclusive OR of two 32-bit values LDC LDC2 v2 v5 load to coprocessor single or multiple 32-bit values LDM v1 load multiple 32-bit words from memory to ARM registers LDR v1 v4 v5e load a single value from a virtual address in memory MCR MCR2 MCRR v2 v5 v5e move to coprocessor from an ARM register or registers MLA v2 multiply and accumulate 32-bit values MOV v1 move a 32-bit value into a register MRC MRC2 MRRC v2 v5 v5e move to ARM register or registers from a coprocessor MRS v3 move to ARM register from a status register (cpsr or spsr) MSR v3 move to a status register (cpsr or spsr) from an ARM register MUL v2 multiply two 32-bit values MVN v1 move the logical NOT of 32-bit value into a register Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 4 / 44

Zestaw instrukcji procesora ARM III Mnemoniki ARM ISA Opis ORR v1 logical bitwise OR of two 32-bit values PLD v5e preload hint instruction QADD v5e signed saturated 32-bit add QDADD v5e signed saturated double and 32-bit add QDSUB v5e signed saturated double and 32-bit subtract QSUB v5e signed saturated 32-bit subtract RSB v1 reverse subtract of two 32-bit values RSC v1 reverse subtract with carry of two 32-bit integers SBC v1 subtract with carry of two 32-bit values SMLAxy v5e signed multiply accumulate instructions ((16 16) + 32 = 32-bit) SMLAL v3m signed multiply accumulate long ((32 32) + 64 = 64-bit) SMLALxy v5e signed multiply accumulate long ((16 16) + 64 = 64-bit) SMLAWy v5e signed multiply accumulate instruction (((32 16) 16) + 32 = 32-bit) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 5 / 44

Zestaw instrukcji procesora ARM IV Mnemoniki ARM ISA Opis SMULL v3m signed multiply long (32 32 = 64-bit) SMULxy v5e signed multiply instructions (16 16 = 32-bit) SMULWy v5e signed multiply instruction ((32 16) 16 = 32-bit) STC STC2 v2 v5 store to memory single or multiple 32-bit values from coprocessor STM v1 store multiple 32-bit registers to memory STR v1 v4 v5e store register to a virtual address in memory SUB v1 subtract two 32-bit values SWI v1 software interrupt SWP v2a swap a word/byte in memory with a register, without interruption TEQ v1 test for equality of two 32-bit values TST v1 test for bits in a 32-bit value UMLAL v3m unsigned multiply accumulate long ((32 32) + 64 = 64-bit) UMULL v3m unsigned multiply long (32 32 = 64-bit) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 6 / 44

Instrukcje przenoszenia Syntax: <instruction><cond>s Rd, N MOV Move a 32-bit value into a register Rd = N MVN move the NOT of the 32-bit value into a register Rd =~N 1 PRE r5=5 2 r7=8 3 MOV r7, r5 ; l e t r7 = r5 4 POST r5=5 5 r7=5 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 7 / 44

Instrukcje przesuwania Mnemonic Description Shift Result Shift amount y LSL logical shift left xlsly x«y #0 31 or Rs LSR logical shift right xlsry (unsigned)x»y #1 32 or Rs ASR arithmetic right shift xasry (signed)x»y #1 32 or Rs ROR rotate right xrory ((unsigned)x»y) (x«(32-y)) #1 31 or Rs RRX rotate right extended xrrx (c flag«31) ((unsigned)x»1) none Note: x represents the register being shifted and y represents the shift amount. 1 r7=8 2 MOV r7, r5, LSL #2 ; l e t r7 = r5 4 = ( r5 << 2) 3 POST r5=5 4 r7 = 20 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 8 / 44

Instrukcja przesuwania N shift operations Immediate Register Logical shift left by immediate Logical shift left by register Logical shift right by immediate Logical shift right with register Arithmetic shift right by immediate Arithmetic shift right by register Rotate right by immediate Rotate right by register Rotate right with extend 1 PRE c p s r = nzcvqift_user 2 r0 = 0 x00000000 3 r1 = 0 x80000004 4 MOVS r0, r1, LSL #1 5 POST c p s r = nzcvqift_user 6 r0 = 0 x00000008 7 r1 = 0 x80000004 Syntax #immediate Rm Rm, LSL #shift_imm Rm, LSL Rs Rm, LSR #shift_imm Rm, LSR Rs Rm, ASR #shift_imm Rm, ASR Rs Rm, ROR #shift_imm Rm, ROR Rs Rm, RRX Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 9 / 44

Instrukcje arytmetyczne Syntax: <instruction><cond>s Rd, Rn, N ADC add two 32-bit values and carry Rd = Rn + N+ carry ADD add two 32-bit values Rd = Rn + N RSB reverse subtract of two 32-bit values Rd = N - Rn RSC reverse subtract with carry of two 32-bit values Rd = N - Rn -!(carry flag) SBC subtract with carry of two 32-bit values Rd = Rn - N -!(carry flag) SUB subtract two 32-bit values Rd = Rn - N Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 10 / 44

Instrukcje arytmetyczne I 1 PRE r 0 = 0 x00000000 2 r1 = 0 x00000002 3 r2 = 0 x00000001 4 SUB r0, r1, r2 5 POST r 0 = 0 x00000001 1 PRE r 0 = 0 x00000000 2 r1 = 0 x00000077 3 RSB r0, r1, #0 ; Rd = 0 x0 r 1 4 POST r0 = r1 = 0 x f f f f f f 8 9 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 11 / 44

Instrukcje arytmetyczne II 1 PRE c p s r = nzcvqift_user 2 r1 = 0 x00000001 3 SUBS r1, r1, #1 4 POST c p s r = nzcvqift_user 5 r1 = 0 x00000000 1 PRE r 0 = 0 x00000000 2 r1 = 0 x00000005 3 ADD r0, r1, r1, LSL #1 4 POST r0 = 0 x0000000f 5 r1 = 0 x00000005 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 12 / 44

Instrukcje logiczne Syntax: <instruction><cond>s Rd, Rn, N AND logical bitwise AND of two 32-bit values Rd = Rn & N ORR logical bitwise OR of two 32-bit values Rd = Rn N EOR logical exclusive OR of two 32-bit values Rd = Rn ˆ N BIC logical bit clear (AND NOT) Rd = Rn & ~N Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 13 / 44

Instrukcje przesuwania i arytmetyczne 1 PRE r 0 = 0 x00000000 2 r1 = 0 x02040608 3 r2 = 0 x10305070 4 ORR r0, r1, r2 5 POST r 0 = 0 x12345678 1 PRE r1 = 0 b1111 2 r2 = 0 b0101 3 BIC r0, r1, r2 4 POST r0 = 0 b1010 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 14 / 44

Instrukcje porównywania Syntax: <instruction><cond> Rn, N CMN compare negated flags set as a result of Rn + N CMP compare flags set as a result of Rn - N TEQ test for equality of two 32-bit values flags set as a result of Rn ˆ N TST test bits of a 32-bit value flags set as a result of Rn & N 1 PRE c p s r = nzcvqift_user 2 r0=4 3 r9=4 4 CMP r0, r9 5 POST c p s r = nzcvqift_user Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 15 / 44

Syntax: MLA<cond>S Rd, Rm, Rs, Rn MUL<cond>S Rd, Rm, Rs 1 PRE r 0 = 0 x00000000 2 r1 = 0 x00000002 3 r2 = 0 x00000002 4 MUL r0, r1, r2 ; r0 = r1 r2 5 POST r 0 = 0 x00000004 6 r1 = 0 x00000002 7 r2 = 0 x00000002 Instrukcje mnożenia MLA multiply and accumulate Rd = (Rm*Rs) + Rn MUL multiply Rd = Rm*Rs Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 16 / 44

Instrukcje mnożenia Syntax: <instruction><cond>s RdLo, RdHi, Rm, Rs SMLAL signed multiply accumulate long [RdHi, RdLo]=[RdHi, RdLo]+(Rm*Rs) SMULL signed multiply long [RdHi, RdLo]=Rm*Rs UMLAL unsigned multiply accumulate long [RdHi, RdLo]=[RdHi, RdLo]+(Rm*Rs) UMULL unsigned multiply long [RdHi, RdLo]=Rm*Rs 1 PRE r 0 = 0 x00000000 2 r1 = 0 x00000000 3 r2 = 0 xf0000002 4 r3 = 0 x00000002 5 UMULL r0, r1, r2, r3 ; [ r1, r0 ] = r2 r3 6 POST r 0 = 0 xe0000004 ; = RdLo 7 r 1 = 0 x00000001 ; = RdHi Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 17 / 44

Instrukcje skoków I Syntax: B<cond> label BL<cond> label BX<cond> Rm BLX<cond> label Rm B branch pc = label BL branch with link pc = label lr = address of the next instruction after the BL BX branch exchange pc = Rm & 0xfffffffe, T = Rm & 1 BLX branch exchange with link pc = label, T = 1 pc = Rm & 0xfffffffe, T = Rm & 1 lr = address of the next instruction after the BLX Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 18 / 44

Instrukcje skoków II 1 B f o r w a r d 2 ADD r1, r2, #4 3 ADD r0, r6, #2 4 ADD r3, r7, #4 5 f o r w a r d 6 SUB r1, r2, #4 7 backward 8 ADD r1, r2, #4 9 SUB r1, r2, #4 10 ADD r4, r6, r7 11 B backward Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 19 / 44

Instrukcje skoków III 1 BL s u b r o u t i n e ; branch to s u b r o u t i n e 2 CMP r1, #5 ; compare r1 with 5 3 MOVEQ r1, #0 ; i f ( r1==5) then r1 = 0 4 : 5 s u b r o u t i n e 6 <s u b r o u t i n e code> 7 MOV pc, l r ; r e t u r n by moving pc = l r Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 20 / 44

Transfer pojedynczych rejestrów Syntax: <LDR STR><cond>B Rd,addressing LDR<cond>SB H SH Rd, addressing STR<cond>H Rd, addressing LDR load word into a register Rd <- mem32[address] STR save byte or word from a register Rd -> mem32[address] LDRB load byte into a register Rd <- mem8[address] STRB save byte from a register Rd -> mem8[address] LDRH load halfword into a register Rd <- mem16[address] STRH save halfword into a register Rd -> mem16[address] LDRSB load signed byte into a register Rd <- SignExtend (mem8[address]) LDRSH load signed halfword into a register Rd <- SignExtend (mem16[address]) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 21 / 44

Transfer pojedynczych rejestrów 1 ; 2 ; l o a d r e g i s t e r r0 with the c o n t e n t s o f 3 ; the memory a d d r e s s p o i n t e d to by r e g i s t e r 4 ; r1. 5 ; 6 LDR r0, [ r1 ] ; = LDR r0, [ r1, #0] 7 ; 8 ; s t o r e the c o n t e n t s o f r e g i s t e r r0 to 9 ; the memory a d d r e s s p o i n t e d to by 10 ; r e g i s t e r r1. 11 ; 12 STR r0, [ r1 ] ; = STR r0, [ r1, #0] Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 22 / 44

Transfer pojedynczych rejestrów tryby adresowania Index method Data Base address register Example Preindex with writeback mem[base + offset] base + offset LDR r0,[r1,#4]! Preindex mem[base + offset] not updated LDR r0,[r1,#4] Postindex mem[base] base + offset LDR r0,[r1],#4 Note:! indicates that the instruction writes the calculated address back to the base address register. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 23 / 44

1 PRE r 0 = 0 x00000000 2 r1 = 0 x00090000 3 mem32 [ 0 x00009000 ] = 0 x01010101 4 mem32 [ 0 x00009004 ] = 0 x02020202 5 LDR r0, [ r1, #4]! Preindexing with writeback: 1 POST( 1 ) r 0 = 0 x02020202 2 r1 = 0 x00009004 3 LDR r0, [ r1, #4] Preindexing: 1 POST( 2 ) r 0 = 0 x02020202 2 r1 = 0 x00009000 3 LDR r0, [ r1 ], #4 Postindexing: 1 POST( 3 ) r 0 = 0 x01010101 2 r1 = 0 x00009004 Transfer pojedynczych rejestrów Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 24 / 44

Transfer wielu rejestrów Instruction r0 = r1 += Preindex with writeback LDR r0,[r1,#0x4]! mem32[r1 + 0x4] 0x4 LDR r0,[r1,r2]! mem32[r1+r2] r2 LDR r0,[r1,r2,lsr#0x4]! mem32[r1 + (r2 LSR 0x4)] (r2 LSR 0x4) Preindex LDR r0,[r1,#0x4] mem32[r1 + 0x4] not updated LDR r0,[r1,r2] mem32[r1 + r2] not updated LDR r0,[r1,-r2,lsr #0x4] mem32[r1-(r2 LSR 0x4)] not updated Postindex LDR r0,[r1],#0x4 mem32[r1] 0x4 LDR r0,[r1],r2 mem32[r1] r2 LDR r0,[r1],r2,lsr #0x4 mem32[r1] (r2 LSR 0x4) Syntax: <LDM STM><cond><addressing mode> Rn!,<registers>ˆ LDM load multiple registers Rd*N<- mem32[start address + 4*N] optional Rn updated STM save multiple registers Rd*N-> mem32[start address + 4*N] optional Rn updated Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 25 / 44

Instrukcje wczytywania i zapisu 1 PRE mem32 [ 0 x80018 ] = 0 x03 2 mem32 [ 0 x80014 ] = 0 x02 3 mem32 [ 0 x80010 ] = 0 x01 4 r0 = 0 x00080010 5 r1 = 0 x00000000 6 r2 = 0 x00000000 7 r3 = 0 x00000000 8 LDMIA r0!, { r1 r3 } 9 POST r 0 = 0 x0008001c 10 r1 = 0 x00000001 11 r2 = 0 x00000002 12 r3 = 0 x00000003 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 26 / 44

Instrukcje wczytywania i zapisu Store multiple STMIA STMIB STMDA STMDB Load multiple LDMDB LDMDA LDMIB LDMIA Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 27 / 44

1 PRE r 0 = 0 x00009000 2 r1 = 0 x00000009 3 r2 = 0 x00000008 4 r3 = 0 x00000007 5 STMIB r0!, { r1 r3 } 6 MOV r1, #1 7 MOV r2, #2 8 MOV r3, #3 9 PRE( 2 ) r0 = 0 x0000900c 10 r1 = 0 x00000001 11 r2 = 0 x00000002 12 r3 = 0 x00000003 13 LDMDA r0!, { r1 r3 } 14 POST r 0 = 0 x00009000 15 r1 = 0 x00000009 16 r2 = 0 x00000008 17 r3 = 0 x00000007 Instrukcje wczytywania i zapisu Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 28 / 44

Instrukcje wczytywania i zapisu 1 ; r9 p o i n t s to s t a r t o f s o u r c e data 2 ; r10 p o i n t s to s t a r t o f d e s t i n a t i o n data 3 ; r11 p o i n t s to end o f the s o u r c e 4 l o o p 5 ; l o a d 32 b y t e s from s o u r c e and update r9 p o i n t e r 6 LDMIA r9!, { r0 r7 } 7 ; s t o r e 32 b y t e s to d e s t i n a t i o n and update r10 p o i n t e r 8 STMIA r10!, { r0 r7 } ; and s t o r e them 9 ; have we r e a c h e d the end 10 CMP r9, r11 11 BNE l o o p Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 29 / 44

Instrukcje wczytywania i zapisu 1 PRE r 1 = 0 x00000002 2 r4 = 0 x00000003 3 sp = 0 x00080014 4 STMFD sp!, { r1, r4 } 5 POST r 1 = 0 x00000002 6 r4 = 0 x00000003 7 sp = 0 x0008000c Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 30 / 44

Instrukcje zamiany Syntax: SWPB<cond> Rd,Rm,[Rn] SWP swap a word between memory and a register tmp = mem32[rn] mem32[rn] = Rm Rd = tmp SWPB swap a byte between memory and a register tmp = mem8[rn] mem8[rn] = Rm Rd = tmp Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 31 / 44

1 PRE mem32 [ 0 x9000 ] = 0 x12345678 2 r0 = 0 x00000000 3 r1 = 0 x11112222 4 r2 = 0 x00009000 5 SWP r0, r1, [ r2 ] 6 7 POST mem32 [ 0 x9000 ] = 0 x11112222 8 r0 = 0 x12345678 9 r1 = 0 x11112222 10 r2 = 0 x00009000 Instrukcje zamiany 1 s p i n 2 MOV r1, =semaphore 3 MOV r2, #1 4 SWP r3, r2, [ r1 ] ; h o l d the bus u n t i l complete 5 CMP r3, #1 6 BEQ s p i n Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 32 / 44

Instrukcja programowego przerwania Syntax: SWI<cond> SWI_number SWI software interrupt lr_svc =address of instruction following the SWI spsr_svc =cpsr pc =vectors +0x8 cpsr mode =SVC cpsr I =1 (mask IRQ interrupts) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 33 / 44

Instrukcja programowego przerwania 1 PRE c p s r = nzcvqift_ USER 2 pc = 0 x00008000 3 l r = 0 x 0 0 3 f f f f f ; l r = r14 4 r0 = 0 x12 5 6 0 x00008000 SWI 0 x123456 7 8 POST c p s r = nzcvqift_ SVC 9 s p s r = nzcvqift_user 10 pc = 0 x00000008 11 l r = 0 x00008004 12 r0 = 0 x12 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 34 / 44

Instrukcja programowego przerwania 1 SWI_ handler 2 ; 3 ; S t o r e r e g i s t e r s r0 r12 and the l i n k r e g i s t e r 4 ; 5 STMFD sp!, { r0 r12, l r } 6 ; Read the SWI i n s t r u c t i o n 7 LDR r10, [ l r, # 4] 8 ; Mask o f f top 8 b i t s 9 BIC r10, r10, #0x f f 0 0 0 0 0 0 10 ; r10 c o n t a i n s the SWI number 11 BL s e r v i c e _ r o u t i n e 12 ; r e t u r n from SWI h a n d l e r 13 LDMFD sp!, { r0 r12, pc }^ Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 35 / 44

Instrukcje rejestru statusu programu Syntax: MRS<cond> Rd,<cpsr spsr> MSR<cond> <cpsr spsr>_<fields>,rm MSR<cond> <cpsr spsr>_<fields>,#immediate MRS copy program status register to a general-purpose register Rd =psr MSR move a general-purpose register to a program status register psr[field] =Rm MSR move an immediate value to a program status register psr[field] =immediate Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 36 / 44

Instrukcje rejestru statusu programu 1 PRE c p s r = nzcvqift_ SVC 2 MRS r1, c p s r 3 BIC r1, r1, #0x80 ; 0 b01000000 4 MSR cpsr_c, r1 5 POST c p s r = nzcvqift_ SVC Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 37 / 44

Instrukcje koprocesora Syntax: CDP<cond> cp, opcode1, Cd, Cn, opcode2 <MRC MCR><cond> cp, opcode1, Rd, Cn, Cm, opcode2 <LDC STC><cond> cp, Cd, addressing CDP MRC MCR LDC STC coprocessor data processing perform an operation in a coprocessor coprocessor register transfer move data to/from coprocessor registers coprocessor memory transfer load and store blocks of memory to/from a coprocessor 1 ; t r a n s f e r r i n g the c o n t e n t s o f CP15 r e g i s t e r c0 to r e g i s t e r r10 2 MRC p15, 0, r10, c0, c0, 0 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 38 / 44

Instrukcje wczytywania i zapisu LDM load multiple registers Rd*N<- mem32[start address + 4*N] optional Rn updated STM save multiple registers Rd*N-> mem32[start address + 4*N] optional Rn updated Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 39 / 44

Wczytywanie stałych LDR load constant pseudoinstruction Rd =32-bit constant ADR load address pseudoinstruction Rd =32-bit relative address Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 40 / 44

Rozszerzenia ARMv5E Instruction Description CLZ <cond> Rd, Rm count leading zeros QADD <cond> Rd, Rm, Rn signed saturated 32-bit add QDADD<cond> Rd, Rm, Rn signed saturated double 32-bit add QDSUB<cond> Rd, Rm, Rn signed saturated double 32-bit subtract QSUB<cond> Rd, Rm, Rn signed saturated 32-bit subtract SMLAxy<cond> Rd, Rm, Rs, Rn signed multiply accumulate 32-bit (1) SMLALxy<cond> RdLo, RdHi, Rm, Rs signed multiply accumulate 64-bit SMLAWy<cond> Rd, Rm, Rs, Rn signed multiply accumulate 32-bit (2) SMULxy<cond> Rd, Rm, Rs signed multiply (1) SMULWy<cond> Rd, Rm, Rs signed multiply (2) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 41 / 44

Rejestry Instruction QADD QDADD QSUB QDSUB Saturated calculation Rd = Rn + Rm Rd = Rn + (Rm2) Rd = Rn - Rm Rd = Rn - (Rm*2) Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 42 / 44

Rejestry SMLAxy (16-bit *16-bit)+ 32-bit 32-bit yes Rd = (Rm.x *Rs.y)+Rn SMLALxy (16-bit *16-bit)+ 64-bit 64-bit [RdHi, RdLo]+= Rm.x * Rs.y SMLAWy ((32-bit *16-bit) 16)+ 32-bit 32-bit yes Rd = ((Rm * Rs.y) 16) + Rn SMULxy (16-bit *16-bit) 32-bit Rd = Rm.x * Rs.y SMULWy ((32-bit *16-bit)16) 32-bit Rd = (Rm * Rs.y) 16 Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 43 / 44

References C. Simmonds. Mastering Embedded Linux Programming. Packt Publishing, 2015. Mariusz Naumowicz Programowanie mikroprocesorów jednoukładowych 11 września 2017 44 / 44