Chapter 5. 주소지정방식(Addressing Modes)

MoonLight·2021년 10월 13일
4

컴퓨터구조

목록 보기
5/6

0x01. 32비트 수치와 주소를 위한 MIPS의 주소지정 방식

1.1 개념

  • 주소지정 방식(Addressing modes)

    • MIPS에서 32비트 주소상수값들을 어떻게 만들어 내는지,,

    • 한 아키텍처에서 기계어가 각 명령어마다 operand를 만들어내는 방식

    • 기계어나 그 외의 것에 포함된 레지스터/상수에서 가진 정보를 이용함으로써, operand의 메모리주소를 계산하는 방법을 기술한다.

  • 주소지정방식의 갯수

    • MIPS : 5개 방식
    • ARMv7 : 9개 방식
    • IA-32: 12개 방식
  • Program Counter (PC)

    • 현재 실행될 명령어의 주소를 포함하고 있는 특수 레지스터

1.2 32비트 주소를 넣는법 for direct addressing

  • loading이란 메모리주소가 아니라 메모리주소에 있는 값을 적재하는 것을 말한다.
  • $t1이 어떤 메모리주소를 기억하고 있다고 가정하면 lw $s0, 0($t1)으로 $s0에 값을 적재할 수가 있다.

하지만, $t1에 메모리주소가 들어있지 않다면 $t1에 메모리주소 그 자체의 값은 어떻게 넣어야 하는가? (명령어가 32비트인데, 맨앞부분에 opcode넣어야되고, rs rt등 때문에 명령어 내에 32bits 메모리주소전체를 넣는 것이 불가능하다.)

[해결방안] IDEA : 반반씩 넣는다.

  • lui (load upper immediate) 명령어 : I-type(op=6,rs=5,rt=5,constant=16)으로 레지스터 rt의 상위 16bit에 상수값을 load해준다.
    • ex) lui $s0, 61 : $s0의 상위 16비트에 61을 2진수로 변환한 바이너리를 load해준다.
  • ori (or immediate) 명령어 : 레지스터와 하위16비트 상수를 or연산 한다.
    • ex) ori $s1, $s0, 1200 : 1200을 2진수로 변환한 하위 16비트의 바이너리와 레지스터 $s0을 or연산한다.

참고 : li는 의사코드이므로 실제 기계어는 없다.

1.3 점프(Jump)와 분기(Branch) 명령에서의 주소지정

J-type 명령어 형식

(참고)직접 주소지정 방식 (Direct addressing mode)

j 10000 # go to location 10000 (= branch address 10000)

워드단위 주소접근 (Word addressing)

  • 워드단위 주소접근은 실제 주소의 offset을 넣지않고 4bytes 단위의 offset을 넣어 그 offset에다가 4를 곱해주는 방식이다.

  • beq, bne(PC상대주소지정) 그리고 j(Pseudodirect addressing) 명령어가 워드단위 주소접근을 사용한다.

    • 하지만, 워드단위 주소접근이라도 j는 Pseudodirect addressing을 사용하고, beq, bne는 PC상대주소지정 방식을 사용한다.
  • 명령어는 4byte(=32bits)이기 때문에 번지수는 0000 0000 0000 0000 0000 0000 0000 0000, 0000 0000 0000 0000 0000 0000 0000 0100, 0000 0000 0000 0000 0000 0000 0000 1000 ⋯ 로 접근한다. 이를 보면 하위 2비트는 항상 00임을 볼 수 있다.

  • 따라서 이 하위 두개의 비트를 아낄라면 이 부분은 생략하는게 낫다.

  • 그럼 J-type의 형식에서 address주소는 26bits가 아니라 28bits를 표현할 수 있게 된다.

    • 하위 2비트는 맨마지막에 그냥 00붙여주는 식으로,, 디테일은 (3)에서 설명함

결국, 중요한것은 jump 명령어는 워드단위 주소접근을 한다는 점이다!!!!!!!!! ex) j 10000 # 40000번지의 주소로 점프하시오.

위를 종합해보면 이 식이 도출된다. Branch address = address * 4

(1) Pseudodirect addressing

용도 ❓ : j, jal같은 명령어에 사용한다...

  • Program Counter의 상위 4비트는 불변한다.
  • 2282^{28}byte = 256MB가 주소의 한계치이다.(26비트에서 2비트를 더한)

  1. PC의 상위 4비트를 branch address에 넣는다.

  2. j 명령어의 word address(26bits) 를 branch address에 넣는다.

    그럼, 그 주소의 마지막에 00이 붙어 주소값은 28비트가 된다.

  3. branch address 전체(32bits)를 PC에 복사한다.

  4. 메모리에 적재한다.

(2) PC 상대주소 지정(PC-relative addressing)

용도 ❓ : Branch 명령어 시 사용됨(bnebeq같은 명령어 ,,,)

  • 지금까지 bne $s0, $s1, LOOP 혹은 beq $s0, $s1, EXIT 와 같이 LOOP, EXIT처럼 Lable로 표시했었는데 실제 기계어는 못알아먹으므로 이런방식으로 처리하지 않는다.
    • Lable은 사실 Branch target address이다!!

📝 방식 : Branch target address = (PC+4) + Branch offset

  • 현재 수행되고 있는 명령어(PC)의 다음명령어(+4)에다가 offset을 더한다.
  • 그 더해진 Branch target address를 다시 PC 레지스터에 넣는다.

  • address부분(Branch offset)이 16비트인데 4를 곱해도 최대 18비트밖에 안되므로 32비트인 PC레지스터에 나머지 비트를 뭘로 채워야할지 모른다. 이를 해결하기위해 여기서 Sign extension을 하는데, Sign extension이란 32비트를 채우기 위해 16번째 비트가 1이면 모두 1, 0이면 모두 0으로 채우는 것을 말한다.
    • 이렇게 하여 32비트를 채운뒤에 (PC레지스터 +4)와 더해주는 것이다.

beq,bne가 갈 수 있는 최대범위 : (PC+4) ± 2^15 words = (PC+4) ± 2^17bytes


📝 Branch offset 예제

  • 위의 어셈블리어를 기계어로 바꿔보도록 하자.

1.4 MIPS Addressing Modes 5가지 방식(총정리)

1.5 기계어 해독 예제

1.6 MIPS 구조 정리

  • 3,4장에서 배울내용인데 그냥 훑어보자.

profile
hello world :)

1개의 댓글

comment-user-thumbnail
2023년 9월 27일

정말 정리를 잘하신 것 같아요 ! 많은 도움이 되었습니다.

답글 달기