[컴퓨터구조] #5. MIPS 명령어(5)
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
: 가짜 명령어임. 컴파일러와 어셈블러가 진짜 기계명령어로 바꿔줌.