CS/3-1 컴구

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

이지이즤 2022. 3. 23. 23:42

 

Lec 5. MIPS Instructions_5 (Language of the Computer)

 

- MIPS Logical Instructions
  : 논리 연산 명령어 and, andi, or, ori, xor, nor 등등
    source 전체가 몇 bit이든 간에 논리연산은 1bit끼리 연산함.

 

- and
  : useful for masking bits 마스킹

- or
  : useful for combining bit fields 결합


- nor
  : useful for inverting bits 반전

 


- and, or, nor
  : R-format instruction
   and(or, nor) rd, rs, rt
 

 

- andi, ori
  : I-format instruction
   andi(ori) rt, rs, imm

   $t1은 레지스터이기때문에 32bit이고 immediate는 16bit인데
   어떻게 논리연산을 진행할까?
   -> immediate의 앞에 16bit를 extension해준 후 논리연산 진행함.
   -> zero-extension일까? sign-extension일까? (전자임. 그 이유는 아래 참고)

- Sign Extension vs Zero-Extension
  : immediate는 원래 sign-extension을 함. (addi 등등)
    근데 논리연산(ansi, ori, xori)에서는 예외적으로 zero-extension을 함. (상위 16bit를 무조건 0으로 채움)

 





- Basic Shifting
  Shift types : Logical (unsigned) shift, Artiyhmetic (signed) shift
  Shift directions : Left (multiply by 2의 거듭제곱), Right (divide by 2의 거듭제곱)
  

- Logical Shift (unsigned)
  left : 무조건 0으로 채움  (11001011 << 3) = 01011000
  right : 무조건 0으로 채움  (11001011 >> 3) = 00011001

- Arithmetic Shift (signed)
  left : shift left는 signed여도 0으로 채우기때문에 sla는 존재하지 않음. sll을 씀.
  right : sign bit로 채움 (1100 >>>3) = 1111

 

- MIPS Shift Instructions
  sll, srl, sra : shift left/rignt logical/arithmetic 몇 칸 움직일지의 정보가 명령어 자체에 들어있음.
  sllv, srlv, srav : variable 레지스터가 보관하고 있는 값 참고해서 그만큼 shift해줌.

- sll, srl, sra
  : R-format instruction, shift the value in a register left or right by up to 31 bits (5bit shamt field)
    -> 몇 칸 shift 할 지 명령어 안에 직접 써있다고 했는데 I-format이 아니라 R-format인 이유는
         R-format안에도 shift amount(sa)라는 5bit constant 공간을 갖고있기 때문. (0~31 값 표현 가능)
    -> 레지스터 크기가 32bit이기때문에 그 이상의 shift는 의미없음. 따라서 0~31칸만 shift가능.
    sll rd, rt, shamt : shift left logical
    srl rd, rt, shamt : shift right logical
    sra rd, rt, shamt : shift right arithmetic


- sllv, srlv, srav
  : R-format instruction, variable-shift instructions
    sllv rd, rt, rs : shift left logical variable
    srlv rd, rt, rs : shift rirght logical variable
    srav rd, rt, rs : shift rignt arithmetic variable
    -> $rs 레지스터의 하위 5bit(0~31 사이의 값)만 가져와서 shift 연산 함. ($rs[4:0])



 

- How to load a 32-bit constant?
  방법1) Use lw instruction 메인메모리에서 32bit 가져오기
           : 특정 메모리 주소에 원하는 32bit 상수를 넣고 나서 가능.
  방법2) Use 2 instruction  직접 32bit 값을 넣고 싶을 때명령어 2개 써야됨.
           왜나면
'복사할 32bit + 복사하라는 명령' => 32bit 초과하므로.
           lui (load upper immediate) : 상위 16bit 위치에 상수 값 16bit 넣고 하위는 0으로 세팅.
           ori (or immediate) : 상위는 zero-extension하고 하위 16bit 위치에 상수 값 16bit 넣음.


  근데 명령어 2개 쓰기 귀찮음... 그래서 명령어 1개만으로도 같은 동작 시킬 수 있는 방법이 있음!
- Pseudo Instructions
  : 가짜 명령어임. 컴파일러와 어셈블러가 진짜 기계명령어로 바꿔줌.