Chapter 4. 기계어(Machine Instruction)

MoonLight·2021년 10월 12일
0

컴퓨터구조

목록 보기
4/6

0x01. 컴퓨터에서 명령어의 표현

1.1 명령어 형식(Instruction format)

  • 명령어의 레이아웃
  • 하나의 명령어가 바이너리 필드로 구성된 형식

(1) R-type 명령어 형식(Register-type)

  • op : 명령어의 기본적인 연산자 (opcode)

  • rs, rt : 1번째, 2번째 송신지 피연산자 레지스터 (source operand)

  • rd : 목적지 피연산자 레지스터 (destination operand)

    • 연산의 결과값을 받음
  • shamt : 쉬프트의 양 (몇 번 shift했는지, shift amount)

  • funct : op필드(연산자)에서 나타난 연산의 특정한 연산 종류를 지정 (function code)

    • ex) opcode extension
    • R-type의 opcode bits는 모두 000000인데, 이 funct로 add, sub 이런것들을 구분한다.

    Example: 어셈블리어를 → 기계어로 번역해봐라.

    • add $t0, $s1, $s2 = add $8, $17, $18
    • [Answer]
      • 1번째 필드와 마지막 필드 : 덧셈 연산
      • 2번째 필드 : 처음 송신 피연산자의 Register number ($s1=$17)
      • 3번째 필드 : 다음 송신 피연산자의 Register number ($s2=$18)
      • 4번째 필드 : 목적지 피연산자의 Register number ($t0=$8)
      • 5번째 필드 : 명령어에 사용되지 않았음 (0으로 설정)

(2) I-type 명령어 형식(Immediate-type)

  • 설계 원칙 3 : 좋은 설계를 위해서는 적당한 타협이 필요하다.
InstructionFormatoprsrtrdshamtfunct상수or주소
addR-type0regregreg032X
subR-type0regregreg034X
add immediateI-type8regregXXX상수
lw (load word)I-type35regregXXX주소
sw (store word)I-type43regregXXX주소
  • Example: A[300] = h + A[300] ;

      lw $t0,1200($t1) # Temporary reg. $t0 gets A[300]
      add $t0,$s2,$t0  # Temporary reg. $t0 gets h+A[300]
      sw $t0,1200($t1) # Stores h+A[300] back into A[300]
  • [Answer]

1.2 기계어 예시

1.3 전체적인 그림

  1. 명령어는 결국 숫자로 표현된다.
  2. 프로그램도 읽히거나 쓰기위해 그냥 메모리에 숫자로 저장된다.



0x02. 논리 연산자(Logical Operations)

논리 연산자C 연산자Java 연산자MIPS 명령어
Shift left<<<<sll
Shift right>>>>>srl
Bit-by-bit AND&&and, andi
Bit-by-bit OR||or, ori
Bit-by-bit NOT~~nor

2.1 MIPS Shift 연산

(1) 개념

X=x31x30x0X = x_{31}x_{30}⋯x_0
  • 논리 쉬프트(Logical shift) :
    • 오른쪽 논리 쉬프트(Logical shift right) = 0x31x30x1x_{31}x_{30}⋯x_1
    • 왼쪽 논리 쉬프트(Logical shift left) = x30x29x0x_{30}x_{29}⋯x_00
  • 산술 쉬프트(for 2's complement) :
    • 오른쪽 산술 쉬프트(Arithmetic shift right) = x31x_{31} x30x1x_{30}⋯x_1 (cf) ÷2
    • 왼쪽 산술 쉬프트(Arithmetic shift left) = x30x29x0x_{30}x_{29}⋯x_00 (cf) *2
  • 순환 쉬프트(=rotate) :
    • 오른쪽 순환 쉬프트(Circular shift right) = x0x_{0} x31x_{31}x30x1x_{30}⋯x_1
    • 오른쪽 순환 쉬프트(Circular shift left) = x30x29x0x_{30}x_{29}⋯x_0x31x_{31}

(2) MIPS 쉬프트 명령어

  • sll(shift left logical) ; funct = 000 000 # 0
  • srl(shift right logical) ; funct = 000 010 # 2
  • sra(shift right arithmetic) ; funct = 000 011 # 3

명령어 형식

  • sllv(shift left logical variable)

  • srlv(shift right logical variable)

  • srav(shift right arithmetic variable)

    • ex) sllv $t2, $s0, $s1
  • rotr (rotate word right) ; funct = 000 010 (SRL)

  • rotrv (rotate word right variable) ; funct = 000 110 (SRLV)

