7. 분기 명령어

이들은 보통 레이블로 지정된 대상 위치로 실행이 점프하게 합니다(label() 어셈블러 지시문 참조). 조건부 분기와 itite 명령어는 애플리케이션 프로그램 상태 레지스터(APSR)의 N(음수), Z(영), C(자리올림), V(오버플로) 플래그를 테스트하여 분기를 실행할지 여부를 결정합니다.

노출된 대부분의 어셈블러 명령어(이동 연산 포함)는 플래그를 설정하지만, 값을 테스트할 수 있도록 명시적인 비교 명령어가 있습니다.

조건 플래그의 의미에 대한 추가 세부 정보는 comparison instructions 절에 제공됩니다.

7.1. 문서 표기 규칙

표기: Rm은 ARM 레지스터 R0-R15를 나타냅니다. LABELlabel() 어셈블러 지시문으로 정의된 레이블을 나타냅니다. <condition>은 다음 조건 지정자 중 하나를 나타냅니다:

  • eq 같음(결과가 0이었음)

  • ne 같지 않음

  • cs 자리올림 설정됨

  • cc 자리올림 해제됨

  • mi 마이너스(음수)

  • pl 플러스(양수)

  • vs 오버플로 설정됨

  • vc 오버플로 해제됨

  • hi > (부호 없는 비교)

  • ls <= (부호 없는 비교)

  • ge >= (부호 있는 비교)

  • lt < (부호 있는 비교)

  • gt > (부호 있는 비교)

  • le <= (부호 있는 비교)

7.2. 레이블로 분기

  • b(LABEL) 무조건 분기

  • beq(LABEL) 같으면 분기

  • bne(LABEL) 같지 않으면 분기

  • bge(LABEL) 크거나 같으면 분기

  • bgt(LABEL) 크면 분기

  • blt(LABEL) 작으면 분기(<) (부호 있음)

  • ble(LABEL) 작거나 같으면 분기(<=) (부호 있음)

  • bcs(LABEL) 자리올림 플래그가 설정되어 있으면 분기

  • bcc(LABEL) 자리올림 플래그가 해제되어 있으면 분기

  • bmi(LABEL) 음수이면 분기

  • bpl(LABEL) 양수이면 분기

  • bvs(LABEL) 오버플로 플래그가 설정되어 있으면 분기

  • bvc(LABEL) 오버플로 플래그가 해제되어 있으면 분기

  • bhi(LABEL) 더 크면 분기(부호 없음)

  • bls(LABEL) 더 작거나 같으면 분기(부호 없음)

7.3. 긴 분기

위에 나열된 분기 명령어가 생성하는 코드는 분기 대상을 지정하는 데 고정된 비트 폭을 사용하며, 이는 PC 상대적입니다. 따라서 분기 명령어가 그 대상에서 멀리 떨어진 긴 프로그램에서는 어셈블러가 “branch not in range” 오류를 생성합니다. 이는 다음과 같은 “wide” 변형으로 극복할 수 있습니다

  • beq_w(LABEL) 같으면 긴 분기

와이드 분기는 명령어를 인코딩하는 데 4바이트를 사용합니다(표준 분기 명령어의 2바이트와 비교하여).

7.4. 서브루틴(함수)

서브루틴에 진입할 때 프로세서는 반환 주소를 레지스터 r14에 저장하며, 이는 링크 레지스터(lr)로도 알려져 있습니다. 서브루틴 호출 다음 명령으로의 반환은 링크 레지스터로부터 프로그램 카운터(r15 또는 pc)를 갱신하여 수행됩니다. 이 과정은 다음 명령어들로 처리됩니다.

  • bl(LABEL)

반환 주소를 링크 레지스터(r14)에 저장하면서 LABEL 다음 명령으로 실행을 이전합니다.

  • bx(Rm) Rm으로 지정된 주소로 분기.

일반적으로 bx(lr)는 서브루틴에서 반환하는 데 사용됩니다. 중첩된 서브루틴의 경우 내부 서브루틴 호출을 수행하기 전에 외부 스코프의 링크 레지스터를 (보통 스택에) 저장해야 합니다.