branch 명령어 fetch시

beq를 예로 들면,

beq $1, $2, c    #레지스터 1과 2가 같으면 c-shift 된 명령어로 이동

즉, PC <- PC + 4 + 4c

PC+4 기준으로 이동된 이유는, 이미 PC는 다음줄의 PC를 가르키기때문


바이너리 코드를 살펴보면,

beq Rs, Rt, I    #0001 00ss ssst tttt iiii iiii iiii iiii, Rs와 Rt값은 각각 5자리로 32비트의 레지스터한쌍을 취함

뒤의 imm 필드가 shift 값인데, 자세히보면 16비트이다. 

이 값을 바로 (PC+4)값(32비트)에 더할수없으므로, sign-extend와 shift-left-2라는 방법을 통해 32비트로 만든후 더한다.

sign-extend는 imm필드 뒤 두자리를 뺀후 16비트 필드에 집어넣는것. 

어차피 imm필드는 4크기를 간격으로 변하므로 맨뒤 두자리는 항상 00이라는 사실을 이용한것이다.

이를 통해 4배 사이즈의 이동범위를 갖게된다는 이점도있다.

다시 32비트필드에 들어간후 shift-left-2를 통해 original imm필드로 복구된다.

이상태로 PC+4값과 더해진다.


레지스터1과 2과 다르면 PC <- PC + 4




 jump 명령어 fetch시

j I    #0000  10ii  iiii  iiii  iiii  iiii  iiii  iiii

하위 26비트인 imm필드를 shift-left-2한후(28비트됨 = 4배곱) PC의 하위 28비트를 대체한다.




branch, jump 제외한 나머지 명령어들 fetch시

PC <- PC+4


'Computer > Architecture' 카테고리의 다른 글

Multicycle  (0) 2012.07.23
MIPS Reference  (0) 2012.07.22
C언어 -> MIPS instruction  (0) 2012.07.22
Arithmetic  (0) 2012.07.20
Imm, unsigned  (0) 2012.07.20
Posted by Xapilla

댓글을 달아 주세요