minkylee

[컴퓨터구조] Memory Addressing 본문

CSE/컴퓨터구조

[컴퓨터구조] Memory Addressing

minkylee 2024. 4. 19. 19:32

큰 수치 피연산자

프로그램에서 사용하는 상수는 대체로 크기가 작으므로, 대부분의 경우 12비트 내로 표현이 가능하다.

그러나 그렇지 않은 경우도 있으므로 더 큰 상수를 다룰 수 있어야 한다.

 

 

이를 위해 RISC-V는 레지스터의 비트 12번째자리부터 31번째 자리가지에 20비트 상수값을 넣는 lui(load upper immediate) 명령어를 제공한다.

 

 

lui는 opcode 7bit, rd 5bit을 제외하고 남은 20bit를 immediate를 위해 사용한다.

 

또한 이 명령어는 imme에 해당하는 20bit를 상위 20bit에 위치시킨다. 즉, rd의 31번째부터 12번째까지 위치시킨다.

 

최종적으로 남은 12bit는 0으로 채운다.

 

해당 명령어를 통해 명령어 2개로 32비트 상수를 만들 수 있다.

 

64비트를 고려할 때는 나머지 32bit에 sign extension이 일어난다.

 

다른 명령어 형식은 20비트 상수를 표현할 수 없으므로, lui 명령어는 U-format이라는 명령어 형식을 사용한다.

 

 

  • ex) 3998976 만들기

lui를 사용해서 비트 20번째부터 31번째 자리를 채운다.
나머지 하위 12비트를 채운다.

 

 

 

addi가 음수를 더하는 경우

위 예제에서는 addi를 통해 더해지는 상수(1280)의 비트 11이 0이기 때문에 별 문제가 없이 더해질 수 있었다.

 

하지만 더해지는 상수의 MSB가 1인 경우 문제가 발생한다.

 

12비트 immediate 값은 부호확장되기 때문에 해당 상수는 음수로 취급되기 때문에

 

이를 해결하기 위해 lui를 통해 적재하는 상수에 1만 더해주면 된다.

 

12비트 immediate의 상위비트가 모두 1111로 채워지므로, 이는 lui입장에서는 -1이 더해진 것과 같기 때문에

 

따라서 1을 더해준다면 오류를 바로잡을 수 있다.

 

해당 명령어를 통해 큰 레지스터 주소값이나 상수값을 처리할 수 있게 되었다.

 

 

 

32-bit Address

32bit architecture에서 cpu가 볼 수 있는 메모리는 최대 4GB이다.

 

jal과 jalr을 통해 32비트 주소를 왔다갔다 할 수 있을까?

 

jal은 opcode, register를 제외하고 남은 20bit를 이용해서 움직이는데, 끝에 0이 함축되어 있기 때문에 사실상 21bit를 사용하므로 최대 PC기준으로 +-2^18 word를 볼 수 있다.

 

jalr은 opcode, register, imm을 제외하고 남은 12bit를 이용해서 움직이는데, 위와 마찬가지로 사실상 13bit를 사용한다.

모자라지 않을까?

 

그렇기 때문에 여기서도 lui 명령어를 사용한다. lui를 통해 상위 20bit에 address를 저장하고, jalr을 통해 하위 12bit를 더하고 jump를 한다. 따라서 전체 메모리를 참조할 수 있다.

Jump Addressing

주소는 특이한 인코딩을 사용하는데, 이는 데이터패스 설계를 간단히 만들어주지만, 어셈블리어를 복잡하게 만든다.


무조건 분기 명령어인 jal명령어는 20비트 상수가 있는 명령어 형식을 사용한다.

 

위에서 본 U-format과 비슷하지만 immediate가 주소를 의미하는 것이므로, U-foramt과는 비슷하지만 다른 이름인 UJ-format이라 부른다.

 

위 형식을 통해 $ -2^{20} 에서 2^{20} -1 $ 범위의 주소를 표현할 수 있다.(주소는 무조건 2의 배수인 짝수 주소만을 가질 수 있다.)

 

이전 글에서 PC-relative 방식인 SB-type을 알아보았는데 PC-relative가 정확히 뭔지 다시 정리해보자

 

 

 

PC-relative addressing

 

만일 프로그램에서 사용하는 모든 주소가 UJ-Format의 immediate 필드인 20비트에 들어가야 한다면 어떤 프로그램도 $ 2^{20} $ 보다 더 커질 수 없다.

 

