본문 바로가기
CS/3-1 컴구

[컴퓨터구조] #3. MIPS 명령어(3)

by 이지이즤 2022. 3. 17.
728x90

 

Lec 3. MIPS Instructions_3 (Language of the Computer)

 

- Data Transfer Instructions
  : CPU는 제한된 수의 레지스터를 가지고 있음. (MIPS는 일반 레지스터 32개)
    그래서 CPU는 레지스터에 적은 양의 데이터만 보관 가능.
    -> 데이터를 메모리에 담아두자! -> transfer data between memory and registers 하는 명령어 필요함!!
    => 그러한 명령어를 data transfer instructions 라고 부름.

   레지스터는 32개밖에 없기때문에 각 레지스터마다 register name이 있어서 구분 가능,
   메모리는 훨씬 크기때문에 각각의 name은 없고 memory address로 접근해야함.

- Memory Operands
  Load (읽기) : memory -> register
  Store (쓰기) : register -> memory

  메모리는 byte-addressed. (한 칸이 1byte = 8bit)
  word (4byte) 크기의 데이터를 읽고(lw) 쓸때(sw)는 메모리 시작주소가 4의 배수여야 함.

  MIPS 는 Big Endian 임. (MSB가 least address에 위치)

- Endianness
  Big Endian : most significant byte를 제일 작은 주소에 배치 ex) MIPS, SPARC
  Little Endian : most significant byte를 제일 큰 주소에 배치 ex) x86, RISC-V
  *most significant byte : 최상위 bit 8개

  항상 4byte 읽기/쓰기만 한다면 endianness는 doesn't matter.
  smaller size로 읽으면 it matters.

 

- Memory Operand Example
  ex1) g = h + A[8];  //이때 A[8]을 레지스터에 전부 넣을 수 없다고 가정해보자.
        g in $s1, h in $s2, base address(배열 시작 주소) of A in $s3 

         lw $to, 32($s3)  # $s3에 담긴 주소로부터 32만큼 떨어진 곳에서 값을 읽어와서 $t0에 저장.
                 # 32인 이유? : A[0], A[1], ... A[8]의 주소가 word(4byte)단위로 증가하고 현재 A[8]을 보고있으므로
                                       4 (element size) * 8 (index value) = 32 임.
         add $s1, $s2, $t0

  ex2) A[12] = h + A[8];
          
lw $t0, 32($s3)
          add $t0, $s2, $t0
          sw $t0, 48($s3)      #48인 이유? : 4 (element size) * 12 (index value) = 48








- Immediate Operands
  상수 덧셈 : 메인 메모리의 특정 주소들에 상수를 다 넣어두고 필요시 레지스터에 load해서 사용 -> 비효율적
                      lw $t0, AddrConstant4($s1)  # $t0 = canstant 4
                      add $s3, $s3, $t0  # $s3 = $s3 + $t0
                 -> 해결책 _ 레지스터와 상수의 덧셈을 가능하게 했음!
                      addi $s3, $s3, 4
                    * subi 는 없음. addi $s2, $s1, -1 처럼 음수를 사용하면 됨! (instruction set 간소화)

- R-format
  : 명령어의 3개 피연산자 모두 레지스터에 들어있음,
    opcode와 funct로 명령어 구분

- I-format
  : 명령어의 1개 피연산자는 명령어 자체에 들어있음. 그것을 immediates 라고 부름.
    (레지스터나 메모리에 접근할 필요X),
    opcode로 명령어 구분.
    
   immediates는 16bit이고 2의 보수 체계로 작성된 수임.(-2^15 ~ +2^15-1)

  *2의 보수 : flip all the bits and add 1


- Number System Comparison with N-bit







- addi
  : I-format instruction
   addi rt, rs, imm

 

- lw
  : I-format instruction, read a word (32bit) from memory and loads into a register
   lw rt, address

    the base is $s3 and the offset is 24.
    immediate에는 offset이 담기며 그 수는 16bit 2's complement [-32768, 32767]

ex) lw $t0, 24($s3)
  # $t0 <= [$s3 + 24]
    Address Bus를 통해 CPU에서 Main Memory로 $s3+24 이 전달됨
   -> 전달받은 주소($s3에 담겨있는 주소로부터 24만큼 떨어진곳)에 있는 값이
       Data Bus를 통해 Main Memory에서 CPU로 실려옴 -> 그 값이 $t0에 저장됨.

 

- sw
  : I-format instruction, stores (writes) a word (32bit) from a register to main memory  
   sw rt, address


728x90

댓글