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 |