2.2 MIPS Logical 연산

  • and $t0,$t1,$t2
  • or $t0,$t1,$t2
  • xor $t0,$t1,$t2
  • nor $t0,$t1,$t2   (cf) nor $t0,$t1,$zero
  • andi $s1,$s1,100
  • ori $s1,$s1,100
  • xori $s1,$s1,100
  • lui $s1,100

0x03. 의사결정을 위한 명령어

3.1 조건문 분기

(1) 명령어 예제(같은지 비교,equal)

  • if ~ go to와 비슷하다.

  • beq register1, register2, L1

  • bne register1, register2, L1

    • 참고로 L1은 레이블의 주소값(상수)이다.(Else: 나 Exit: 처럼)
  • ex) if (i==j) f=g+h; else f=g-h;

	bne $s3,$s4,Else # go to {Else} if i≠j
	add $s0,$s1,$s2 # f=g+h (skipped if i≠j)
	j Exit # unconditional branch
Else: sub $s0,$s1,$s2 # f=g-h (skipped if i=j)
Exit:

(2) 명령어 예제(작은지 비교, set on less than)

slt $t0,$s3,$s4 # if($s3<$s4) then $t0=1 
				# else $t0=0
================================================================
slti $t0,$s2,10 # if $s2<10 $t0=1; else $t0=0

참고 : 의사코드

blt $s0, $s1, Less : branch on less than

하지만 MIPS architecture에서는 blt 명령어를 쓰지 않는다. 그 이유는 모든 비교가 slt, slti, beq, bne 그리고 $zero의 조합으로 가능한데, clock cycle time이 증가하기 때문 혹은 cpi가 늘기 때문에 굳이 blt라는 명령어를 쓰지않는다. 이걸 만들바에 차라리 slt같은것 하나 더 쓰는게 더 이득이다.

3.2 반복문

(1) 예제

  • ex) while (save[i]==k) i += 1;
    • 단, save의 base address가 $s6라고 가정한다.
    • i, k는 각각 $s3, $s5라고 가정한다.
Loop: sll $t1,$s3,2 # 임시레지스터$t1 = 4*i
	  add $t1,$t1,$s6 # $t1 = save[i]의 주소
  	  lw $t0,0($t1) # Temp reg $t0 = save[i]
	  bne $t0,$s5,Exit # go to Exit if save[i]≠k
	  addi $s3,$s3,1 # i = i + 1
	  j Loop # go to Loop
Exit:

3.3 Jump

(1) 예제

  • j (jump) : Lable의 주소값(상수값)으로 이동할 때 j를 쓴다.
j Loop
  • jr (jump register) : Lable의 주소값이 레지스터에 들어있을 때 jr을 쓴다. 함수호출(function call)을 끝내기 위한 명령어이다.
jr $t0 # register($t0)내에있는 주소로 jump!
	   # i.e. PC ← $t0
	   
jr $ra # 프로시저로부터 리턴, 보통 이 형식으로 사용한다.

PCProgram Counter의 약자로 레지스터 $0~$31에 포함되지 않는 특수 레지스터이다. 이 레지스터는 현재 수행해야 하는 명령어의 주소값이 들어있다.

  • jal (jump and link) :명령어는 1개이나 2가지 action이 일어난다. 리턴어드레스 레지스터에 PC+4 를 저장하고 PC에는 함수주소를 넣는다. 즉 함수호출(function call)을 시작하기위한 명령어이다.
jal ProcedureAddress # $ra ← PC + 4, (단 $ra는 return address )
					 # PC ← Procedure address

0x04. MIPS 레지스터 정리

참고 : $spESP이고, $fpEBP이다.

  • $v0-$v1 은 함수의 리턴값이 저장된다.

profile
hello world :)

0개의 댓글