CS/컴퓨터 구조

[컴퓨터 구조] Logical Operations

윤곰이 2024. 6. 15. 22:55

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

  1. 비트 반전 유리 ( 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으로
    그 다음 or 명령어 이용해서 오른쪽 16bit 채우기 가능
    • 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