MIPs

김명석·2022년 4월 14일
0

MIPS

목록 보기
1/1
post-thumbnail

String Copy 예제

  1. Byte 하나이고 4바이트이기 때문에 -4 를 넣어준다
  • 새로운 공간을 위해 할당하는 과정
  1. $sp의 값을 $S0로 저장
  2. i값 $s0 을 0으로 초기화
  3. $t1에 $s0 와 $a1 값을 저장함
  • i인덱스가 1씩 증가하면서 읽을 문자열을 확인
  1. $t2에 $t1을 자리를 넣음
  • 1글자씩 읽기 위해 lbu에서 u는 unsigned 읽은 데이터를 extension할때 앞을 0 으로 채우는 과정 1byte를 읽어 t2에 저장
  1. 현재 x[i]에 접근 주소를 의미한다. 그를 저장
  2. save명령어로 $t3에 있는 값을 $t2에 저장
  3. null포인터면 l2로 이동하게 만든것.
  4. i 1씩 증가
  5. 루프를 되돌림
  6. 스택을 사용했으면 원래대로 돌려줘야하기에 addi $sp, $sp, 4 원래대로 4만큼 돌려줌

32-bit Constants

16비트가 일반적이지만 경우에 따라서는
32비트가 필요한 경우가 있다.
32비트가 없을땐 16비트를 로드하고 사용하는 등의 방식이 있지만 MIPS에서는 지원한다.
lhi $s0,61이라고 하면 61이라는 값을 아래의 그림처럼 넣는다

오른쪽에 채울 때는
ori $s0, $s0 , ~~ 이렇게 사용하면된다.

Branch Address

Branch instruction의 구성

  • opcode
  • two register
  • target address

PC-relative addressing

일반적으로 브랜치들의 target address는 브랜치 근처에서 존재한다.
이 address는 현재 브랜치의 위치를 중점으로 이루어진다.
PC는 이미 브랜치가 아니라 브랜치 다음인 4만큼 증가한 곳을 가리키고 있다.

Jump Addressing

절대적인 주소로 직접 점프한다. target address 는 주어진 address에 4를 곱한다.

Target Address 예시

브랜치 bne 를 보자 현재 PC값은 24를 더한 값인 80020이 아니라 PC에 4가 더해져있으니 80024로 가야한다.(PC는 80012가 아닌 80016)

Jump의 경우 20000
4가되어 80000으로 이동

branch target 멀리있을때

16 bit offset보다 멀리 있을때.
instruction을 아래처럼 바꾼다. bne로 바꾸어 바로 뒤로 보낸다. branch는 16비트지만
jump는 26을 가리키기 때문.

Addressing Mode 요약


1. 직접 가리키는 경우
2. 레지스터에 저장 해당 레지스터를 가리켜서 주소 접근
3. 기본적인 레지스터에 담겨있고 address값을 더해 최종 address에 접근
4. PC기반 PC +address로 해당 주소로 접근
5. 멀리있는 곳에 접근 하기 위한 방법.

Synchronization

동시에 같은 데이터에 접근하려고 할 때 문제가 생길 수 있다.
하드웨어가 도와주어야한다.
memory가 atomic 연산을 보장해주어야 한다. 즉, 읽거나 쓸때 다른 것들이 접근할 수 없게.
MIPS에선 instruction의 atomic pair로 구현가능하다.

MIPs에서 Synchronization

  1. load linked
  2. store conditional

    ll rt,offset(rs) rs로부터 rt라는 값으로 가져옴
    sc rt, offset(rs) rs의 값이 유지되고 있는 지

예시


맨앞과 맨뒤는 오류로 무시하고 생각.

C sort example


0개의 댓글