"B, BL, BX and BLX"의 두 판 사이의 차이
65번째 줄: | 65번째 줄: | ||
<p> </p> | <p> </p> | ||
<p><span style="font-family: malgun;">이상으로 Cortex-M에서 사용되는 각종 분기문에 대해 알아보았습니다.</span></p> | <p><span style="font-family: malgun;">이상으로 Cortex-M에서 사용되는 각종 분기문에 대해 알아보았습니다.</span></p> | ||
− | <p><span style="font-family: malgun;">잘못된 사항이나 추가 문의사항은 TRACE32@ | + | <p><span style="font-family: malgun;">잘못된 사항이나 추가 문의사항은 TRACE32@hancommds.com 으로 연락 부탁드립니다.</span></p> |
<p> </p> | <p> </p> | ||
<p><span style="font-family: malgun;">"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</span></p> | <p><span style="font-family: malgun;">"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</span></p> |
2020년 7월 24일 (금) 12:50 기준 최신판
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@hancommds.com 으로 연락 부탁드립니다.
"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기