code worrior
DESCRIPTION
Code Worrior. SYSDEC. . CodeWarrior. CodeWarrior IDE(integrated development environment) 는 ARM 과 Thumb 명령어를 타겟으로 하는 C, C++, ARM assembly language code 를 개발하는 ARM Developer Suite 에 사용되는 IDE 이다. SYSDEC. . New Project. SYSDEC. . - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/1.jpg)
SYSDECSYSDEC <*SlideNumber*>
Code Worrior
![Page 2: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/2.jpg)
SYSDECSYSDEC <*SlideNumber*>
CodeWarrior
CodeWarrior IDE(integrated development environment) 는 ARM 과 Thumb 명령어를 타겟으로 하는 C, C++, ARM assembly language code 를 개발하는 ARM Developer Suite 에 사용되는 IDE 이다 .
![Page 3: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/3.jpg)
SYSDECSYSDEC <*SlideNumber*>
New Project
![Page 4: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/4.jpg)
SYSDECSYSDEC <*SlideNumber*>
Project 이름 입력
ARM executable image 생성을 위한 프로젝트
![Page 5: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/5.jpg)
SYSDECSYSDEC <*SlideNumber*>
결과
![Page 6: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/6.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 추가
마우스 오른쪽 버튼 클릭
![Page 7: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/7.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 추가 ( 다른 방법 )
![Page 8: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/8.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 선택
![Page 9: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/9.jpg)
SYSDECSYSDEC <*SlideNumber*>
Build Target 선택
원하는 타겟 설정
![Page 10: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/10.jpg)
SYSDECSYSDEC <*SlideNumber*>
Build Target
Debug, DebugRel, Release build targets Debug
소스 파일의 각각의 라인에 대해서 디버그 정보를 생성 DebugRel
소스 파일의 각각의 라인에 대해서 적당한 수준의 디버그 정보를 생성
Release 디버그 정보를 생성하지 않음
![Page 11: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/11.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 추가 결과
![Page 12: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/12.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 그룹 생성
파일 관리 용이
![Page 13: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/13.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일 그룹 생성 결과 (qsort_small)
![Page 14: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/14.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일을 파일 그룹으로 이동
![Page 15: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/15.jpg)
SYSDECSYSDEC <*SlideNumber*>
이동 결과
파일 그룹파일 이름
![Page 16: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/16.jpg)
SYSDECSYSDEC <*SlideNumber*>
파일이나 그룹의 삭제
![Page 17: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/17.jpg)
SYSDECSYSDEC <*SlideNumber*>
프로젝트 화면의 탭
Files 탭 파일 , 그룹 , 서브프로젝트
Link Order 탭 CodeWarrior 가 최종 결과 파일을 어떤 순서로 링크 하는가에 대한
정보 각각의 오브젝트 파일이 최종 binary 타겟 파일에 위치하는 순서
Targets 탭 Debug, Release, DebugRel
![Page 18: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/18.jpg)
SYSDECSYSDEC <*SlideNumber*>
Build Target Setting
현재의 타겟
![Page 19: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/19.jpg)
SYSDECSYSDEC <*SlideNumber*>
텍스트 에디터 호출
파일 이름을 더블 클릭
![Page 20: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/20.jpg)
SYSDECSYSDEC <*SlideNumber*>
텍스트 에디터
![Page 21: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/21.jpg)
SYSDECSYSDEC <*SlideNumber*>
Build Target 내부 설정
![Page 22: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/22.jpg)
SYSDECSYSDEC <*SlideNumber*>
Target 이름 및 링커 종류의 설정
![Page 23: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/23.jpg)
SYSDECSYSDEC <*SlideNumber*>
Access Path
User header 파일 혹은 library 파일의 search path 설정 C system header 파일 혹은 library 파일의 search path 설정
![Page 24: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/24.jpg)
SYSDECSYSDEC <*SlideNumber*>
File Mapping
파일 이름의 확장자를 ARM C compiler 와 같은 툴의 plug-in 과 연계시킨다 .
![Page 25: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/25.jpg)
SYSDECSYSDEC <*SlideNumber*>
Assembler 설정
![Page 26: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/26.jpg)
SYSDECSYSDEC <*SlideNumber*>
C 컴파일러 설정
![Page 27: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/27.jpg)
SYSDECSYSDEC <*SlideNumber*>
Qsort_small
![Page 28: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/28.jpg)
SYSDECSYSDEC <*SlideNumber*>
Make
make 버튼을 클릭한 후 error 나 warning 없이 컴파일이 끝났다 .
![Page 29: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/29.jpg)
SYSDECSYSDEC <*SlideNumber*>
Make Window
errors warnings 그 밖의 message
error 가 난 위치
![Page 30: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/30.jpg)
SYSDECSYSDEC <*SlideNumber*>
Debugger 의 선택
![Page 31: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/31.jpg)
SYSDECSYSDEC <*SlideNumber*>
Argument 설정
![Page 32: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/32.jpg)
SYSDECSYSDEC <*SlideNumber*>
Debugging 과 Running
Run 또는 Debug 버튼을 누르면 AXD (ARM eXtended Debugger) 가 자동으로 실행된다 .
RunDebug
![Page 33: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/33.jpg)
SYSDECSYSDEC <*SlideNumber*>
AXD 의 실행
![Page 34: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/34.jpg)
SYSDECSYSDEC <*SlideNumber*>
ARM eXtended Debugger(AXD)
![Page 35: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/35.jpg)
SYSDECSYSDEC <*SlideNumber*>
디버깅 시스템의 타겟
ARMulator (Software) Architecture simulator
Multi-ICE (Hardware) 또는 Vbox-pro JTAG 기반
ARM Debugger AXD
RDI
ARMulator
Target simulated in
software
RDI
Multi-ICE
ARM development
board
Remote Debug Interface (RDI)
![Page 36: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/36.jpg)
SYSDECSYSDEC <*SlideNumber*>
AXD 의 타겟 설정 (1)
ARM920T 로 바로 연결이 안 된다면 AXD 메뉴바의 Options Configure Targets 를 선택 !
![Page 37: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/37.jpg)
SYSDECSYSDEC <*SlideNumber*>
Debug Target 의 설정
![Page 38: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/38.jpg)
SYSDECSYSDEC <*SlideNumber*>
Armulator 로 설정
![Page 39: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/39.jpg)
SYSDECSYSDEC <*SlideNumber*>
Armulator 의 설정
![Page 40: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/40.jpg)
SYSDECSYSDEC <*SlideNumber*>
AXD Window
log window
disassembled image default break point
![Page 41: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/41.jpg)
SYSDECSYSDEC <*SlideNumber*>
ARMulator 를 이용한 Simulation
AXD 의 Execute menu 에서 “ Go” 를 선택 또는 “ Go” 버튼을 클릭
Default breakpoint main() 의 시작 지점에서 실행이 멈춤
실행의 계속 “Go” 를 클릭
프로그램 실행을 반복하려면 , File menu 바에서 “ Reload Current Image…” 를
클릭
![Page 42: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/42.jpg)
SYSDECSYSDEC <*SlideNumber*>
Go
![Page 43: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/43.jpg)
SYSDECSYSDEC <*SlideNumber*>
Qsort_small 실행 중
output 이 console window 에 나타난다 .
![Page 44: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/44.jpg)
SYSDECSYSDEC <*SlideNumber*>
Qsort_small 실행이 끝난 후
![Page 45: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/45.jpg)
SYSDEC
ARM7 의 6 가지 동작모드
User Mode 일반 응용 프로그램을 수행하는데 사용가능 ,
FIQ Mode IRQ 보다 좀 더 빠른 인터럽트 처리를 위해 있는 것
IRQ Mode 일반적으로 I/O 장치로부터의 입력이 들어오면 반응하는 흔히 말하는 인터럽트 EXCEPTION
Supervisor Mode OS 중 서비스 영역에서 동작하는 Mode
Abort Mode 명령어를 읽을 수 없거나 데이터를 읽거나 쓸 수 없는 상황에 사용
Undefined Mode ARM7 에 정의되어 있지 않은 명령어를 만났을 경우에 발생 .
SYSDEC <*SlideNumber*>
![Page 46: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/46.jpg)
SYSDEC
ARM state
SYSDEC <*SlideNumber*>
RO~R7
R8~R12
SP(Stack pointer)
LR(Link Register)
PC
CPSR
SPSR
-PC(R15): R15 는 다른 CPU 에서의 PC 와 같은 역할을 한다 . ARM 어셈블러는 PC 라는 키워드와 R15 를 동일하게 취급 .
-SP (R13) :ARM7 에는 스택을 위한 명령어가 따로 없다 . SP 라는 키워드를 사용하여 R13 을 쓸 수 있다 .
-LR (R14):ARM7 에서는 CALL, RET 과 같은 명령어가 없다 . 대신 Branch with link(BL) 라는 명령어가 있는데 , 해당 명령어를 수행하여 CALL 과 비슷하게 다음에 수행될 PC(R15) 값을 LR(R14) 에 넣고 분기번지를 PC(R15) 에 넣고 분기한다 .함 호출 시 , 복귀할 명령어 주소가 저장되 있음
![Page 47: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/47.jpg)
SYSDECSYSDEC <*SlideNumber*>
-ARM7 은 32bit status register(=PSR,CPSR) 가 6 개 있다 .-CPSR: Flag bits + control bits-SPSR: 이전에 저장된 프로그램 상태 레지스터
N: 연산결과가 마이너스 일 때Z: 연산결과가 0 이었을 때 C: 연산결과가 자리올림이나 내림이 발생한 경우V: 연산결과가 오버 플로우 됐을 때
CPU 의 6 개 동작상태를 나타냄 .
![Page 48: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/48.jpg)
SYSDECSYSDEC <*SlideNumber*>
Mode_USR EQU 0X10 유저 모드 선택 비트
Mode_IRQ EQU 0X12 일반 인터럽트 처리 모드
Mode_SVC EQU 0X13 운영체제를 위한 보호 모드
IRQ_Stack EQU RAM_Limit IRQ 스택의 Top pointer 정의 (stack 영역은 1k)
SVC_Stack EQU RAM_Limit-1024 SVC 메모리스택의 Top pointer(stack 영역은 8k)
USR_Stack EQU SVC_Stack-1024 USR 스택의 Top pointer
I_Bit EQU 0X80 IRQ 불가능
F_Bit EQU 0X40 FIQ 불가능
![Page 49: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/49.jpg)
SYSDEC
부트 코드 작성 ( 시스템의 초기화 동작 )
• 1. Entry point 정의• 2. 예외처리 벡터 설정• 3. 불필요한 하드웨어 동작 중지• 4. 시스템 클록 설정• 5. 메모리 시스템 초기화• 6. 스택 영역 설정• 7. IRQ 예외처리 핸들러 설정 및 IRQ 인터럽트 Enable • 8. C 에서 사용하는 변수 초기화 .• 9. C 코드로 분기
![Page 50: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/50.jpg)
SYSDEC
1. Entry point 정의
AREA Init, CODE, READONLY
--- Define entry point
EXPORT __main ; defined to ensure that C runtime system
__main ; is not linked in
ENTRY
어셈블러로 구성되며 모든 프로그램에는 반드시 필요하다 .일반적으로 init.S, startup.s 등의 이름을 사용한다 .
![Page 51: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/51.jpg)
SYSDEC
2. 예외처리 벡터 설정
Vector_Init_BlockLDR PC, Reset_AddrLDR PC, Undefined_AddrLDR PC, SWI_AddrLDR PC, Prefetch_AddrLDR PC, Abort_AddrNOPLDR PC, IRQ_AddrLDR PC, FIQ_Addr
Reset_Addr DCD Reset_HandlerUndefined_Addr DCD Undefined_HandlerSWI_Addr DCD SWI_HandlerPrefetch_Addr DCD Prefetch_HandlerAbort_Addr DCD Abort_Handler
DCD 0 ; Reserved vectorIRQ_Addr DCD IRQ_HandlerFIQ_Addr DCD FIQ_Handler
*Reset_Addr 명령어는 Reset_Handler 호출을 하게 된다 .
![Page 52: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/52.jpg)
SYSDEC
3. 불필요한 하드웨어 동작 중지
시스템 초기화를 방해하는 하드웨어 동작 중지 와치독 타이머 중지 예
LDR r0, =0x53000000 @ R0 에 주소 0x53000000
값을 기록한다 .
LDR r1, =0x0 @ R1 에 설정할 레지스터 값을 기록한다 .
STR r1, [r0] @ R0 주소에 R1 을 기록한다 .
![Page 53: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/53.jpg)
SYSDEC
4. 시스템 클록 설정
CLOCK 설정 예 LDR r0, =0x4C000014 @ R0 에 CLKDIVN 레지스터의 주소
기록LDR r1, =0x3 @ R1 에 설정할 레지스터 값을 기록한다 .
@ FCLK : HCLK : PCLK = 1:2:4STR r1, [r0] @ R0 주소에 R1 을 기록 , CLKDIVN
설정LDR r0, =0x4C000004 @ R0 에 MPLLCON 레지스터의 주소
기록LDR r1, =0xa1031 @ R1 에 설정할 레지스터 값을 기록
@ 202.8MHz 출력 사용하도록 설정STR r1, [r0] @ R0 주소에 R1 을 기록 , MPLLCON
설정
![Page 54: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/54.jpg)
SYSDEC
5. 메모리 시스템 초기화
• 사용되는 메모리의 데이터 버스 폭 , 억세스 타이밍 등
LDR r0, =0x4800000C @ R0 에 BANKCON2 레지스터의 주소를 기록LDR r1, =0x00002A50 @ R1 에 설정할 레지스터 값 기록STR r1, [r0] @ R0 주소에 R1 을 기록 , BANKCON2 설정
![Page 55: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/55.jpg)
SYSDEC
6. 스택 영역 설정
#define STACK_BASE_ADDR 0x33ff8000
#define UserStack STACK_BASE_ADDR - 0x3800 /* USR 스택 base */
#define SVCStack STACK_BASE_ADDR - 0x2800 /* SVC 스택 base */
#define UndefStack STACK_BASE_ADDR - 0x2400 /* Undef 스택 base */
#define AbortStack STACK_BASE_ADDR - 0x2000 /* Abort 스택 base */
/* IRQ mode stack */
orr r1,r0,#0x12 /* IRQ 모드 값 지정 */
msr cpsr_c,r1 /* IRQ 모드로 변환 */
ldr sp,=IRQStack /* IRQ 모드 스택 설정 */
![Page 56: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/56.jpg)
SYSDEC
7. IRQ 예외처리 핸들러 설정 및 IRQ 인터럽트 Enable
MOV R0, #Mode_SVC:OR:F_Bit ; Only IRQ enabledMSR CPSR_c, R0
SYSDEC <*SlideNumber*>
Mode_SVC =>SVC 모드 선택I_Bit =0X80=> IRQ DisableF_Bit =0X40=> FIQ Disable
즉 , SVC 모드에서 IRQ 디스에이블
Mode_FIQ / Mode_UNDEF/ Mode_ABT 등이 올 수 있으며인터럽트가 불가능하게 세팅
![Page 57: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/57.jpg)
SYSDEC
8. C 에서 사용하는 변수 초기화•소프트웨어 동작을 위한 메모리 구조Boot code image 의 R/W data 의 writing 이 가능하기 위해 image 를 RAM 으로 copy 해야 한다 .
![Page 58: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/58.jpg)
SYSDEC
8. C 에서 사용하는 변수 초기화 .
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialize
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialize
LDR r0, =|Image$$RO$$Limit| ;ROM 데이터의 포인터를 가져온다 .
LDR r1, =|Image$$RW$$Base| ; RAM 복사LDR r3, =|Image$$ZI$$Base| ; Zero init base => top of initialized data
CMP r0, r1 ; ROM 과 RAM 의 데이터가 다른지 비교BEQ %F1
0 CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ; LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ; STRCC r2, [r1] + ADD r1, r1, #4BCC %B0
1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2 CMP r3, r1
STRCC r2, [r3], #4
BCC %B2
ROM 에 있는 데이터를 RAM 으로 COPY
RAM ZI 을 0 으로 초기화
![Page 59: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/59.jpg)
SYSDEC
9. C 코드로 분기
• 모든 초기 설정이 완료되면 C 함수를 수행할 수 있다 . 임베디드의 경우 main 함수를 사용하는 경우도 있지만 대부분 Main 또는 C_Entry 와 같은 함수를 사용한다 .
IMPORT C_Entry // 응용 프로그램으로 진입 [ :DEF:THUMB
ORR lr, pc, #1BX lrCODE16 ; Next instruction will be Thumb
]BL C_Entry
BX lr // 모드변화를 하면서 점프함 . // 즉 ARM->Thumb 또는 Thumb->ARM 으로 모드 변화되면서 점프
![Page 60: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/60.jpg)
SYSDEC
semihosting
MOV r0, #0x18 ; angel_SWIreason_ReportExceptionLDR r1, =0x20026 ; ADP_Stopped_ApplicationExit[ :DEF: THUMB
SWI 0xAB ; Angel semihosting Thumb SWI|
SWI 0x123456 ; Angel semihosting ARM SWI]
SYSDEC <*SlideNumber*>
Semihosting:타겟에서 수행되는 코드중 I/O 에 관련되는 코드를 캡쳐해서 I/O 를 타겟에서 수행하는 것이 아니라 디버거를 구동하는 호스트 시스템에서수행하는 기능이다 . Semihosting 은 SWI 를 유발한다 .디버거랑 서로 Matche 된 number 이면 semihosting 이 동작한다 .
![Page 61: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/61.jpg)
SYSDEC
Load and store Multiple instructions
Load (memory->register) and store (register->memory_ multiple instruction 은 블록 단위로 memory 의 데이터 내용을 모든 범용 레지스터들로 load 하거나 반대로 모든 범용 레지스터들의 내용을 memory 로 story 하기 위해 사용한다 . LDM/STM 명령어를 사용하는 동안은 Interrupt 를 수행하지 못한다 .
SYSDEC <*SlideNumber*>
스택관련 스택과 관련없이
LDMFD/STMFD LDMIA/STMIA
LDMED/STMED LDMIB/STMIB
LDMFA/STMFA LDMDA/STMDA
LDMEA/STMEA LDMDB/STMDB
![Page 62: Code Worrior](https://reader036.vdocuments.net/reader036/viewer/2022062722/5681399b550346895da13395/html5/thumbnails/62.jpg)
SYSDEC
Setup interrupt /exception vectors
If the ROM is at address 0 this is just a sequence of branches
B Reset_Handler //B 무조건 분기 명령어 ; 현 위치에서 Reset_Handler 로 분기
B Undefined_Handler
B SWI_Handler
B Prefetch_Handler
B Abort_Handler
NOP; Reserved vector
B IRQ_Handler
B FIQ_Handler
ELSE
MOV R8, #0
ADR R9, Vector_Init_Block
LDMIA R9!, {R0-R7}
STMIA R8!, {R0-R7}
LDMIA R9!, {R0-R7}
STMIA R8!, {R0-R7}
LDMIA R9!,{R0-R7} => 8 개 레지스터에 저장될 내용 (4byte*8=32bytes) 을 R9 가 가리키는 주소로부터 읽어서 R0,R1,R2,R3,R4,R5,R6,R7 에 저장하는 것 .