B, BL, BX and BLX

TRACE32
Admin (토론 | 기여) 사용자의 2015년 5월 8일 (금) 10:25 판

(비교) ← 이전 판 | 최신판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 검색

B(Branch), BL(Branch with Link), BX(Branch indirect), BLX(Branch indirect with Link) 명령을 통해

현재 진행하던 코드 위치에서 다른 곳으로 분기할 수 있습니다.

 

 

B : Branch (immediate)

"B" 명령어 뒤에 지정된 상수값에 해당하는 주소로 분기하는 명령입니다.

아래의 "B 0x080048DE" 명령을 실행하면, 해당 번지(0x0800_48DE)로 분기하게 됩니다.

 

실행 전 :

 

실행 후 :

 

 

 

BL : Branch with Link (immediate)

"BL" 명령어 뒤에 지정된 상수값에 해당하는 주소로 분기하되,

현재의 PC(Program Counter)값 +0x2 번지의 복귀 주소값을 가지는 링크 레지스터(R14)에 남겨놓는 방식입니다.

 

아래의 경우 "BL 0x08004890" 명령을 수행하면 아래와 같은 동작이 이루어집니다.

1. "BL" 명령어 뒤의 상수값인 0x0800_4890 번지로 분기합니다. (Thumb 모드라 주소 끝이 홀수)

2. 현재 PC의 다음 명령어인 0x0800_488E 번지가 R14(링크 레지스터)로 복사됩니다.

자세한 것은 스크린샷을 통해 확인해 보시기 바랍니다.

 

실행 전 :

 

실행 후 :

 

 

 

BX : Branch indirect (register)

"BX" 명령어 뒤에 지정된 레지스터로 분기하는 명령입니다.

아래와 같이 "BX R0" 명령을 실행하면, R0의 값 (0x0800_53E9) 번지로 분기하게 됩니다.

 

실행 전 :

 

실행 후 :

 

 

 

BLX : Branch indirect with Link (register)

"BLX" 명령어 뒤에 지정된 레지스터의 값에 해당하는 주소로 분기하되,

현재의 PC(Program Counter)값 +0x2 번지의 복귀 주소값을 가지는 링크 레지스터(R14)에 남겨놓는 방식입니다.

 

아래의 경우 "BLX R0" 명령을 수행하면 아래와 같은 동작이 이루어집니다.

1. R0의 값인 0x0800_4845 번지로 분기합니다. (Thumb 모드라 주소 끝이 홀수)

2. 현재 PC의 다음 명령어인 0x0800_53DC 번지가 R14(링크 레지스터)로 복사됩니다.

자세한 것은 스크린샷을 통해 확인해 보시기 바랍니다.

 

실행 전 :

 

실행 후 :

 

 

경우에 따라서는 LDM(load multiple registers) 이나 POP(pop registers from stack) 명령을 통해,

스택에 저장된 주소값을 PC로 복사함으로써 Branch와 동일한 효과를 내기도 합니다.

관련하여서는 "Memory access instructions - PUSH and POP" 을 확인해 보시기 바랍니다.

 

이상으로 Cortex-M에서 사용되는 각종 분기문에 대해 알아보았습니다.

 

"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기