이는 현실적으로 너무 작은 수이기 때문에, 이를 해결하기 위해 레지스터를 이용한다.


어떤 레지스터를 지정하여 그 값이 분기 변위(offset)에 더해지도록 하는것인데, 이렇게 구현한다면 분기 명령어는 다음과 같은 계산을 통해 분기할 주소를 결정한다.

레지스터가 가진 값(주소값) + 변위(상수값)

 

이 때 사용되는 레지스터로는 PC(Program Counter) 레지스터를 이용한다.

 

PC 레지스터는 32비트의 값을 저장할 수 있으므로, 이를 통해 프로그램의 크기가 $ 2^{32} $ 까지 커지는 것을 허용하며, 조건부 분기 주소의 크기 제한을 극복한다.

  • PC 레지스터를 사용하는 이유
    • 대부분의 프로그램에서 조건부 분기는 주로 순환문이나 if문에서 사용되며, 상대적으로 가까이 있는 명령어로 분기하는 경향이 크다. PC는 현 명령어의 주소를 가지고 있으므로 분기 주소를 더할 레지스터로 PC를 선택하면
    • 분기(branch) 시에는 현 주소에서 $ 2^{10} $ 워드 이내로
    • 점프(jump) 시에는 현 주소에서 $ 2^{18} $ 워드 이내로 이동할 수 있다.

이렇게 PC 레지스터를 기준으로 변위를 더해 분기하는 주소를 지정하는 방식을 PC-상대주소지정방식 이라고 부른다.

 

 

SB-format과 UJ-format은 뭐가 다를까?

두 포맷 다 프로그램의 제어 흐름을 변경한다는 공통점이 있다. 근데 왜 굳이 둘로 나눴지? 해서 정리해본다.

 

  SB format  UJ format
용도 조건부 분기를 통해 흐름 변경 무조건적인 점프를 통해 변경
PC 상대적 주소 지정 두 포맷 모두 PC를 기반으로 상대적 주소를 사용하여 목적지를 계산한다.
명령어 beq, bne jal
하는 일 주소 계산에 필요한 오프셋과 함께 두 개의 레지스터 값을 포함해서 조건 검사 다음에 실행할 명령어의 주소를 링크 레지스터에 저장하여, 점프 후에 실행 흐름을 원래 위치로 돌아올 수 있도록 한다.

 

 

 

 

Memory Addressing Summary

 

RISC-V는 addressing mode를 위한 여러가지 형태를 가지고 있다.

 

 

  1. immediate addressing : 즉시 주소 지정 방식
    • instruction 그 자체에 상수 operand가 들어가 있는 경우
    • 메모리에 접근할 필요가 없기 때문에 매우 빠르다.
  2. Register addressing : 레지스터 주소 지정 방식
    • operand가 register인 경우
    • register에 저장된 값을 operand로 가져온다.
    • 혹은 register에 저장되어 있는 주소를 가져온다.
    • 따라서 주소에 해당하는 메모리에 가서 operand를 가져와야 한다.
  3. Base or displacement addressing : base 기반 주소 지정 방식
    • base address는 register에 있고, 거기에 immediate를 더해서 주소를 지정하는 방식
    • register addressing과 흡사하지만, 여기서 register에 저장한 것은 base address이므로 imme를 더해서 operand를 가져온다.
  4. PC-relative addressing : PC-relative 주소 지정 방식
    • PC를 기준으로 상수 immediate를 더해서 주소를 지정하는 방식
    • branch address를 위한 mode

 

 

 

  • add두 개의 register를 가지고 연산을 하기 때문에 register addressing
  • addi상수를 가지고 연산을 하기 때문에 immediate addressing
  • lw는 base + offset을 통하여 메모리에서 값을 가져오므로 base addressing
  • sw도 base + offset을 통하여 메모리에서 값을 가져오므로 base addressing
  • jal, jalr, beq 등은 pc를 기준으로 명령어 주소를 지정하므로 pc-relative addressing

 

RISC -V Encoding Summary

 

그동안 배운 format들을 필드별로 총정리해보자

 

 


참고

https://hi-guten-tag.tistory.com/252
https://ttl-blog.tistory.com/991#%F0%9F%A7%90%20%EB%B6%84%EA%B8%B0%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%EC%9D%98%20%EC%A3%BC%EC%86%8C%EC%A7%80%EC%A0%95-1