



GLOBAL Reset_Handler
AREA Prog1, CODE, READONLY
ENTRY
ARM
Reset_Handler
MOV r0, #0x11 ; 초기 값을 로드합니다
LSL r1, r0, #1 ; 1비트 왼쪽으로 시프트합니다
LSL r2, r1, #1 ; 1비트 왼쪽으로 시프트합니다
stop
B stop ; 프로그램을 멈춥니다
END
GLOBAL Reset_Handler: Reset_Handler 라벨을 전역으로 정의AREA Prog1, CODE, READONLY: 읽기 전용 코드 영역을 정의.ENTRY: 프로그램의 진입점을 표시.ARM: ARM 명령어 시퀀스의 시작을 알림.Reset_Handler: 리셋 핸들러의 시작을 나타내는 라벨.MOV r0, #0x11: 레지스터 r0에 0x11 값을 로드.LSL r1, r0, #1: 레지스터 r0의 값을 1비트 왼쪽으로 시프트하고, 결과를 레지스터 r1에 저장.LSL r2, r1, #1: 레지스터 r1의 값을 1비트 왼쪽으로 시프트하고, 결과를 레지스터 r2에 저장.stop: 이 라벨은 프로그램을 멈추는 지점을 표시.B stop: 프로그램 실행을 멈추고, stop 라벨로 무한 루프를 형성.END: 소스 파일의 끝을 나타냄.따라서, AREA 지시어가 Prog1이라는 코드 영역을 정의하고, 이 영역이 읽기 전용(READONLY)이므로, 그 안에 포함된 모든 명령어는 읽기 전용 코드 영역에 속하게 됨.


Startup.s 이름을 두 번 클릭하여 해당 파일을 엶.; Reset Handler
EXPORT Reset_Handler ; Reset_Handler를 외부로 내보내도록 설정
Reset_Handler ; Reset_Handler 레이블
ENTRY ; 이 프로그램의 진입점
MOV r6, #10 ; 레지스터 r6에 10을 로드
MOV r7, #1 ; 레지스터 r7에 1을 로드. n의 초기값을 설정
loop ; 루프 시작
CMP r6, #0 ; r6와 0을 비교
MULGT r7, r6, r7 ; 만약 r6가 양수라면 r7에 r6 * r7의 결과를 저장
SUBGT r6, r6, #1 ; 만약 r6가 양수라면 r6에서 1을 뺍니다. (n을 감소시캄.)
BGT loop ; r6가 0이 아니라면 loop 레이블로 분기
stop B stop ; 프로그램을 중단하는 레이블
; User Initial Stack & Heap
; IF :DEF:__MICROLIB
;
; EXPORT __initial_sp
; EXPORT __heap_base
; EXPORT __heap_limit
;
; ELSE
; IMPORT __use_two_region_memory
; EXPORT __user_initial_stackheap
;__user_initial_stackheap
; LDR R0, = Heap_Mem
; LDR R1, =(Stack_Mem + Stack_Size)
; LDR R2, = (Heap_Mem + Heap_Size)
; LDR R3, = Stack_Mem
; BX LR
; ALIGN
; ENDIF
__MICROLIB가 정의되어 있으면 __initial_sp, __heap_base, __heap_limit을 외부로 내보내도록 설정__use_two_region_memory를 가져와서 __user_initial_stackheap을 외부로 내보냄.만약 주석이 없다면...
- LDR R0, =Heap_Mem
: Heap_Mem 주소를 로드하여 레지스터 R0에 저장합니다.- LDR R1, =(Stack_Mem + Stack_Size)
: Stack_Mem과 Stack_Size를 합한 주소를 로드하여 레지스터 R1에 저장합니다.- LDR R2, =(Heap_Mem + Heap_Size): Heap_Mem과 Heap_Size를 합한 주소를 로드하여 레지스터 R2에 저장합니다.
- LDR R3, =Stack_Mem
: Stack_Mem 주소를 로드하여 레지스터 R3에 저장합니다.- BX LR:
서브루틴에서 복귀할 위치를 레지스터 LR에 저장한 후 서브루틴을 종료합니다.- ALIGN
: 다음 명령어를 정렬합니다.- ENDIF
: 조건부 컴파일 지시어를 마칩니다. 하지만 주어진 코드에서 이전에 IF 조건문이 주어지지 않았으므로 이것은 현재 사용되지 않는 코드

코드는 ARM7TDMI의 0x00000000 주소에서 시작
이 주소는 보통 예외 벡터 테이블(exception
vector table)이 있는 곳
그렇기에 예외 처리가 필요하지 않으면 그 곳에 코드를 넣을 수 있음
툴은 일반적으로 디폴트 리셋 핸들러(reset handler)가 벡터 테이블에 있을 것으로 예상하지만 지금은 이를 사용하지 않음. 따라서 툴이 프로그램을 리셋 핸들러로 믿도록 프로그램을 만듦.
Cortex-M4용 코드 작성도 동일한 방식. C 코드를 컴파일할 때 만드는 예외 처리기(exception handler)와
어셈블리 코드는 제외

startup.s 코드 포함 여부는 초기화 코드의 유무라고 볼 수 있음
: 우리는 작은 어셈블리 프로그램을 만들고 있으므로 초기화 코드가 따로 필요 없음.

startup.s파일을 사용하지 않고 있기에 사용자의 어셈블리 코드를 reset handler로 표기하고 이를 전역으로 선언




; User Initial Stack & Heap
; IF :DEF:__MICROLIB
;
; EXPORT __initial_sp
; EXPORT __heap_base
; EXPORT __heap_limit
;
; ELSE
; IMPORT __use_two_region_memory
; EXPORT __user_initial_stackheap
;__user_initial_stackheap
; LDR R0, = Heap_Mem
; LDR R1, =(Stack_Mem + Stack_Size)
; LDR R2, = (Heap_Mem + Heap_Size)
; LDR R3, = Stack_Mem
; BX LR
; ALIGN
; ENDIF
