3.2 분기 명령어
분기 명령어 분기 명령어 명령어 유형 실행의 흐름을 변경하거나 어떤 루틴을 호출하는데 사용 if-else 문 loop (for, while, …) 함수 호출 명령어 유형 B{<조건>} label BL{<조건>} label BX{<조건>} Rm BLX{<조건>| label | Rm
PC (Program Counter) 다음 수행할 명령어의 주소를 간직하는 특수 목적의 레지스터 한 명령어를 수행하면 자동적으로 다음 주소로 증가 분기 명령어의 수행 : PC 값을 원하는 위치의 주소로 저장 ARM에서는 R15가 PC로 사용 0x1010 0x1014 ADD R0, R1, R2 0x1018 MOV R3, #4 0x101C MOV R4, #5 0x1020 SUB R5, R4, R3 0x1024 0x1028 0x102C PC : 메모리
직접 점프 (B) 명령어 표기법 동작 B{cond} label 24비트 offset을 32비트로 부호 확장한다. (1)의 결과를 왼쪽을 2비트 shift한다. PC PC + (2)의 결과 + 8 32MB 범위 내에서 점프 가능 프로그래머가 label로 표시한 곳으로 점프하며, (1),(2),(3)의 계산은 어셈블러가 한다.
직접 분기(B) 명령어 예제 B forward backward: ADD r1, r2, #4 ADD r1, r2, #4 SUB r1, r2, #4 backward: ADD r1, r2, #4 SUB r1, r2, #4 ADD r4, r6, r7 B backward HERE: B HERE
CMP R0, #0 BEQ LABEL1 CMP R0, #1 BEQ LABEL2 ... LABEL1: LABEL2: MOV R0, #1 CMP R0, #0 CMPNE R0, #1 BEQ LABEL ... LABEL: MOV R0, #1
프로그램 예제 1부터 10까지 더하기 MOV R0, #0 MOV R1, #1 LOOP: ADD R0, R0, R1 CMP R1, #10 BLE LOOP /* here R0 : 결과값 */
링크 (BL) 명령어 표기법 동작 BL{cond} label label : 24 비트 offset으로 2의 보수로 표현 동작 R14(LR: Link Register) PC (BL 다음 명령어 주소) B 명령어와 같이 점프 서브루틴(subroutine) 콜 명령어라고 한다. 돌아올 곳의 주소를 LR(R15)에 저장하고 점프한다.
서브루틴 콜 형식 ... BL SUB ADD R0, R1, R2 ... SUB: /* 함수 SUB 구현 */ MOV PC, R14 /* 함수 return */
분기 명령어의 기계어 형식 B offset BL offset BX Rm BLX offset BLX Rm <cond> 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 cond offset Rm H B offset BL offset BX Rm BLX offset BLX Rm <cond> - H : 24비트 오프셋의 비트 1 - Rm : R0 ~ R15 EQ 1 NE CS CC MI PL VS VC 1 HI LS GE LT GT LE AL NV