[Computer Architecture] Branch addressing & Jump addressing

G·2023년 3월 21일
0

Computer Architecture

목록 보기
5/16
post-thumbnail

branch addressing과 jump addressing와 이에 필요한 명령어를 알아보자.
Byte와 Half word load/store 명령어를 알아보자.

  • lb rt, offset(rs)
  • lh rt, ofsset(rs)
    rt 레지스터에 offset(rs)에서 8bit or 16bit을 저장하고 나머지 부분을 1(signed)로 확장한다.
  • lbu rt, offset(rs)
  • lhu rt, ofsset(rs)
    rt 레지스터에 offset(rs)에서 8bit or 16bit을 저장하고 나머지 부분을 0(unsigned)로 확장한다.
  • sb rt, offset(rs)
  • sh rt, ofsset(rs)
    하위 8bit또는 16bit을 메모리에 저장하며 이는 1byte 또는 2byte alighn이여야 한다.

String Copy Example

void strcpy(char x[], char y[]){
	int i;
    i = 0;
    while((x[i]=y[i])!='\0')
    	i += 1;
}

x,y주소는 $a0, $a1에 저장된다.
i in $s0

32-bit Constants

32-bit Constants를 한 번에 write하는 Instruction은 존재하지 않는다. 그러한 이유로 32-bit 상수를 레지스터에 write하는 방법 중 하나를 알아보자.

  • lui $s0, 61: 상수 61을 16-bit 형태로 맨 왼쪽에 write한다.
  • ori $s0, $so, 2304: $s0과 상수 2304의 or operation을 통해, 오른쪽 16bit에 wirte한다.


instruction을 통해 61×216+230461 \times 2^{16} + 2304 로 32-bit 수를 레지스터에 저장한다.

Branch Addressing

Branch와 Jump의 차이점을 알아보자.

Branch addressing은 I-format을 사용하며 PC 레지스터 값(다음 실행할 instruction의 주소)에 대한 상대주소를 사용한다.

이동할 주소 = PC + offset x 4

(정확히 점프할 시점에 PC는 이미 +4가 된다.)

4를 곱하는 이유는 Inst의 주소는 4의 배수(32-bit) align이기 때문이다.

그렇다면 PC를 기준으로 이동할 수 있는 주소는 [PC217,PC+2174][PC - 2^{17}, PC + 2^{17} - 4]이다.

Jump addressing

Jump(j and jal)의 타겟 주소는 text segment이다.

이동할 주소 = PC의 최상위 4bit:(address x 4)이다.

address에 4를 곱하면 28bit 표현이 가능하고 나머지 4bit를 PC의 상위 4bit을 붙여준다.
다른 말로, PC의 상위 4bit과 일치하는 주소만 찾아갈 수 있다는 것이다.

Branch and Jump Example

PC+4+2x4 = PC + 12가 되므로 address는 2이다.

Branching Far away

만약 branch를 하지만 멀리 해야한다면 어떻게 해야할까?
L1이 branch의 범위를 벗어나는 주소라고 해보자.

beq $s0, $s1, L1
↓ #어셈블리어에서 기계어로 바뀔 때
bne $s0, $s1, L2
j L2

L2:

Synchronization

동기화는 write이후 read와 같이 순서가 꼭 맞아야하는 것을 의미한다. 만약 두 연산 사이에 다른 연산이 일어나거나, 두 연산의 순서가 달라진다면 결과값은 다를 것이다.

이를 atomic하게 하나의 연산으로 묶어 무조건 연산이 모두 발생하거나 발생하지 않게 만들면 위와 같은 문제점은 없을 것이다.(e.g. atomic swap) 하지만 MIPS는 하드웨어상에서 이를 지원하지 않는다.
MIPS 같은 경우는 ll instruction과 sc instruction, 두 가지 명령어의 결합으로 이를 대체한다.

Synchronization in MIPS

두 가지의 instruction을 알아보자.

ll rt_1, offset(rs): offset + rs에 있는 값을 rt에 저장한다.
단 주소를 link를 한다.

sc rt_2, offset(rs): rt를 offset + rs에 저장한다. 저장하기 이전에, 메모리에 있던 데이터와 rt_1에 있는 값과 비교하여 같다면 rt_2에 1을 저장하고, 다르다면 0을 저장한다.


위의 예시를 보면 $s4 레지스터와 0($s1) 메모리 영역의 값을 변경하는 것을 볼 수 있다.

profile
열심히 안 사는 사람

0개의 댓글