ARM Development Suite v1.2
ARM 동작 모드
ARM 레지스터
Program Status Register N Z C V I F T M Reserved 31 30 29 28 27 8 7 6 5 4 Control field Extension field Status field Flag field Condition Code Flags N Negative result from ALU Z Zero result from ALU C ALU operation caused Carry V ALU operation oVerflowed Mode bits M[4:0] Mode 0b10000 User 0b11111 System 0b10001 FIQ 0b10010 IRQ 0b10011 Supervisor 0b10111 Abort 0b11011 Undefined Control bits I 1: disables IRQ F 1: disables FIQ T 1: Thumb, 0: ARM
Flag field N (Negative/Less Than Flag) Z (Zero Flag) 연산 결과가 음수 1, 양수 0 Z (Zero Flag) 연산 결과가 0 1, 0이 아니면 0 C (Carry/Borrow/Extend Flag) 자리 올림이나 내림이 발생한 경우, Shift 연산 등에서 사용 덧셈 명령 (CMN 포함): 캐리 발생시 1 뺄셈 명령 (CMP 포함): borrow 발생시 0 Shift 명령 : 마지막으로 쉬프트되어 나온 비트 V (Overflow Flag) 연산의 결과 (덧셈, 뺄셈)가 오버플로우 되었을 경우 1
Conditional Instruction
CMN – 음수이면 C,Z set TEQ – 같으면 Z set TST – 1이 아니면 Z set
ARM 명령어 실습 CodeWarrior 에서 New Project 생성 새로운 파일 생성 파일이름.s AREA ARMex, CODE, READONLY ENTRY start … stop B . END
ARM 명령어 실습1 실습 1 start MOV R0, #0 ADD R0, R0, 1 MOV R1, #0xFF BIC R2, R1, #0xFD CMP R0, R2 SUB R3, R1, R2, LSL #2 LDR R2, =0x12345678 LDR R3, =0xAABBCCDD MOV R0, R2, LSR #24 ORR R3, R0, R3, LSL #8 stop
ARM 명령어 실습2 실습 2 start LDR R0, =0xFFFFFFFE LDR R1, =0x0 LDR R2, =0xFFFFFFFF LDR R3, =0x0 add64 ADDS R0, R0, R2 ADC R1, R1, R3 sub64 SUBS R0, R0, R2 SBC R1, R1, R3 stop
ARM 명령어 실습 if ( x >= y ) R0 = R0 * 100 + R1 의 연산을 수행하기 위한 어셈블리어를 작성하고 실습한다.(단, MUL명령어 사용 금지) 다음과 같은 C 언어 코드를 수행하는 어셈블리어를 작성한다. x, y 의 값을 다양하게 변경해서 결과를 확인한다. if ( x >= y ) x = x – y;
메모리 접근 명령어 주소지정 방식 간접 주소지정 방식 베이스 레지스터 기반 LDR r0, [r1, #-4] LDR r0, [r1, -r2] LDR r0, [r1, -r2, LSL #4] LDR r0, [r1, r2, LSL #4] LDR r0, [r1, r2, RRX]
메모리 접근 명령어 자동 증가/감소 기능 Pre-index Post-index ※ C++의 연산자 ++ <offset_mode> := [Rn, offset_value]! 일반 방식과 동일하게 메모리 접근 주소값 계산 후 접근 메모리 접근 후에 베이스 레지스터 값 update Post-index <offset_mode> := [Rn], offset_value 베이스 레지스터 값으로 메모리 접근 ※ C++의 연산자 ++
메모리 접근 명령어 LDR r0, [r1] STR r0, [r1, #4] LDR r0, [r1, #-4]! r0 ← MEM[r1] STR r0, [r1, #4] r0 → MEM[r1+4] LDR r0, [r1, #-4]! r0 ← MEM[r1 – 4], r1 ← r1 – 4 STR r0, [r1], #0xC r0 → MEM[r1], r1 ← r1 + 0xC r0 ← MEM[r1 + (r2<<2)] LDR r0, [r1, r2, LSL #2]
메모리 접근 명령어 접근 단위에 의한 분류 영-확장, 부호-확장 Word Half-word Byte LDR/STR Word LDRH/STRH Half-word LDRB/STRB Byte 영-확장, 부호-확장 LDRSH/LDRSB Signed-extension 32-bit 레지스터에 half-word로 읽어온 뒤에 남는 앞부분을 부호비트로 채움 LDRH/LDRB Zero-extension 남는 앞부분을 0으로 채움
ARM 명령어 실습 1 CodeWarrior 에서 New Project 생성 새로운 파일 생성 01.s ADR R0, table1 LDR R1, [R0] LDRB R2, [R0] LDRSB R3, [R0] LDRH R4, [R0] LDRSH R5, [R0] STR R1, [R0, #4] STRB R2, [R0, #8] STRH R3, [R0, #12] ADD R7, R7, #0 table1 DCD 0x1234ABCD, 0x0, 0x0, 0x0
ARM 명령어 실습 2 CodeWarrior 에서 New Project 생성 새로운 파일 생성 02.s ADR R0, table1 MOV R11, #4 MOV R12, #1 LDR R1, [R0, R11]! LDRB R2, [R0, R12, LSL #2] LDRSB R3, [R0], R11 LDRH R4, [R0], #-2 LDRSH R5, [R0] ADD R7, R7, #0 table1 DCD 0x0, 0x12345678, 0x87654321, 0x0