MIPS Instructions #5

charrrming·2022년 4월 9일

Computer Architecture

목록 보기
5/17

1. MIPS Logical Instructions

- and, andi, or, ori, xor, nor 등
- bit by bit, 2개의 소스 레지스터와 1개의 목적지 레지스터 필요
- and : masking bits
- or : combining bit fields
- nor : inverting bits
		ex) A NOR $0 = NOT A
        	  = NOT {A or $0}
              = NOT A

2. R-format Instruction (and, or, nor)

and(or, nor) rd, rs, rt

and $t0, $t1, $t2
or $t0, $t1, $t2
nor $t0, $t1, $t2

3. I-format Instruction (andi, ori)

andi(ori) rt, rs, imm

andi $t0, $t1, 0xFF00
ori $t0, $t1, 0xFF00

4. Sign Extension & Zero Extension

- 대부분의 MIPS 명령어는 sign-extend가 기본임 (addi)
- 하지만 논리 연산(andi, ori, xori)은 예외임
  상위 16비트를 모두 0으로 채운다 -> zero extension

5. Shifting

- Shift types : Logical(unsigned) / Arithmetic(signed)
- Shift directions : Left(곱하기 2) / Right(나누기 2)
	-> floor value를 택한다 (작거나 같은 수 중에 가장 큰 정수)
- << logical, >>> arithmetic
- Logical Shift Left (sll)
	MSB: out
    LSB: 0
    
- Logical Shift Right (srl)
	MSB: 0
    LSB: out
    
=> Logical Shift는 unsigned 정수의 곱셈, 나눗셈에 사용
- Arithmetic Shift Right (sra)
	MSB: sign bit 유지
    LSB: out

=> Arithmetic Shift는 signed 정수의 곱셈, 나눗셈에 사용
R-format Instructions -> sll, srl, sra
- shift 명령어는 왼쪽, 오른쪽으로 31비트까지 shift한다
  31비트 넘어가면 원래 값이 다 없어지기 때문에! -> shamt 필드(5비트)
  
  sll(srl, sra) rd, rt, shamt
  
  sll $t0, $s1, 4	#$t0 = $s1 << 4bits
  srl $t2, $s0, 8	#$t2 = $s0 >> 8bits
  sra $s3, $s1, 4	#$s3 = $s1 >>> 4bits
R-format Instructions -> sllv, srlv, srav (v는 variable shift)

  sllv(srlv, srav) rd, rt, rs (shamt 필드 사용 안함!)
  => $rs[4:0], rs 레지스터 값 32비트 중 하위 5비트만 가져옴 (0~31 사이 값)
  
  sllv $s3, $s1, $s2	#$s3 = $s1 << $s2
  srlv $s4, $s1, $s2	#$s4 = $s1 >> $s2
  srav $s5, $s1, $s2	#$s5 = $s1 >>> $s2

6. How to load a 32-bit constant?

Q. 32비트 상수를 어떻게 레지스터로 로드하나?
	-> 명령어 하나로는 불가능, 명렁어 총 길이가 32비트임 -> 쪼개라
    -> lui(load upper immediate), ori(or immediate) 두개 써라
    
lui $t0, 0x1234		#상위 16비트에 저장하고 하위 16비트는 모두 0으로
ori, $t0, $t0, 0x5678		#논리 연산이니까 zero extension

=> MIPS는 수도 명령어를 제공, 그냥 li $s0, 0x12345678 쓰면 됨
   (32비트 상수 로드하는 수도 명령어)

0개의 댓글