본문 바로가기
컴퓨터시스템구조

[컴퓨터시스템구조] 11. MIPS 주소지정

by 파스텔코랄 2023. 10. 14.

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: …

댓글