명령어 addressing

32비트 상수

대부분의 상수는 16비트 정도면 충분하지만, 32비트가 필요한 상수가 필요할 때가 있음.

따라서 32비트 상수를 만들때는 아래의 명령어를 사용하여 만듬.

lui rt, constant

32비트가 있을때 상위 16비트에 상수를 집어 넣는 명령어

하지만 기존 상수 연산은 최대 16비트의 상수만 연산이 가능하다.

상수 연산 명령어 구조

따라서 32비트 상수를 계산하기 위해서는 다른 방식으로 계산해야 된다.

Branch Addressing

대표적인 브랜치 명령어

beq  $t0, $zero, L1 # t0이 $zero와 같다면 L1으로 이동

명령어의 구조는 상수연산 명령어 구조를 공유 (위 사진과 동일)

대부분의 브랜치 타겟 (위 코드로 예시를 들명 L1에 해당)은 해당 브랜치 근처에 있음.

PC - relative addressing (프로그램 카운터 상대 주소 지정)

명령어에서 상대적인 주소를 사용하여 메모리상의 주소를 지정하는 기법. 상대적인 주소를 사용하기에 짧은 비트만으로도 주소를 표현 할 수 있음.

Target address = PC + offset(위 그림에서 constant or address라 표기된 비트) * 4

4를 곱하는 이유

MIPS는 32비트 프로세서이므로 모든 명령어는 4바이트 단위.

Jump Addressing

대표적인 점프 명령어

jal $ra

명령어 구조

j 또는 jal 명령어는 text segment (메모리 세그먼트 중 코드(텍스트) 영역) 모든 곳을 타겟팅 할 수 있음 (모든 명령어 인코딩 가능)

(Pseudo)Direct jump addressing

Target address = PC(상위 4비트) (address * 4)

브랜치가 너무 멀 경우

아래와 같이 코드가 있을때, L1은 16비트 offset까지만 이동이 가능하다. 만약 16비트 offset이 16비트 이상이면

beq  $t0, $zero, L1 

아래와 같이 코드가 변경된다.

bne  $s0, $s1, L2
j    $L1
.
.
L2: ...

실제 예시

Jump addressing 부분만 다루겠다.

bne $t0, $s5, Exit

브랜치 명령어다. $t0과 $s5가 같지 않다면 Exit로 이동한다. Exit값은 offset이 2가 주어졌다. 이를 target address로 변환하면

target address = Pc + offset * 4 = 80016 + 2 *4 = 80024이므로 Exit의 주솟값으로 이동한다.

j Loop

이 부분은 그림에서 주어진 수를 2진수로 변환해서 계산도 해보고, 주소를 16진수로 가정해서 계산해봐도 80000이란 수가 나오지 않는다. 아마 예시여서 그런듯 하다.

'컴퓨터 구조' 카테고리의 다른 글

사칙연산 원리  (0) 2023.07.05
Static Linking 부터 로드까지  (0) 2023.06.30
함수 호출 작동 방식  (0) 2023.06.28
ISA, ABI, 명령어의 구조  (0) 2023.06.28
스택 포인터  (0) 2023.06.27