Computer Science/Computer Architecture

[Computer Architecture] Instructions: Language of the computer - 2

LeeJaeJun 2024. 2. 7. 02:23
728x90
반응형

Procedure call requirements

  • Caller
    • callee에게 parameter를 넘겨야 함
    • callee에게 return address를 넘겨야 함
    • volatile한 것은 무엇이든간에 저장해야 함
      • ex) caller에서 x3 register에 값을 넣었는데 callee에서 x3 register에 다른 값을 넣어서 사용하게 되면 기존의 값이 날아가버리게 되므로 다른 곳에 저장해놓아야 함
  • Callee
    • 자신의 반환 주소를 저장해야 함
    • 자신이 사용할 local storage를 제공해야 함
    • recursive call을 지원해야 함

 

Program stack

  • 스택은 procedure에 동적 데이터를 할당하기 위한 자연스러운 구조 (call/ return linkage information에서도 마찬가지)
  • Last-In-First-Out
  • x2 register는 stack pointer로 가장 최근에 사용된 stack의 top을 가리키는데 사용
  • convention에 따라, stack은 높은 주소에서 낮은 주소로 아래로 이동

 

Procedure call mechanisms

  • 레지스터
    • a0 - a7: 적은 수의 parameter를 pass할 때 사용
    • ra: return address를 pass할 때 사용
    • a0, a1: 특히 a0, a1같은 경우에는 function values를 반환할 때도 사용 가능
      • 일반적으로 return value는 1개이지만, register가 기본적으로 32bit니까 64bit 형태의 데이터(ex. double, long)를 return하려면 2개의 레지스터가 필요해서 a0, a1 총 2개의 레지스터를 사용
    • sp(stack pointer): stack의 top을 추적하는데 사용
    • t0-t2 (temporary registers): procedure를 부르고 나서도 값이 변경될 수 있음. temporary register에 있는 값을 나중에  써야한다면 스스로 책임지고 stack에 넣어주어야 함(자동으로 stack에 저장되지 않음)
    • s0-s1 (saved registers): procedure call이 일어나도 saved register는 값이 변경되지 않음이 보장됨. saved register의 값이 변경될 일이 생겨도 직접 stack에 기존 값을 넣어놓고, 값을 변경하여 계산을 처리한 뒤에 나중에 return할 때는 stack으로 부터 기존 값을 가져와 원상복구 시킴
  • Stack
    • callee가 사용할 레지스터를 저장
    • caller에 대한 정보를 저장(ex. return address)
    • 추가적인 parameter 전달
    • 호출된 procedure에 대한 local data 할당

 

Register saving convention

  • Preserved call: callee에 의해서 값이 변경될 때는 항상 기존의 값을 저장하고 후에 복구해야 함
  • Unpreserved registers: 값이 보존될 필요가 있으면 caller가 직접 save를 보장해야 함

 

Six fundamental steps in calling a function

  1. 함수가 접근할 수 있는 곳에 매개변수를 위치시킨다.
    • argument register에 매개변수를 넣음
  2. control를 function으로 전환
    • jump instruction 이용
  3. function에 필요한 (local) storage 자원 획득
    • local varable을 위한 stack 공간 확보
  4. function의 작업 실행
  5. calling code(caller)가 접근할 수 있는 곳에 결과값 입력
    • a0-a1 register
  6. 원래 지점으로 control를 반환
    • ret: 자신이 원하는 명령이 들어가 있는 메모리의 주소로 덮어쓴다면, 자신이 원하는 명령을 수행할 수 있음

 

Memory layout

  • Text: program code
  • Static data: global variables
  • Dynamic data: heap
  • Stack: automatic storage

 

R-format layout

R-format layout

  • Register-format layout
  • opcode: 부분적으로 어떤 instruction인지 나타냄 (opcode만으로 명시가 끝나는게 아니라 fucntion3, 7과 합쳐져서 정확히 명시되기 때문)
    • ex) opcode = 0b0110011은 모든 32bit R-format의 arithmetic/logical instruction들을 나타냄
  • function3 + function7: opcode와 결합해서, 어떤 동작을 실행하는지 정확히 나타내는 역할
    • 유사한 기능을 담당하는 명령어들은 function3 또한 같음

예시

  • rs1, rs2, rd는 5bit unsigned integer(0~31)을 나타낼 수 있고, 이는 register number에 대응됨(x0~x31)
  • rs1: source register #1
  • rs2: source register #2
  • rd: destination register

 

I-format layout

  • Immediate format layout
  • Immediate는 항상 arithmetic operation에서 사용하기 전에 sign-extended 32 bit로 확장되어 사용됨
  • imm: 12 bit를 사용하며 [-2048, +2048]의 값 포함 가능 (12bit보다 큰 수는 lui를 함께 이용해서 처리 가능) 

l-foramt layout

  • shamt(shift amount): 몇 bit를 shift해야하는지 나타냄
    • Immediate 값이긴 하지만 대부분의 CPU 아키텍처에서, 레지스터의 크기는 32bit이므로 일반적인 I-format처럼 12bit를 모두 다 쓸 필요가 없음
    • 최대 31bit이기에 5bit로 표현 가능하므로 남은 7bit가지고 명령어를 구분하는데 사용

Load Instruction

  • Load Instruction 또한 I-type
    • funct3에서 MSB(Most Significant Bit, 여기서는 가장 왼쪽 비트)가 0이면 signed, 1이면 unsigned
    • funct3에서 MSB를 제외한 2비트는 data size를 나타냄
      • 00: 1 byte
      • 01: 2 bytes
      • 10: 4 bytes

 

S-format layout

  • store format layout
  • store의 경우 destination없이 2개의 source register를 가짐
  • 레지스터를 같은 장소에 보관하는 것을 우선시

 

Branch format layout

  • Branch offeset = 4 instructions
  • 4개의 instruction은 각각 4bytes이므로 총 16bytes
  • RISC-V는 half word 단위(16bit)로 주소를 표현하기 때문에 맨 오른쪽 끝의 1 bit는 필요가 없음(항상 0)

imm[12:1]

  • B format에서 imm field가 굳이 떨어져있는 이유?
    • S format과 bit가 overlap 되는 부분을 최대화하여 하드웨어 디자인을 심플하게 하기 위해서

 

 

J-format layout

  • Jump format layout
  • rd 레지스터 하나만 사용 -> label(점프할 위치)를 나타내는데 많은 bit를 사용 가능

 

J-format

  • JALR instruction은 rs가 2개 필요하기 때문에 J-format이 아니라 I-format을 사용

JALR is I-format !

 

U-format

 

RISC-V instruction format 총 정리

  • I, I* 모두 U라고 하기도 함

 

Design principle of architectures

  • powerful한 operation 제공
  • 실행되는 intruction 수를 줄이는 것을 목표로
  • 느린 clock time과 높은 CPI는 위험할 수 있음
  • The path toward operation complexity is thus fraught with peril. To avoid these problems, designers have moved toward simpler instructions

 

728x90
반응형