3.4] RV32I 분기 명령어 (Branch Instruction)
>> 분기 명령어 (function와 같은 기능)
(1) 조건에 따른 분기 명렁어
(2) 무조건 분기
(1) 조건에 따른 분기 명령어
>> Conditional branch 명령어는고급언어의 if, while, for, case를사용한조건문에서 ‘==, != <, >, 드, 느’ 와같은조 건의 만족 여부를 판단할 때 사용한다.
조건의 만족 여부에 따라 다음 실행할 명 령 어가 결정 되는 것이 다.
예를 들어, ‘beq x5, x6, L1’ 명 령어는, ‘x5 == x6’이면 CPU는 LI 레이블 에 있는 명령 어를 실행 하고. x5 != x6’이면 CPU는beq바로 다음에 있는 명령어를실행한다.
L1 레이블에 있는 명령어를실 행한다는 것은 하드웨어적으로 TC _L1’으로 설정하는 것을 말하며, 바로 다음에 있는 명령 어를 실 행하는 것은 통상적 인 ‘PC — PC + 4’를 말한다.
그리고 Branch 명령 어의 실행 결과를 말할 때 taken 또는 not—taken과 같은용어를 자주 사용하는데,
‘beqx5, x6, L1’ 명령어의 예에서는 ‘x5==x6’ 이면 branch가 taken 됐다고 말하고, 그렇지 않으면 not-taken 됐다고 말한다.
(2) Pseudo 명령어
> '가짜 명령어' 직관적으로 명령어를 프로그래머에게 보여주기 위해서 사용되는 명령어다 Pseudo 명령어는 컴파일러가 컴파일 과정에서 실제 명령어로 바꿔준다.
(3) 무조건 분기 명령어
무조건 분기 명령어 2개를 제공한다.jal 명령어는 PC-relative 방식으로,
분기하려는목적지가현재 명령어 위치에서 immediate만큼 떨어져 있는direct jump 명령어이고,
jalr- 명령어는 목적지가 레지스터값에서 immediate 만큼 떨어져 있는 indirect jump 명령어이다.
Indirect라는 말은 분기할목적지가 명령어에 직접적으로 명시되는 것이 아니라,
레지스터를통해 간접적(?)으로 명시되기 때문에 붙여진 용어이다.
따라서 jalr의 경우, 분기할목적지가 프로그램 실행 중동적-“ 으로 레지스터값을바꾸어 변경될 수 있다.
‘jal, jalr’ 명 령어는 고급언어에서 함수호출떼 혹은 goto와 같은 무조건 분기를 구현할 때 사용된다.
jalr 명령어에서생각해 볼 것은분기할목적지 가 레지스터값에 따라 달라진다는 것이다.
이와 같은 방식을 indirect jump라고 말한다
. Destination 주소를 직접 명시하는 direct jump와 달리, 레지스터를 통해 간접적 ''으로 명시한다.
그럼 Indirect jump 명령어를 제공 하는 이유는 무얼까?
두 가지로 생각할 수 있다.
첫째 호출하는 함수의 위치가 너무 멀어 jal 명령어로 도 달할 수 없을 수 있기 때문이다.
jalr은 레지스터를 통해 32-bit 주소공간에서 목적지가 어디든 분기할 수 있다.
둘째, 호출할 함수가 ‘실행 중* " 결정되는 것을 지원하기 위해서이다
'RISC-V CPU 설계 > 개념 정리' 카테고리의 다른 글
[RISC-V] 4.1 조합회로 (1) | 2024.05.11 |
---|---|
교과블록 3주차 공부 (0) | 2024.04.17 |
교과블록 2주차 발표 (3장) (0) | 2024.04.10 |
교과블록 2주차 발표준비 (1장) (0) | 2024.04.10 |