510 likes | 711 Views
Riistvarapõhine programmeerimine. Loeng 13 ARM käsustik ARM arenduskeskkond. ARM-i käsustik. Andmetöötlemise käsud Hargnemise käsud Laadimise-salvestamise käsud Tarkvara katkestuse käsud Programmi staatuse käsud Konstantide laadimine Tingimuslik täitmine. Hargnemise käsud I.
E N D
Riistvarapõhine programmeerimine Loeng 13 ARM käsustik ARM arenduskeskkond
ARM-i käsustik • Andmetöötlemise käsud • Hargnemise käsud • Laadimise-salvestamise käsud • Tarkvara katkestuse käsud • Programmi staatuse käsud • Konstantide laadimine • Tingimuslik täitmine ID218 Riistvaralähedane programmeerimine
Hargnemise käsud I B {<cond>} label BL {<cond>} label BX {<cond>} Rm BLX {<cond>} label | Rm ID218 Riistvaralähedane programmeerimine
Hargnemise käsud II B label1 ADD r0, r2, r4 . . . . . . . ADD r1, r3, r5 Label1 SUB r0, r1, r2 ID218 Riistvaralähedane programmeerimine
Hargnemise käsud III BL sub1; branch to subroutine 1 CMP r0, #10; value of lr . . . . . . . Sub1 <Subroutine code> MOV pc, lr; return, move pc = lr ID218 Riistvaralähedane programmeerimine
Laadimise-salvestamise käsud • Single – register transfer • Multiple – register transfer • Swap ID218 Riistvaralähedane programmeerimine
Ühe registri teisaldamine I <LDR|STR> {<cond>} {B} Rd, addressing1 ID218 Riistvaralähedane programmeerimine
Ühe registri teisaldamine II LDR {<cond>} SB|H|SH Rd, addressing2 STR {<cond>} H Rd, addressing2 ID218 Riistvaralähedane programmeerimine
Ühe registri teisaldamine III Load register R0 with the content of the memory address pointed to by register R1 LDR r0, [r1]; . . . R1 . . . R0 . . . ID218 Riistvaralähedane programmeerimine
Adresseerimise mood I • Base address register • Indekseerimise meetodid ID218 Riistvaralähedane programmeerimine
Indekseerimise meetod I R0 = 0x00000000 R1 = 0x00090000 Mem32[00090000] = 0x01010101 Mem32[00090004] = 0x02020202 LDR r0, [r1, #4]! ; preindex with writeback R0 = 0x02020202 R1 = 0x00090004 ID218 Riistvaralähedane programmeerimine
Indekseerimise meetod II R0 = 0x00000000 R1 = 0x00090000 Mem32[00090000] = 0x01010101 Mem32[00090004] = 0x02020202 LDR r0, [r1, #4]! ; preindex R0 = 0x02020202 R1 = 0x00090000 ID218 Riistvaralähedane programmeerimine
Indekseerimise meetod III R0 = 0x00000000 R1 = 0x00090000 Mem32[00090000] = 0x01010101 Mem32[00090004] = 0x02020202 LDR r0, [r1], #4 ; postindex R0 = 0x01010101 R1 = 0x00090004 ID218 Riistvaralähedane programmeerimine
Adresseerimise mood II • Offset • Immidiate offset • Register offset • Scaled register offset ID218 Riistvaralähedane programmeerimine
Immidiate offset I ID218 Riistvaralähedane programmeerimine
Immidiate offset LDR r0, [r1, #4]!; preindex with writeback R0 = mem32[r1+0x4] R1 = R1 + 0x4 LDR r0, [r1, #4]; preindex R0 = mem32[r1+0x4] R1 = R1 LDR r0, [r1], #4; postindex R0 = mem32[r1] R1 = R1 + 0x4 ID218 Riistvaralähedane programmeerimine
Register offset I ID218 Riistvaralähedane programmeerimine
Register offset II LDR r0, [r1, r2]!; preindex with writeback R0 = mem32[r1+r2] R1 = R1 + R2 LDR r0, [r1, r2]; preindex R0 = mem32[r1+r2] R1 = R1 LDR r0, [r1], r2; postindex R0 = mem32[r1] R1 = R1 + R2 ID218 Riistvaralähedane programmeerimine
Scaled register offset I ID218 Riistvaralähedane programmeerimine
Scaled register offset II LDR r0, [r1, r2, LSR #0x4]!; preindex with writeback R0 = mem32[r1+(r2 LSR #0x4)] R1 = R1 + (R2 LSR #0x4) LDR r0, [r1, r2, LSR #0x4]; preindex R0 = mem32[r1+(r2 LSR #0x4)] R1 = R1 LDR r0, [r1], r2, LSR #0x4; postindex R0 = mem32[r1] R1 = R1 + (R2 LSR #0x4) ID218 Riistvaralähedane programmeerimine
Ühe registri teisaldamine IV <LDR|STR> {<cond>} {B} Rd, addressing1 • Teisendab: • 8-bit byte • 32-bit word • Lubatud offsetid: • Immidiate • Register • Scaled register ID218 Riistvaralähedane programmeerimine
Ühe registri teisaldamine V LDR {<cond>} SB|H|SH Rd, addressing2 STR {<cond>} H Rd, addressing2 • Teisendab: • 8-bit signed byte • 16-bit halfworld • 16-bit signed halfworld • Lubatud offsetid: • Immidiate • Register ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine I <LDM|STM>{<cond>}<addr_mode>Rn{!},<registers> ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine II • Adresseerimine ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine III Mem32[0x80018] = 0x03 R1 = 0x00000000 Mem32[0x80014] = 0x02 R2 = 0x00000000 Mem32[0x80010] = 0x01 R3 = 0x00000000 R0 = 0x00080010 LDMIA r0!, {r1-r3} R0 = 0x0008001C R2 = 0x00000002 R1 = 0x00000001 R3 = 0x00000003 ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine IV LDMIA r0!, {r1 – r3} ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine V Mem32[0x8001C] = 0x04 R1 = 0x00000000 Mem32[0x80018] = 0x03 R2 = 0x00000000 Mem32[0x80014] = 0x02 R3 = 0x00000000 R0 = 0x00080010 LDMIB r0!, {r1-r3} R0 = 0x0008001C R2 = 0x00000003 R1 = 0x00000002 R3 = 0x00000004 ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine VI LDMIB r0!, {r1-r3} ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine VII Salvestamine – lugemine ID218 Riistvaralähedane programmeerimine
Mitme registri teisaldamine VIII R0 = 0x00009000 R1 = 0x00000002 R1 = 0x00000001 R2 = 0x00000003 STMIB r0!, {r1 – r3} . . . . . . . . . . . . R0 = 0x0000900C R1 = 0x???????? R1 = 0x???????? R2 = 0x???????? LDMDA r0!, {r1 – r3} R0 = 0x00009000 R1 = 0x00000002 R1 = 0x00000001 R2 = 0x00000003 ID218 Riistvaralähedane programmeerimine
Pinu operatsioonid I Pinu: • Full F • Empty E • Ascending A • Descending D Standart FD ID218 Riistvaralähedane programmeerimine
Pinu operatsioonid II ID218 Riistvaralähedane programmeerimine
Pinu operatsioonid III R1 = 0x00000002 R4 = 0x00000003 SP = 0x00080014 STMFD SP!, {r1, r4} R1 = 0x00000002 R4 = 0x00000003 SP = 0x0008000C FD - Stack ID218 Riistvaralähedane programmeerimine
Pinu operatsioonid IV R1 = 0x00000002 R4 = 0x00000003 SP = 0x00080010 STMED SP!, {r1, r4} R1 = 0x00000002 R4 = 0x00000003 SP = 0x00080008 ED - Stack ID218 Riistvaralähedane programmeerimine
Vahetus I SWP {B}{<cond>} Rd, Rm, [Rn] ID218 Riistvaralähedane programmeerimine
Vahetus II Mem32[0x00009000] = 0x12345678 R0 = 0x00000000 R2 = 0x00009000 R1 = 0x11111111 SWP r0, r1, [r2] Mem32[0x00009000] = 0x11111111 R0 = 0x12345678 R2 = 0x00009000 R1 = 0x11111111 ID218 Riistvaralähedane programmeerimine
Tarkvaralised katkestused I SWI {<cond>} SWI_number ID218 Riistvaralähedane programmeerimine
Tarkvaralised katkestused II Cpsr = nzcvqift_USER Pc = 0x00008000 Lr = 0x12345678 ; lr = r14 0x00008000 SWI 0x123456 (24-bit) Cpsr = nzcvqIft_SVC Spsr = nzcvqift_USER Pc = 0x00000008 Lr = 0x00008004 ID218 Riistvaralähedane programmeerimine
Programmi staatusega seotud käsud I MRS {<cond>} Rd, <cspr|spsr> MSR {<cond>} Rd, <cspr|spsr>_<field>, Rm MSR {<cond>} Rd, <cspr|spsr>_<field>, #imm ID218 Riistvaralähedane programmeerimine
Programmi staatusega seotud käsud II Cspr = nzcvqIFt_SVC MRS r1, cpsr BIC r1, r1, #0x00000080; 0b01000000 MSR cpsr_c, r1 Cpsr = nzcvqiFt_SVC ID218 Riistvaralähedane programmeerimine
Konstantide laadimine I LDR rd, =constant ADR Rd, label ID218 Riistvaralähedane programmeerimine
Konstantide laadimine II R0 = 0x12345678 LDR r0, [pc, #constant-8-{PC}] . . . . Constant DCD 0xFF00FFFF R0 = 0xFF00FFFF ID218 Riistvaralähedane programmeerimine
Tingimuslik täitmine I ID218 Riistvaralähedane programmeerimine
Tingimuslik täitmine II C – kood, ühisteguri leidmine While (a != b ) { if ( a > b) { a = a – b; } else { b = b – a ; } } ID218 Riistvaralähedane programmeerimine
Tingimuslik täitmine II r1 = A, r2 = B, ASS kood, gcd CMP r1, r2 BEQ complete BLT lessthan SUB r1, r1, r2 B gcd lessthan SUB r2, r2, r1 B gcd complete . . . . ID218 Riistvaralähedane programmeerimine
Tingimuslik täitmine III r1 = A, r2 = B, ASS kood + conditional execution gcd CMP r1,r2 SUBGT r1, r1, r2 SUBLT r2, r2, r1 BNE gcd complete . . . . . ID218 Riistvaralähedane programmeerimine
ARM-i arenduskeskkond I • ARM developer suite • CodeWarrior IDE - project management tool for Windows • AXD - extended ARM Debugger • ADW / ADU - ARM Debugger for Windows or Unix ID218 Riistvaralähedane programmeerimine
ARM-i arenduskeskkond II • Armcc ARM C compiler • Armcpp ARM C++ compiler • Tcc Thumb C compiler • Tcpp Thumb C++ compiler • Armasm ARM and Thumb assembler • Armlink ARM linker • Armsd ARM and Thumb symbolic debugger ID218 Riistvaralähedane programmeerimine
Kokkuvõte I • ARM-i hagnemise käsud • Tingimusteta juhtimise üleandmine • Juhtimise üleandmine alamprogrammide • Thumb käsude täitmine ID218 Riistvaralähedane programmeerimine
Kokkuvõte II • Ladimise-salvetuse käsud • Ühe registri teisaldamine • Mitme registri teisaldamine • Vahetus • Indekseerimine • Preindex with writeback • Preindex • postindex ID218 Riistvaralähedane programmeerimine