32비트 상수
- 32비트 상수의 경우 16비트 두개로 쪼개서 저장한다.
lhi rt, constant
- 16비트 상수를 rt의 상위 16비트에 복사하고 rt의 하위 16비트를 0으로 비운다.
- 이후 rt의 하위 16비트를 넣는다.
lhi $s0, 61 # 0000 0000 0111 1101 0000 0000 0000 0000
ori $s0, $s0, 2304 # 0000 0000 0111 1101 0000 1001 0000 0000
분기 주소지정(Branch Addressing)
- 분기 명령어
- Opcode, 레지스터 2개, 대상 주소
- 대부분의 분기 대상은 분기 근처에 있다.
- I-포맷
op | rs | rt | constant or address |
6비트 | 5비트 | 5비트 | 16비트 |
- PC 상대 주소 지정
- 대상 주소 = PC(프로그램카운터) + 오프셋 × 4
- PC는 이미 4만큼 증가했다는 것을 주의하자.
점프 주소지정(Jump Addressing)
- 점프(j, jal) 대상은 어느 위치에나 있을 수 있다.
- 명령어에 전체 주소를 인코딩
op | address |
6비트 | 26비트 |
- 직접 점프 주소 지정
- 타켓 주소 = PC_31…28 : (주소 × 4)
현재 PC의 상위 4비트를 붙이고
하위 28비트는 J 포맷 안에 있는 26비트 주소 + 00 2비트
대상 주소지정(Target Addressing) 예제
- Loop 시작이 80000이라 가정하자.
Loop: sll $t1, $s3, 2 | 80000 | 0 | 0 | 19 | 9 | 4 | 0 |
add $t1, $t1, $s6 | 80004 | 0 | 9 | 22 | 9 | 0 | 32 |
lw $t0, 0($t1) | 80008 | 35 | 9 | 8 | 0 | ||
bne $t0, $s5, Exit | 80012 | 5 | 8 | 21 | 2 | ||
addi $s3, $s3, 1 | 80016 | 8 | 19 | 19 | 1 | ||
j Loop | 80020 | 2 | 20000 | ||||
Exit: … | 80024 |
- 80012 : PC(=16 : PC 값은 이미 4 증가) + 오프셋(2) X 4 = 80016+8 = 80024
- 따라서 80024인 Exit로 이동한다.
- 80020 : 실제로 가는 값은 20000x4인 80000
- 따라서 80000인 Loop로 이동한다.
- 주소값이 4바이트 씩 커지는 이유는 하나의 명령이 32비트이기 때문이다.
멀리있는 분기
- 분기 대상이 16비트 오프셋으로 인코딩하기에는 너무 멀면 어셈블러가 코드를 다시 작성한다.
beq $s0,$s1, L1
↓
bne $s0,$s1, L2
j L1
L2: …
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 13. MIPS 동기화 (0) | 2023.10.15 |
---|---|
[컴퓨터시스템구조] 12. MIPS 주소지정 정리 (0) | 2023.10.14 |
[컴퓨터시스템구조] 10. MIPS 문자열 연산자(lb, lh, sb, sh) (0) | 2023.10.14 |
[컴퓨터시스템구조] 09. MIPS 프로시저 호출(jal, jr) (1) | 2023.10.14 |
[컴퓨터시스템구조] 08. MIPS 조건부 연산자(beq, bne, j, slt) (0) | 2023.10.14 |