본문 바로가기
System SW

[2.3] MIPS Instruction Set Architecture III - 논리연산 & Data Transfer 연산

by Hangii 2022. 10. 12.

MIPS의 논리 연산과 메모리에 접근하는 Data Transfer 연산에 대해 알아본다.

  • 논리 연산

  • C언어에서 3 & 1 연산을 하면 결과는 1이 나온다. 이유는 C와 같은 고급 언어에서는 0이 아닌 모든 수를 참으로 가정하기 때문에 참 & 참 = 참이므로 결과가 1(참)이 나오는 것이다.
  • 하지만 기계어에서 진행되는 bit 단위 연산에서 3 & 1 을 수행하면 0011 & 0001 = 0001 이다.
    • 예시가 좀 별론데...어쨌든 무슨 의미인지 알겠죠? ㅎ
  • 논리 연산에서도 산술 연산과 마찬가지로 immediate 값(16bit)을 사용할 수 있다.
    • 레지스터에는 32bit 값을 저장할 수 있는데, immediate에는 16bit 값을 저장한다. and immediate에서는 32bit의 레지스터 값과 16bit의 immediate값을 bit 단위 논리 연산해야 하는 경우가 발생한다. 이 연산을 어떻게 진행해야 할까?
      • 양수끼리의 연산이라면, 0을 사용해 16bit를 확장하면 된다(32bit가 되도록).
      • 음수가 있는 연산이라면, 2의 보수법에 따라 MSB가 signed bit일테니 immediate의 MSB값으로 모자란 16bit를 확장하면 된다. 

  • 메모리에 접근하는 연산

  • load word(4 byte): 메모리에 저장된 값을 레지스터로 옮김, 4byte를 저장함
  • store word(4 byte): 레지스터의 값을 메모리에 저장함
  • load halfword(2 byte): 메모리에 저장된 값을 레지스터로 옮김
  • load byte unsigned:
  • store byte(1 byte): 1 byte를 저장함
  • MIPS에서 메모리의 특정 주소를 표현하려면 32bit가 필요했다. 그런데 MIPS의 기계어 하나는 32bit이므로 주소를 나타낼 공간이 부족하다. 메모리 주소 외에도 opcode와 값을 load/store하는 데 사용할 레지스터가 적어도 하나 필요하기 때문이다. 따라서 load/store에서는 접근하려는 메모리의 기본 주소(base address)를 레지스터에 저장한 후, 16bit를 사용해 해당 주소로부터 얼만큼(몇 번지) 떨어진 곳의 값을 가리킬 것인지를 저장한다. 
  • 레지스터 하나의 크기는 4byte인데, store byte의 경우 1byte를 저장하는 명령어이므로 상위 3byte를 잘라낸 후 하위 1byte만을 메모리에 저장한다. 메모리로부터 1byte를 읽어오는 경우 MSB 값으로 sign extension을 진행한 후 레지스터에 저장한다.
  • 모든 MIPS연산은 unsigned로 하는 것이 가능하다. load byte unsigned 등이 그 예인데, 이는 MSB값을 sign bit로 해석하지 않고, 1byte 내의 모든 값을 양수로 해석하는 연산이다. 이 경우 sign extension할 때 비어있는 bit값들을 무조건 0으로 채운다.

정리하자면,

  • MIPS에서 모든 메모리 접근은 load/store을 통해서만 가능하다.
  • 메모리로부터 halfword 또는 byte 단위 load 시
    • signed operation의 경우 sign extension 진행
    • unsigned operation의 경우 zero extension 진행(unsigned가 명시적으로 붙지 않으면 signed operation으로 간주한다.)
  • Alignment restriction
    • MIPS에서 word(4byte) 단위의 load/store할 때는 메모리 주소가 4의 배수여야 한다.
    • halfword(2 byte) 단위 load/store할 때는 메모리의 주소가 2의 배수여야 한다. 
    • 메모리로부터 4byte를 load하고 싶은데, 메모리 상의 읽고 싶은 부분의 시작 주소가 4의 배수가 아니라면 어떻게 해야 하는가?
      • 2 byte로 끊어 읽든지 1byte로 끊어 읽든지 해야한다.

댓글