분기문 - 두 수 중 큰 값을 반환
max_prac:
cmp r0,r1 @ compare with r0, r1 based on r0
bge 1f @ greator equal
blt 2f @ less than
1: @ r0가 더 클때
mov r0, r0
bx lr
2: @ r1가 더 클때
mov r0, r1 @ r0이 반환 레지스터이기 때문에 결과를 r0에 저장
bx lr @ 복귀주소로 복귀
- AAPCS에 의해 r0에는 인자1, r1에는 인자2가 들어감
- r0과 r1을 r0 기준으로 비교
- r0이 크거나 같으면 분기 1, r1이 크면 분기 2
- 리턴 레지스터가 r0이므로, 큰 값을 r0에 넣어두고 반환
비트 연산 - 특정 비트 클리어
.global clear_unused
clear_unused:
mov r2,#1 @r2에 숫자 1저장
lsl r2, r1 @ logical shift left, r1만큼 왼쪽으로 민다
bic r0, r2 @ bit clean, r0에서 r2의 비트만 clear한다
bx lr
.global clears_unused
clears_unused:
bic r0, r1 @ r1에 pattern이 온다
bx lr
방식 1: 비트 번호로 클리어
- r1에 클리어할 비트 번호 저장
- r2 = (1 << r1)
- bic r0, r2로 해당 비트만 클리어
방식 2: 비트 패턴으로 클리어
- r1에 클리어할 bit mask (패턴)을 저장
- bic r0, r1로 여러 비트를 한 번에 클리어
루프문 - start부터 end까지의 합
.global sum
sum: @ r0 = start, r1 = end
mov r2, #0 @ r2는 sum, 초기화
loop1:
add r2, r0
add r0, #1
cmp r1, r0 @ start와 end를 비교
bge loop1 @ r2가 r1보다 크면
mov r0, r2
bx lr
- r0 = 시작값, r1 = 끝값
- r2 = 누적합 (sum)
- r0부터 r1까지 반복하면서 r2에 누적
- 반복이 끝나면 결과를 r0에 담아 리턴
참고: AAPCS란?
- AAPCS (ARM Architecture Procedure Call Standard)는 함수 호출 시 레지스터 사용 규약.
- r0 ~ r3 → 인자 전달용
- r0 → 반환값 전달
- lr → 복귀 주소 저장 (bx lr 로 복귀)