Logical Operations(논리 명령어)
Operation | C | Java | MIPS |
Shift left | << | << | sll |
Shift right | >> | >>> | srl |
Bitwise AND | & | & | and, andi |
Bitwise OR | |||
Bitwise NOT | ~ | ~ | nor |
1. Shift Operations
- shamt: 옮겨야하는 비트 수
- Shift left : 왼쪽으로 이동 후 빈공간 0으로 채우기 (i 이동 : $2^i$ 곱하기)
- Shift right: 오른쪽으로 이동 후 빈공간 0으로 채우기(i 이동 : $2^i$ 나누기)
💡 Shift Operation 들
sll, srl→ r-format (0으로 채움)
sllv, srlv → sll,srl 과 비슷하지만, shift amount (shamt) 가 $rs [4:0]로부터
sra, srav: shift right의 산술(arithmetic) (sign 비트로 채움)
→ sll,srl,sra: 몇 칸 움직일지의 정보가 명령어 자체에 들어있음
→ sllv,srlv, srav: variable 레지스터가 보관하고 있는 값 참고해서 그 만큼 shift
2. AND Operations
- bits masking 하는데 유용 (특정 구간 말고는 모두 없애버림 가능!!)
A B | A&B |
0 0 | 0 |
0 1 | 0 |
1 0 | 0 |
1 1 | 1 |
3. OR Operations
다른 것은 안 변하게 그대로 두고, 특정 구간만 1로 바꿀 수 있음
A B | A or B |
0 0 | 0 |
0 1 | 1 |
1 0 | 1 |
1 1 | 1 |
4. NOT Operations
- 비트 반전 유리 ( 0→1, 1→0)
- MIPS는 not 연산이 따로 존재하지 않고, nor 연산과 $zero 이용
- 예) nor $t0, $t1, $zero
5. XOR
같은지 다른 지 판단 가능
A B | A⊕B |
0 0 | 0 |
0 1 | 1 |
1 0 | 1 |
1 1 | 0 |
Conditional Operations
- 조건이 맞다면 Labeled instruction으로 분기, 아니라면 다음 instruction 실행
- beq rs, rt, L1 : if (rs==rt) 라면 L1으로 분기
- bne rs, rt, L1 : if(rs!=rt) 라면 L1으로 분기
- j L1 : 무조건 분기
If Statements
- C code
if (i==j) f=g+h;
else f=g-h;
→ compiled MIPS code
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: ...
Loop Statements
- C code
while (save[i] == k) i += 1;
- → i: $s3, k: $s5, save의 base address: $s6 -> compiled MIPS code
-
Loop: sll $t0, $s3, 2 add $t1, $t1, $s6 lw $t0, 0($t1) //save[i]를 $t0에 load bne $t0, $s5, Exit //save[i]와 k가 같지 않으면 Exit addi $s3, $s3, 1 j Loop Exit:...
More: 조건 → 결과 1로, 아니면 0으로 (Set On Less Than)
- slt rd, rs, rt
- rs < rt 면 rd=1, 아니면 rt=0
- slti rt, rs, constant
- rs < constant면 rt=1, 아니면 rt=0
- beq, bne와 combination으로 쓰임 → 해당 합성명령어 가지는 것보다 이렇게 쓰는 것이 FASTER
slt $t0, $s1, $s2 //sl<s2이면 t0는 1
bne $t0, $zero, L //t0가 1이면 분기!!!
- → branch less than: if($s1 <$s2) branch to L
Branch Instruction에서 blt, bge 등이 없는 이유는?
→ 인간형 명형어임.
<, ≤ 같은 명령어⇒ complex ⇒ clock ⬆️ 가능 ⇒ 하드웨어 slower
⇒ 명령어 2번 처리하는 것이 faster
MIPS Jump Instructions
- j : jump
- jal: jump-and-link - 함수 호출 시 사용
j와 비슷하지만, $ra에 return address(current pc+4)를 저장함
ex) jal LABEL - jr: jump register - 함수 복귀 시 사용
ex) jr $ra
MIPS Assembler Register Names
→ 32bit 뿐이며, 부족하다면 memory 사용함
32-bit Constants
- 대부분의 constant는 작기 때문에 16bit 공간이 충분함
- 간혹있는 32-bit constant ( 그냥 명령어 자체가 32비트이므로 쪼개서 넣어야 함)
- → lui rt, constant
- 16-bit 상수를 rt의 왼쪽 16bit 에 copy
- rt의 오른쪽 16비트를 0으로
- Example
Assembler Pseudoinstructions (의사명령어)
- 실제 기계 명령어와는 조금 다른, 프로그래머가 읽고 이해하기 쉬운 명령어
- 여러개의 기계어 명령어로 변환 (assembler)
move $t0, $t1 → add $t0, $zero, $t1
li $t0, 0x12345678 → lui $t0, 0x1234 , ori $t0, $t0, 0x5678 → 한번에 load x, 두 번 쪼개서
blt $t0, $tl, L → slt $at, $t0, $t1 , bne $at, $zero, L
Procedure
procedure (= function)
- 코드 재사용을 용이하게 해주는 routine (명령어 그룹)
- parameter를 받아서 result return
- procedure 완료 후, local variables 지워짐
💡 Procedure calling
1. 인자값을 $a0 ~ $a3 레지스터에 설정, 전달
2. 피호출 함수로 컨트롤 이동
3. 함수를 위한 storage 할당
4. 함수 실행
5.결과를 $v0~$v1 레지스터에 저장 → 호출함수에 전달
6.복귀 ($ra로)
Procedure Call Instructions
- Procedure Call(호출) : Jump and Link
- jal ProcedureLabel
- 다음 명령의 주소를 $ra에 저장 (register 31: return address)
- target address로 jump
- Procedure return: Jump register
- jr $ra
- 호출된 부분(저장 중인 주소값)으로 돌아감
Using More Registers
- 4개의 입력 파라미터, 2개의 리턴값이 모자랄 수 있음
- MIPS는 32개의 한정된 레지스터를 가짐 → 레지스터 모자랄 경우 메모리에 값 저장
- 자주 사용하지 않는 변수를 메모리에 넣는 일: register spilling
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] MIPS instructions (0) | 2024.06.15 |
---|---|
[컴퓨터 구조] Instructions (0) | 2024.06.15 |
[컴퓨터 구조] SPEC Benchmark & Amdahl’s law (0) | 2024.06.15 |
[컴퓨터 구조] IC 제조 & Performance (0) | 2024.04.27 |
[컴퓨터 구조] 컴퓨터 추상화와 구조 (0) | 2024.04.27 |