ARM Development Suite v1.2
ARM 명령어 복습 복습 ADR R0, table1 ;R0 = 0x8030 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] LDR R13, =freespace ;R13 = 0x8040 STMFD R13!, {R1, R2, R3, R4, R5} LDMFD R13!, {R6, R7, R8, R9, R10} ADD R7, R7, #0 table1 DCD 0x13579ACE, 0x87654321, 0x12345678, 0x0 tstack SPACE 20 freespace
Branch Instructions 상대 분기 절대 분기 하드웨어 분기 현재 PC 값을 기준으로 +/- 하여 분기 B/BL BX 하드웨어 분기 예외 발생시 하드웨어적으로 특정 번지로 절대 분기
ARM 명령어 실습 CodeWarrior 에서 ’06’ New Project 생성 새로운 파일 생성 파일이름.s AREA ARMex, CODE, READONLY ENTRY start … stop B . END
ARM 명령어 실습 start ; 작성할 부분 ; R0는 첫 번째 스트링의 시작 주소를 갖는다. ; R1은 두 번째 스트링의 ; BL을 사용하여 호출한다. ; 결과 확인 ; 첫 번째 스트링이 작으면 R0 < 0 ; 두 번째 스트링이 작으면 R0 > 0 ; 같으면 R0 = 0 stop B . strcmp LDRB R2, [R0], #1 LDRB R3, [R1], #1 CMP R2, #1 CMPCS R2, R3 BEQ strcmp SUB R0, R2, R3 MOV PC, LR str1 DCB "skskskskskks", 0 str2 DCB "eieieieiieieiei", 0 END
PSR (Program Status Register)
PSR Transfer Instructions MRS, MSR PSR에 값을 써넣거나 PSR에 있는 값을 레지스터에 저장하기 위해서는 MOV나 LDR 등의 명령을 쓰지 않고 위의 명령어 사용 MRS : PSR 값을 레지스터에 저장 MRS{<cond>} Rd, <psr> MSR : 레지스터의 값을 PSR에 저장 MSR{<cond>} <psr>_<fields>, Rm
PSR Transfer Instructions usr/sys 모드에서는 spsr을 접근할 수 없으며 cpsr의 제어필드는 usr모드에서 바꿀 수 없다. 특권모드에서는 cpsr의 제어필드를 바꾸어 인터럽트 마스크 설정 및 모드를 바꿀 수 있다. 그러나 T플래그를 변화시키는 것은 금지되어 있다. Ex) 특권 모드에서 SVC 모드로 바꾸기 위한 프로그램 MRS R0, CPSR ; CPSR를 읽어 R0에 적재한다. BIC R0, R0, #0x1F ; 읽어 온 데이터에 대하여 모드 비트를 0으로 설정한다. ORR R0, R0, #0x13 ; 모드 비트의 내용을 SVC 모드 값으로 바꾼다. MSR CPSR_c, R0 ; 바꾼 값을 다시 CPSR의 제어(control) 필드에 넣는다.
SWI (Software Interrupt) 소프트웨어적으로 예외를 발생시켜 USR모드에서 특권모드인 SVC 모드로 진입하기 위하여 사용 SWI{<cond>} <Immde_24> SWI 예외 발생시 R14_svc에 SWI 명령어의 다음 주소 값이 기록 R14_svc 값을 읽어 -4 한 값이 SWI 명령어의 주소 SWI 명령어를 읽어 LSB 24-bit 추출하여 SWI 번호 획득 SWI 번호에 따라 세부 핸들러 호출 SWI를 통한 세미호스팅(Semi-hosting) 기능 구현
SWP SWP 일종의 메모리 교환 명령어 LDR/STR를 한번에 처리 SWP{<cond>}{B} <Rd>, <Rm>, [<Rn>] 운영체제에서 제공하는 semaphore를 만들기 위하여 사용되는 이유로 semaphore 명령어라고도 불림
ARM 명령어 실습 CodeWarrior 에서 ’06_1’ New Project 생성 새로운 파일 생성 파일이름.s AREA ARMex, CODE, READONLY ENTRY start … stop B . END
ARM 명령어 실습 USERMODE EQU 0x10 initstack FIQMODE EQU 0x11 mrs r0, cpsr IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABTMODE EQU 0x17 UNDMODE EQU 0x1b MODEMASK EQU 0x1f UndefStack EQU (0x10000 + 0x400) AbortStack EQU (UndefStack + 0x400) IRQStack EQU (AbortStack + 0x400) FIQStack EQU (IRQStack + 0x400) SVCStack EQU (FIQStack + 0x400) AREA ARMex, CODE, READONLY ENTRY start BL initstack stop B . initstack mrs r0, cpsr bic r0, r0, #MODEMASK orr r1, r0, #ABTMODE msr cpsr_f, r1 ldr sp, =AbortStack orr r1, r0, #IRQMODE ldr sp, =IRQStack orr r1, r0, #FIQMODE ldr sp, =FIQStack orr r1, r0, #SVCMODE ldr sp, =SVCStack END
과제 다음과 같은 C 프로그램을 어셈블리어로 변환하여 동작시켜라.(점프 명령어를 사용해서) unsigned int source[100]; unsigned int destination[100]; unsinged int* src, int* dst; int i; src = source; dst = destination; for( i = 0; i < 100; i++) { *dst++ = *src++; }