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
and(or, nor) rd, rs, rt
and $t0, $t1, $t2
or $t0, $t1, $t2
nor $t0, $t1, $t2
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비트 상수 로드하는 수도 명령어)