'MIPS 레지스터'에 해당되는 글 1건

  1. 2010.05.05 MIPS 레지스터

MIPS 레지스터

Posted by 춘자 ComputerStructure : 2010.05.05 21:43

MIPS 레지스터 대해서 설명하기 전에 두가지 싸이트를 추천한다.
첫번째는 누구나 다 아는 wikipedia에서 검색한 MIPS에 대한 설명이다. 아직 필자는 보지는 않았지만 설명이 잘 되어 있는거 같다. 그리고 참고할 싸이트들도 잘 링크되어 있다.
두번째는 누구나 다 아는 joinc 라는 위키 홈페이지에서 제공하고 있는 MIPS 에뮬레이터 spim 을 이용하여 MIPS 어셈블리어에 대해서 설명하고 있다. ( 공부해야 되는데 큰일이다... -_-ㅋ )

http://en.wikipedia.org/wiki/MIPS_architecture#cite_note-1
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Assembly/Documents/Spim


MIPS는 32비트 기반의 RISC 방식 CPU 이다.
레지스터는 아래 표와 같이 총 32개로 이루어져 있다.
 여기서 주위해야 할것은 바로 레지스터의 이름이다. Name과 Number 두가지로 구성되어 있다.
실제 어셈블리어 코드에서는 둘중에 아무 이름이나 해도 상관은 없다.
Name을 만들어 준 것은 단순히 $0, $1 같이 단순 숫자형태의 이름으로 하는 것보다 레지스터의 용도에 맞게 이름을 붙여줌으로써 개발자에게 편의를 주기 위한 것이라고 보면 된다.
일반적으로 니모닉이라고 하는데 우리가 첫번째 시리얼 포트를 머라고 하는가? COM1 이라고 하지 않는가? 이렇게 상징적인 이름을 붙여주는 것이다.

물론 각 레지스터의 용도가 정해져 있지만 꼭 이렇게 써야 한다는 제약은 없다. !!!
하지만 효율적이게 하기 위해서 무조건 따라야 된다고 생각하면 되겠다.


Registers
Name Number Use Callee must preserve?
$zero $0 constant 0 N/A
$at $1 assembler temporary No
$v0–$v1 $2–$3 values for function returns and expression evaluation No
$a0–$a3 $4–$7 function arguments No
$t0–$t7 $8–$15 temporaries No
$s0–$s7 $16–$23 saved temporaries Yes
$t8–$t9 $24–$25 temporaries No
$k0–$k1 $26–$27 reserved for OS kernel No
$gp $28 global pointer Yes
$sp $29 stack pointer Yes
$fp $30 frame pointer Yes
$ra $31 return address N/A

여기서 문제 하나 내겠다. 32개의 레지스터를 표현하기 위한 주소는 총 몇 비트가 필요할까?
장난하냐구?  맞다!  장난하는 거다. 총 5비트만 있으면 된다.  주소는 이진수로 나타내기 때문에 2의 5승을 하면 32가 나온다. 즉 32개의 레지스터를 가리킬 수 있게 되는 것이다.

필자는 컴퓨터 구조 시간에 정말 많이 놀았다. 그래서 인스트럭션(명령어)에 대해서 하나도 몰랐다. 그래서 레지스터를 가리키는 주소도 논리주소처럼 32비트가 있어야 되는지 알았다. -_-;;;
자!!! 하지만 이 필자를 믿고 따라와 주기 바란다. 예전에 필자가 아니다. 기본적인 MIPS 명령어 정도는 갈켜줄 자신이 있다.!!!

자, 그렇다면 레지스터는 위 표에 나온 32개가 전부일까?
아니다. 우리는 한가지 중요한 레지스터를 깜빡하고 있었던 것이다. 바로 PC( 프로그램 카운터 ) 라는 레지스터다.

요놈이 무슨 일을 할까?
필자는 분명 컴구조에 대해서 정말 잘 모르는 학생이라고 말했다. 하지만 PC 정도는 안다!!!! -_-v
여러분도 알거라고 믿고 넘어가겠다.

그런데 위 표는 영어로 되어 있다. 저 정도는 당연히 알아야겠지만 필자가 한글로 되어 있는 걸 구했다.

레지스터 번호 기억하기 쉬운 이름 일반적 용도
$0 zero 항상 0
$1 $at 어셈블러 템포러리(지정되어 있음)
$2, $3 $v0, $v1 서브루틴에서 리턴되는 값
$4-$7 $a0-$a3 서브루틴에 입력되는 값
$8-$15 $t0-$t7 임시 - 함수호출중에 변할 수 있다
$16-$23 $s0-$s7 저장되는 레지스터 - 함수호출중에도 불변
$24,$25 $t8,$t9 임시
$26,$27 $k0,$k1 커널(OS가 사용함)
$28 $gp 전역포인터
$29 $sp 스택포인터
$30 $fp 프레임포인터
$31 $ra 리턴주소(몇몇 명령에서 자동으로 사용됨)


여기서 $0 과 $31은 다른 레지스터와는 좀 다르다. $0은 무조건 0의 값을 갖는다. 내가 다른 값을 넣어도 무조건 0 이다!!!
 $31은 리턴주소를 보관하기위해 몇몇의 서브루틴연결명령에서 사용된다.

$0 은 왜 무조건 0일까?

이건 나중에 설명하도록 하겠다.

엄청난 이유가 숨어있다. !!!

 

'ComputerStructure' 카테고리의 다른 글

MIPS 명령어 - I타입  (3) 2010.05.05
MIPS 명령어 - R타입  (4) 2010.05.05
MIPS 레지스터  (0) 2010.05.05
CISC VS RISC  (0) 2010.04.18
주소 지정 방식  (1) 2010.04.18
레지스터와 메모리의 차이  (1) 2010.04.17
 «이전 1  다음»