본문 바로가기
시스템 반도체/Arm

Arm Branch instruction ( 분기 명령어, B, BL )

by 전컴반 2022. 4. 7.
반응형
Branch instruction

 

 

signed_immed 에는 24 bit로 얼마나 떨어져 있는 곳으로 갈지 정한다. 

 

예를 들어 아래 코드를 봤을 때, foo에서 PC인데 foo까지 얼마나 떨어졌나 보면, 4칸 떨어져 있다. 그래서 우리는 4를 인코딩해서 24bit로 채워 넣는다고 생각한다.

 

하지만 Arm은 조금 다르게 PC + 8가 기준이 된다. 즉, PC +8에서 얼마나 떨어졌나를 가즌으로 24bit을 채운다. 아래의 경우에는 2칸 떨어져 있으니, 2를 24bit에 넣는다.

 

왜 이럴까?? piplined을 생각하면 된다. 5 stage라고 했을 때. b foo의 E단계에서 이동해야 한다는 걸 알았을 때는 이미 PC + 8이 된 다다음 명령어의 Fetch가 된 상태라 그렇다. 

 

1. B ( branch)

- L bit가 0일 때 해당된다. 아래에선 foo를 만나면 아래 명령어는 건너뛰고 sub부터 실행된다. 반대로 backword를 한다면 무한 루프에 해당한다.

 

    b foo           - PC
    add r1, r2, #4  - PC + 4
    add r0, r6, #2  - PC + 8
    add r3, r4, #3  - PC + 12
foo :
    sub r1, r2, $

 

2. BL (branch link)

- L bit가 1일 때 해당된다. b와 차이점은 뭐냐면 b는 PC를 업데이트하고 그만이지만, bl은 PC에 업데이트도 하고 레지스터 14번인 lr 레지스터에 돌아와서 실행할 다음 명령어의 주소를 업데이트한다. 즉, 리턴 주소를 저장하는 것이다. 

 

함수의 마지막에 mov pc, lr을 적어줘서 lr에 저장했던 주소를 pc로 업데이트한다. 근데 만약 함수 안에 또 다른 함수가 있어 BL을 한다면 어떻게 해야 할까?? 그때는 가지고 있던 lr의 정보를 메모리상에 저장한다.

반응형

댓글