ISA 심화 및 start.S code 분석 SIOR 15th 최재훈
Index ARM Instruction Set start.S code 분석 ARM Instruction의 특징 Branch 명령 Data Processing PSR Transfer Multiply 명령 Single Data Transfer 명령 Block Data Transfer 명령 SWAP 명령 SWI 명령 start.S code 분석
ARM Instruction Set
ARM Instruction의 특징 32bit 하나의 Word로 처리 상대주소 방식 사용 Condition code를 모든 명령어에 적용가능 high code density – 16bit Thumb mode 지원 예제 a=(b==c) ? d:e; CMPS r2, r3 MOVEQ r1, r4 MOVNE r1, r5
Branch and Branch with Link L - Link bit [ 0 : B , 1 : BL ] Offset 값은 2bit를 PC에서 left shift 32Mb Memory 접근 (원래 24bit offset :16Mb) Brach 형식 : B{L}{cond}<expression> {L} : BL일 때는 Linker인 R14에 PC 값을 넣는다. {cond} : 조건 코드이다. 없을 때는 AL가 된다. <expression> : 목적 주소를 적는다 예제 B start /* ALways condition used as default */ CMP R1, #0 /* compare R1 with zero and branch to fred */ BEQ end /* if R1 was zero otherwise continue to next In next instruction */
Data Processing Instruction
Data Processing Ins (cont…) <cond> [31:28] 4bit <I> [25] 1bit Operand2 의 immediate operand 여부 <OpCode> [24:21] 4bit
Data Processing Ins (cont…) <S> [20] 1bit S bit 1 CPSR 영향 有 S bit 0 CPSR 영향 無 <Rn> [19:16] 첫 번째 Operand Register 로 지정되어야 함 명령에 따라 사용하지 않음 MOV, MVN <Rd> [15:12] 4bit Operation의 결과가 저장될 Register
Data Processing Ins (cont…) Operand2 [11:0] 12bit Register Operand [ shift (11:4) | Rm (3:0) ] shift field [ cont(5) | type(2) | 0(1) ] [ Rs(4) | 0(1) | type(2) | 1(1) ] type 00 : logical left (LSL) 01 : logical right (LSR) 10 : arithmetic right (ASR) 11 : rotate right (ROR) Immediate Operand [ Rotate (11:8) | Imm (7:0) ] 8bit 32bit Rotate 값 * 2
Data Processing Instruction EX [ex1] MOV r0, r1 [ex2] MOV r0, #0 [ex3] MOV r0, #0xfc000003 [ex4] MOV r0, r1, LSL #1 [ex5] MOV r0, r1, LSR r2 [ex6] MOVS r0, r1, LSR #1 MOVCC r0, #10 MOVCS r0, #11
PSR Transfer 명령 MSR{cond} Rd, <psr> : Transfer PSR contents to a register MSR{cond} <psr>, Rm : Transfer register contents to PSR MSR{cond} <psrf>, Rm : Transfer Register contents to PSR flag bits only [ex] MSR CPSR_all, r0 user mode에서 수행되었다면, control bit들은 영향을 받지 않고 flag bit만 영향 받음 모드전환 예제 MRS R0, CPSR_all ; Copy the PSR BIC R0, R0, #&1F ; Clear the mode bits ORR R0, R0, #new_mode ; Set bits for new mode MSR CPSR_all, R0 ; Write PSR back, change mode
Multiply 명령 MUL{cond}{s} Rd, Rm, Rs MLA{cond}{s} Rd, Rm, Rs, Rn MUL R1, R2, R3 ; R1 := R2*R3 MLA{cond}{s} Rd, Rm, Rs, Rn Rd := Rm * Rs + Rn 나눗셈에 대한 명령어는 존재하지 않는다.
Single Data Transfer
Single Data Transfer (cont…) Register와 외부 Memory와의 Data 전송담당 (Register 간 데이터 전송을 담당하는 MOV와 구분) 명령 형식 LDR{cond}{B} Rd, address{!} ; Rd := contents of Address LDR{cond}{B} Rd, =expression ; Rd := expression STR{cond}{b} Rd, address{!} ; contents of address :=Rd Pre-Indexed Addressing Mode Rn 을 Base 주소로 사용 LDR|STR {cond}{B} Rd, [Rn <offset>]{!} {B}는 부호 없는 바이트 전달(unsigned byte transfer) {!} : Write back auto indexing Post-Indexed Addressing Mode Effective Address는 항상 Rn. 즉 Base address를 나타내는 값 LDR|STR{cond}{B}{T} Rd, [Rn], <offset> {T} : Memory Translation 반드시 시스템 모드에서만 선택가능 Write back Default
Single Data Transfer (cont…) -------------------------------------------------- Mode Effective address Indexing ------------------------------------------------- [Rn] Rn none [Rn,+- expression] Rn +- expression Pre-indexed [Rn,+- Rm] Rn +- Rm Pre-indexed [Rn,+- Rm, shift cnt] Rn+-(Rm shifted by cnt) Pre-indexed [Rn],+-expression Rn Post-indexed [Rn],+-Rm Rn Post-indexed [Rn],+-Rm,shift cnt Rn Post-indexed -------------------------------------------------- # Rn : base 주소를 가지고 있는 레지스터 Rm : r15를 제외한 레지스터(Offset), 부호 값 사용 expression : -4095 - +4096 범위의 Immediate 값(12Bit) shift : LSL, LSR, ASR, ROR, RRX cnt : 1..31 사이의 값.
Block Data Transfer Multiple register transfer Instruction
Block Data Transfer (cont…) LDM, STM LDM : 베이스 레지스터(Rn)로 지정된 번지에서 레지스터 목록으로 지정된 각 레지스터의 내용을 읽어 들이는 명령 STM : LDM과 반대 LDM|STM {cond}<add mode> Rn{!} LDM 명령어는 Mnemonic 상의 16bit 공간 존재 각 bit가 Register 와1:1 Mapping 동작 모드 Post-Increment Addressing Pre-Increment Addressing Post-Decrement Addressing Pre-Decrement Addressing
Block Data Transfer (cont…) ============================================ 동작 Stack Other --------------------------------------- pre increment load LDMED LDMIB post increment load LDMFD LDMIA pre decrement load LDMEA LDMDB post decrement load LDMFA LDMDA pre increment store STMFA STMIB post increment store STMEA STMIA pre decrement store STMFD STMDB post decrement store STMED STMDA ============================================
SWAP, SWI Single Data SWAP Software Interrupt (SWI) SWP{cond}{B} Rd, Rm, [Rn] ; Rd:=[Rn] , [Rn]:=Rm 두 개의 Register의 값을 바꿔주는 명령어 Atomic Memory 동작 Non-Word Operation :: Byte Operation Software Interrupt (SWI) SWI{cond} <expression> 동작모드 변경 : User Supervisor 구체적인 동작 현재의 PC를 r14_svc에 저장한다. 현재의 상태 레지스터인 CPSR을 SPSR_svc에 저장한다. Supervisor 모드로 들어가서 IRQ를 Disable 한다. PC를 0x08로 setting하고, 그곳에서 instruction을 수행한다.
start.S code
start.S code의 필요성 스택의 초기화 임베디드 시스템의 기본적인 초기화 작업 메모리, 스택, 전역변수 초기화
Exception On Handler
Memory Initializing No need Address Decoder Programmable 메모리 시작주소 메모리 크기 메모리의 종류 (ROM, SDRAM, DRAM) Access Time Dram Reflash
Interrupt Processing H/W : FIQ, IRQ S/W : SWI Non-Vector 방식
Stack Initializing 스택 포인터에 베이스주소를 넣어줌 동작 모드 각각의 6개 스택포인터를 모두 초기화 MRS reg, CPSR/SPSR MSR CPSR_CXSF/SPSR, reg/immediate
전역변수 Initializing 지역변수 초기화는 해당 서브루틴에서 수행 전역변수는 “Data” 공간을 사용 전역변수는 C 프로그램이 수행되기 전에 초기화되어야 함 전역변수의 종류 ZI(Zero Init) - 초기화 되지 않은 변수, 배열 0 으로 초기화 RW(Read Write) – 초기화 값이 있는 것 초기화 작업이 필요 RO(Read Only) - 상수 초기화 작업이 필요로 하지 않는다.