ARM 명령어집합 임베디드시스템소프트웨어 I
내용 ARM 구조 프로세서수행모드 레지스터구조 예외처리과정 ARM 명령어형식 조건수행접미사 데이터처리명령어 곱셈명령어 Load/Store 명령어 다중레지스터 Load/Store 스택명령어 SWI 명령어 Branch 명령어 상태레지스터접근명령어 명령어요약 ARM 명령어집합 2
ARM 구조특징 모든명령어가 32bit 크기를가짐 대부분의명령어가 1cycle에수행됨 32bit 크기의많은레지스터 load/store architecture 모든명령어에서조건수행기능있음 간단한어드레싱모드 같은규격의간단한명령어 한명령어에서 ALU와 shifter 동시사용가능 loop을위한자동증가 / 감소어드레싱모드 많은데이터처리를위한 multiple load/store 명령어 ARM 명령어집합 3
ARM 구조버전 ARM 명령어집합 4
프로세서수행모드 사용자모드특권모드특권모드, 예외모드특권모드, 예외모드특권모드, 예외모드특권모드, 예외모드특권모드, 예외모드 usr sys svc abt und irq fiq 사용자프로그램수행할때 (User) Kernel 프로그램수행할때 (System) 전원 reset 발생시혹은소프트웨어인터럽트발생시 (Supervisor) 메모리보호공간혹은없는메모리공간액세스시 (Abort) 잘못된명령어를사용할때 (Undefined) 일반인터럽트발생시 (Interrupt) 우선순위인터럽트발생시 (Fast Interrupt) ARM 명령어집합 5
레지스터구조 31개의범용레지스터 (R0 ~ R15) 가프로세서모드에따라선택되어사용됨 특별한의미를가지는범용레지스터 R13 = SP(stack pointer) R14 = LR(link register) R15 = PC(program counter) R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 User/ System Supervisor R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 Abort Undefined R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 Interrupt R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 Fast interrupt R0 R1 R2 R3 R4 R5 R6 R7 R8_FIQ R9 _FIQ 예외가발생되면 R13 및 R14 가예외용 R13 및 R14 로대치됨 R10 R11 R12 R10 R11 R12 R10 R11 R12 R10 R11 R12 R10 R11 R12 R10 _FIQ R11 _FIQ R12 _FIQ fiq 예외는 R8 ~ R14가대치됨 6개의프로그램상태레지스터 (CPSR 1개및 SPSR 5개 ) - 특별한명령어로만접근가능 R13 (SP) R14 (LR) R15 (PC) CPSR R13_SVC R14_SVC R15 (PC) CPSR R13_ABORT R14_ABORT R15 (PC) CPSR R13_UNDEF R14_UNDEF R15 (PC) CPSR R13_IRQ R14_IRQ R15 (PC) CPSR R13 _FIQ R14 _FIQ R15 (PC) CPSR SPSR_SVC SPSR_ABORT SPSR_UNDEF SPSR_IRQ SPSR_FIQ ARM 명령어집합 6
현재프로그램상태레지스터 (CPSR) 31 28 8 4 0 NZCV I F T mode 조건코드비트 N = 계산결과가음수 Z = 계산결과가 '0' C = 계산후 carry 발생 V = 계산후 overflow 발생 인터럽트 disable 비트 I = 1, IRQ 를 disable 함 F = 1, FIQ 를 disable 함 T 비트 : '0' 이면명령어가 ARM 명령어이고 '1' 이면 Thumb 명령어를표시 mode 비트 : 프로세서의 7 개모드중하나를표시 mode usr fiq irq svc abt und sys M[4:0] 10000 10001 10010 10011 10111 11011 11111 ARM 명령어집합 7
프로그램카운터 모든명령어는길이가 32 bit이고메모리에저장될때 word(=4 bytes) align되어야함 R15(=PC) 의값은 bit 2~31에저장되고 bit 0~1은항상 '0' 임 R14(=LR) 는명령어 BL(Branch with Link) 를사용하여 subroutine 호출시 return 주소가자동저장됨 subroutine call할때 BL SUB1 subroutine return할때 MOV R15, R14 ( 혹은 MOV PC, LR) ARM 명령어집합 8
예외 (exception) 처리과정 예외발생시 ( 프로세서가실행 ) SPSR_<mode> 에 CPSR을복사 CPSR의모드 bit 변경 CPSR의 I bit를세트하고 mode가 fiq이면f bit도세트 해당모드의레지스터사용으로변경 LR_<mode> 에 return 주소저장 PC에해당예외 vector 주소를저장 예외복귀시 ( 프로그램에서수행 ) CPSR 에 SPSR_<mode> 를복사 PC 에 LR_<mode> 를복사 예외종류 Reset Undefined instructions Software Interrupt(SWI) Instruction fetch memory abort Data access memory abort IRQ (Interrupt) FIQ (Fast Interrupt) 예외모드 svc und svc abt abt irq fiq 예외 vector 주소 0x00000000 0x00000004 0x00000008 0x0000000c 0x00000010 0x00000018 0x0000001c ARM 명령어집합 9
ARM 파이프라인 ARM은빠른명령어수행을위하여파이프라인을사용 3 stage 파이프라인경우 (1990년 ~1995년 ) fetch - 명령어를메모리에서레지스터로복사 decode - 명령어를디코드 execute - 레지스터의내용을사용하여계산한후레지스터에저장 fetch decode execute PC PC-4 PC-8 ARM 명령어집합 10
ARM 명령어형식 기본형식 ADD Rd, Rn, Op2 ; Rd = Rn + Op2 Rd = destination register Rn = operand 1 ( 항상 register임 ) Op2 = operand 2 (register 혹은 immediate 값 ) ; 다음은 comment ARM 명령어집합 11
조건수행 CPSR 의조건코드비트의값에따라명령어를실행하도록하기위 해서는적절한조건을접미사로붙여주면됨 : ADD r0, r1, r2 ADDEQ r0, r1, r2 ; r0 = r1 + r2 ; If Z is 1 then r0 = r1 + r2 데이터처리명령어들의결과는 CPSR의조건코드비트에영향을미치지못하도록설계되어있음 데이터처리명령어의결과가 CPSR의조건코드비트를변경하기위해서는명령어에접미사로 'S' 를명시하여야함 ADDS r0, r1, r2 ; r0 = r1 + r2 and set condition bits ARM 명령어집합 12
조건수행접미사 Opcode [31:28] Mnemonic extension Interpretation Status flag state for execution 0000 EQ Equal / equals zero Z set 0001 NE Not equal Z clear 0010 CS/HS Carry set / unsigned higher C set or same 0011 CC/LO Carry clear / unsigned lower C clear 0100 MI Minus / negative N set 0101 PL Plus / positive or zero N clear 0110 VS Overflow V set 0111 VC No overflow V clear 1000 HI Unsigned higher C set and Z clear 1001 LS Unsigned lower or same C clear or Z set 1010 GE Signed greater than or equal N equals V 1011 LT Signed less than N is not equal to V 1100 GT Signed greater than Z clear and N equals V 1101 LE Signed less than or equal Z set or N is not equal to V 1110 AL Always any 1111 NV Never (do not use!) none ARM 명령어집합 13
데이터처리명령어 관련명령어종류 산술연산 비교연산 논리연산 데이터이동연산 ARM 은 load/store architecture 데이터처리명령어는메모리에직접적용이불가능하고레지스터에만적용됨. 하나혹은두개의 operand 에대하여계산처리 첫째 operand는항상레지스터 (Rn) 둘째 operand는레지스터혹은 immediate 값으로 barrel shifter 를통하여 ALU로보내짐 ARM 명령어집합 14
산술연산 산술연산명령어및동작 : ADD: operand1 + operand2 ADC: operand1 + operand2 + carry SUB: operand1 - operand2 SBC: operand1 - operand2 + carry -1 RSB: operand2 - operand1 RSC: operand2 - operand1 + carry - 1 문법 : <Operation>{<cond>}{S} Rd, Rn, Operand2 예제 ADD r0, r1, r2 SUBGT r3, r3, #1 RSBLES r4, r5, #5 ARM 명령어집합 15
비교연산 비교연산의결과는 CPSR의조건코드비트를변경 ('S' 비트를 set 할필요가없음 ) 명령어및동작 : CMP: operand1 - operand2, but result not written CMN: operand1 + operand2, but result not written TST: operand1 AND operand2, but result not written TEQ: operand1 EOR operand2, but result not written 문법 : <Operation>{<cond>} Rn, Operand2 예제 : CMP r0, r1 TSTEQ r2, #5 ARM 명령어집합 16
논리연산 관련명령어 : AND: operand1 AND operand2 EOR: operand1 EOR operand2 ORR: operand1 OR operand2 BIC: operand1 AND NOT operand2 (bit clear) 문법 : <Operation> {<cond>} {S} Rd, Rn, Operand2 예제 : AND r0, r1, r2 BICEQ r2, r3, #7 EORS r1, r3, r0 ARM 명령어집합 17
데이터이동연산 관련명령어 : MOV: operand1 <- operand2 MVN: operand1<- not operand2 문법 : <Operation> {<cond>} {S} Rd, Operand2 예제 : MOV r0, r1 ; r0 <- r1 MOVS r2, #10 ; r2 <- 10 and set 'S' bit MVNEQ r1, #0 ; if zero flag set then r1 <- not 0 ARM 명령어집합 18
Shift ARM 은각명령어의일부로서 shift 연산을제공하는배럴쉬프터 (barrel shifter) 를제공 Operand 1 Operand 2 Barrel Shifter ALU Result ARM 명령어집합 19
논리 / 산술 Shift Logical Shifts Left LSL #5 ; multiply by 32 (LSL = ASL) Logical Shift Right Logical Shift Left C Destination 0 Logical Shift Right 0 Destination C LSR #5 ; divide by 32 Arithmetic Shift Right Arithmetic Shift Right ASR #5 ; divide by 32 (signed) s Destination C sign 비트유지 ARM 명령어집합 20
회전 Shift Rotate Right (ROR) ROR #5 Rotate Right Destination C Rotate Right Extended (RRX) Rotate Right through Carry RRX #5 Destination C ARM 명령어집합 21
Shift Operand 레지스터가 shift 되는양은 2 가지방법으로지정. immediate 5-bit ADD r5, r5, r3 LSL #3 추가 cycle 필요없음 레지스터의 bottom byte 사용 (PC는안됨 ) ADD r5, r5, r3 LSL r2 추가 cycle 필요 Shift 가명시되지않으면 default shift 적용 : LSL #0 ARM 명령어집합 22
곱셈명령어 ARM 은기본적으로 2 개의곱셈명령어제공 Multiply MUL {<cond>} {S} Rd, Rm, Rs ; Rd = Rm * Rs Multiply Accumulate - does addition for free MLA {<cond>} {S} Rd, Rm, Rs, Rn ; Rd = (Rm * Rs) + Rn 사용상의제한 : Rd 과 Rm 는동일한레지스터이어서는안됨 ARM 명령어집합 23
Load/Store 명령어 ARM 은 load/store architecture: memory to memory 데이터처리명령을지원하지않음 따라서일단사용하려는데이터를레지스터로이동해야함 ARM은메인메모리와상호작용하는세종류의명령어집합이있음 1개레지스터 (single register) 데이터이동 (LDR/STR). 다수레지스터 (multiple register) 데이터이동 (LDM/STM). 데이터스웝 (SWP). ARM 명령어집합 24
Load/Store - Single Register 기본적인 load/store 명령어 Word(4 bytes): LDR, STR Halfword(2 bytes): LDRH, STRH Byte(1 byte): LDRB, STRB ARM 명령어집합 25
Load/Store - Base Register 접근될메모리위치는 base 레지스터에유지함 STR r0, [r1] ; r0의내용을 r1이가리키는메모리위치에저장 LDR r2, [r1] ; r1이포인팅하는메모리위치의정보를 r2에저장 Memory STR 의 source 레지스터 r0 0x05 base 레지스터 r1 0x200 0x200 0x05 r2 0x05 LDR 의 destination 레지스터 ARM 명령어집합 26
Load/Store - Offset base 레지스터값으로부터 offset 만큼떨어진위치의정보를접근하는명령어 pre-indexed LDR r0, [r1, #4] ; r0 := mem 32 [r1 + 4] post-indexed LDR r0, [r1], #4 ; r0 := mem 32 [r1], r1 := r1 + 4 auto-indexing LDR r0, [r1, #4]! ; r0 := mem 32 [r1 + 4], r1 := r1 + 4 ARM 명령어집합 27
Pre-indexed LDR r0, [r1, #4] 메모리 0x00000004 + 0x00 0x00 0x3b 0xf8 1 word=4 byte 임 0x00001238 r1 0x00001234 0x00001234 r0 0x00003bf8 0x00000000 ARM 명령어집합 28
Post-indexed LDR r0, [r1], #4 메모리 0x00000004 r1 값변경됨 r1: 0x00001234 + 0x00 0x00 0x3b 0xf8 0x00 0x00 0x51 0x2a 0x00001238 0x00001234 r0 0x0000512a ARM 명령어집합 29
Auto Indexing LDR r0, [r1, #4]! 메모리 r1 값변경됨 0x00000004 + 0x00 0x00 0x3b 0xf8 1 word=4 byte 임 0x00001238 r1 0x00001234 0x00001234 r0 0x00003bf8 0x00000000 ARM 명령어집합 30
다중레지스터 Load/Store 기본명령어 STM/LDM 확장명령어 STMIA/LDMIA: Increment After STMIB/LDMIB: Increment Before STMDA/LDMDA: Decrement After STMDB/LDMDB: Decrement Before ARM 명령어집합 31
블록복사 ; r12 - source 시작주소 high ; r14 - source 끝주소 ; r13 - destination 시작주소 loop LDMIA r12!, {r0-r11} STMIA r13!, {r0-r11} r13 r14 CMP BNE r12, r14 loop r12 low 48 bytes ARM 명령어집합 32
스택 어떤종류의스택을사용하느냐에따라스택명령어의접미사가달라짐 STMFD/LDMFD: Full Descending stack 참고 : ARM 컴파일러가사용하는스택 STMFA/LDMFA: Full Ascending stack. STMED/LDMED: Empty Descending stack STMEA/LDMEA: Empty Ascending stack ARM 명령어집합 33
스택사용보기 Old SP SP high r5 r4 r3 r1 r0 Old SP SP r5 r4 r3 r1 r0 SP Old SP r5 r4 r3 r1 r0 SP Old SP r5 r4 r3 r1 r0 low STMFD sp!, {r0, r1, r3-r5} STMED sp!, {r0, r1, r3-r5} STMFA sp!, {r0, r1, r3-r5} STMEA sp!, {r0, r1, r3-r5} ARM 명령어집합 34
스택과서브루틴 스택의용도중하나는서브루틴내에선언된지역변수에대한일시적인저장소를제공하는것 서브루틴 call 시현재사용하는레지스터를스택에 push 하고, 서브루틴 return 시스택의 pop 을통해원래의레지스터값으로환원시킴 STMFD sp!, {r0-r12, lr}...... LDMFD sp!, {r0-r12, pc} ; push ; pop ARM 명령어집합 35
Swap 명령어 메모리읽기와쓰기를 atomic하게수행하는명령어 SWP {<cond>} {B} Rd, Rm, [Rn] 메모리 Rn 1 temp 2 3 Rm Rd 보통 Rm 과 Rd 을같게하여 Rm 과 mem[rn] 을 swap 함 ARM 명령어집합 36
Software Interrupt (SWI) svc 예외를발생시킴 예외발생시처리하는과정이이루어짐 0x00000008 번지로 jump 하게됨 System call 을할때사용 MOV r0, #'A' ; r0= 'A' SWI SWI_WriteC ARM 명령어집합 37
Branch 명령어 Branch B{<cond>} label Branch with Link BL{<cond>} sub_routine_label ARM 명령어집합 38
상태레지스터접근명령어 CPSR/SPSR 와범용레지스터간의데이터이동가능 MRS : 범용레지스터 <- Status 레지스터 MSR : Status 레지스터 <- 범용레지스터혹은 Immediate 값 명령어종류 MRS {<cond>} Rd,<psr> ; Rd = <psr> MSR {<cond>} <psr>,rm ; <psr> = Rm MSR {<cond>} <psr>, #Immediate ; <psr> = #Immediate ARM 명령어집합 39
명령어요약 - 1/4 Mnemonic ADC ADD AND B BIC BL CDP CMN CMP EOR Instruction Add with carry Add AND Branch Bit Clear Branch with Link Coprocessor Data Processing Compare Negative Compare Exclusive OR Action Rd: = Rn + Op2 + C Rd: = Rn + Op2 Rd: = Rn AND Op2 R15: = address Rd: = Rn AND NOT Op2 R14: = R15, R15: = address (Coprocessor-specific) CPSR flags: = Rn + Op2 CPSR flags: = Rn Op2 Rd: = (Rn AND NOT Op2) OR (op2 AND NOT Rn) ARM 명령어집합 40
명령어요약 - 2/4 Mnemonic LDC LDM LDR MCR MLA MOV MRC MRS Instruction Load coprocessor from memory Load multiple registers Load register from memory Move CPU register to coprocessor register Multiply Accumulate Move register or constant Move from coprocessor register to CPU register Move PSR status/flags to register Action Coprocessor load Stack manipulation (Pop) Rd: = (address) crn: = rrn {<op>crm} Rd: = (Rm * Rs) + Rn Rd: = Op2 Rn: = crn {<op>crm} Rn: = PSR ARM 명령어집합 41
명령어요약 - 3/4 Mnemonic MSR MUL MVN ORR RSB RSC SBC STC STM Instruction Move register to PSR status/flags Multiply Move negative register OR Reverse Subtract Reverse Subtract with Carry Subtract with Carry Store coprocessor register to memory Store Multiple Action PSR: = Rm Rd: = Rm * Rs Rd: = 0xFFFFFFFF EOR Op2 Rd: = Rn OR Op2 Rd: = Op2 Rn Rd: = Op2 Rn 1 + C Rd: = Rn Op2-1 + C address: = CRn Stack manipulation (Push) ARM 명령어집합 42
명령어요약 - 4/4 Mnemonic STR SUB SWI SWP TEQ TST Instruction Store register to memory Subtract Software Interrupt Swap register with Memory Test bitwise equality Test bits Action <address>: = Rd Rd: = Rn Op2 OS call Rd: = [Rn], [Rn] := Rm CPSR flags: = Rn EOR Op2 CPSR flags: = Rn AND Op2 ARM 명령어집합 43
참고문헌 ARM Limited, The ARM Instruction Set, ARM University Program V1.0, 1996. Steve Furber, ARM System-on-Chip Architecture Second Edition, Addison-Wesley, 2000. David Seal, ARM Architecture Reference Manual Second Edition, Addison-Wesley, 2001. 상명대학교임베디드시스템소프트웨어트랙, http://et.smu.ac.kr, 2005. ARM 명령어집합 44