본문 바로가기
Alchitecture

ISA와 MIPS

by 보라코끼리 2022. 1. 4.
728x90

- 본 문서는 kocw 의 [컴퓨터구조] - 영남대학교 최규상 교수님의 강의를 보고 작성하였습니다.

Unsigned Binary Integers(부호가 없는 이진수)

  • 모든 내용을 0과 1로 표현하는 것
  • n-bit로 되어있는 수의 표현 방식

  • 범위 : 0 ~ 2^n - 1
  • ex)
    • 0000 0000 0000 0000 0000 0000 0000 1011(2)
      = 0 + ... + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
      = 0 + ... + 8 + 0 + 2 + 1
      = 11(10)
    • 32bits
      • 범위 : 0  ~ 4,294,967,295

 

2의 보수로 표현하는 부호가 있는 정수

  • n-bit로 되어있는 수의 표현 방식

  • 범위 : -2^n-1 ~ +2^n-1 -1
    • 음수의 최대값이 양수의 최대값보다 하나 더 많은 범위로 표현
  • ex)
    • 1111 1111 1111 1111 1111 1111 1111 1100(2)
      = -1 * 2^31 + 1 * 2^30 + ... + 1 * 2^2 + 0 * 2^1 + 0 * 2^0
      = -2,147,483,648 + 2,147,483,644
      = -4(10)
    • 32bits
      • 범위 : -2,147,483,648 ~ +2,147,483,647
  • 31bit -> 가장 왼쪽에 있는 bit(LSD)는 부호를 나타내는 비트
    • 1 : 음수
    • 0 : 양수 or 0
  • -(-2^n-1)과 같은 숫자는 표현되지 않는다
  • 양수의 경우 2의 보수로 표현한 수와 부호 없이 표현한 수가 같다
  • 표현
    •  0 : 0000 0000 ... 0000
      -1 : 1111 1111 ... 1111
      
      음수 최댓값 : 1000 0000 ... 0000
      양수 최댓값 : 0111 1111 ... 1111

 

Signed Negation(부호 바꿈)

  • 양수를 음수로, 음수를 양수로 바꾸어주는 것
  • Complement and add 1 
    • complement : 0 -> 1로, 1 -> 0 으로 바꿈

  • ex) negate +2 (양수2 부호 바꿈) 
    • +2 = 0000 0000 ... 0010(2)
      -2 = 1111 1111 ... 1101(2) + 1
         = 1111 1111 ... 1110(2)

 

Sign Extension

  • 숫자를 더 큰 비트로 표현하는 것
    • 8bit -> 16bit, 32bit ..
  • 더 큰 비트로 표현되어도 부호는 유지되어야 한다
  • MIPS instruction set
    • addi : extend immediate value
    • lb(load byte), lh(load halfword, load two byte) : extend loaded byte/halfword
    • beq, bne : extend the displacement
  • sign bit 를 왼쪽에서부터 확장한다
    • unsigned 값은 0으로 채운다
    • sign bit 의 값을 확장된 곳에 채운다
  • ex) 8bit -> 16bit
    • +2 : 0000 0010 => 0000 0000 0000 0010
      -2 : 1111 1110 => 1111 1111 1111 1110

 

Representing Instructions

  • 모든 명령어는 2진수(binary)로 표현된다
    • machine code 라고 부른다
  • MIPS instruction(명령어)
    • 32bit words 로 표현된다
    • 적은 operation code (opcode), register numbers, ..
    • 간단하게 만들 수 있고 성능이 빠르다.
  • Register numbers
    • $t0 - $t7 : reg's 8 - 15
    • $t8 - $t9 : reg's 24 - 25
    • $s0 - $s7 : reg's 16-23

 

MIPS R-format instrructions

  • Instruction fields(명령어 필드)
    • op : operation code (opcode)
    • rs : first source register number
    • rt : second source register number
    • rd : destination register number
    • shamt : shift amount (00000 for now)
    • funct : function code (extends opcode)
  • ex)
    • add $t0, $s1, $s2

  • 0000001000110010010000000100000(2) = 02324020(16)​
     

 

Hexadecimal(16진법)

  • bit 문자열을 간결하게 표현하기 위한 방법
  • 4bits/hex digit
0 0000 4 0100 8 1000 c 1100
1 0001 5 0101 9 1001 d 1101
2 0010 6 0110 a 1010 e 1110
3 0011 7 0111 b 1011 f 1111
  • ex) eca8 6420(16) = 0Xeca8 6420 = 0xeca8 6420
    • 1110 1100 1010 1000 0110 0100 0010 0000(2)

 

MIPS I-format Instructions

  • I-format : immediate format

  • immediate arithmetic(즉시 연산) and load/store instructions
    • rt : destination or source register number (대상 또는 소스 레지스터 수)
    • constant(상수) : -2^15 ~ +2^15 - 1
    • address : offset added to base address in rs (rs 단위의 기본 주소에 오프셋 추가)
  • 디자인 원칙 4 : 서로 다른 두 가지를 하나로 잘 합친다
    • 서로 별개인 immediate arthmetic과 load/store instructions를 MIPS I-format instruction으로 잘 합친다
    • instruction format 이 단순해진다
    • 단순해지면서 고성능을 얻을 수 있게 된다

 

Stored Program Computers

  • 메모리에는 다양한 프로그램들이 존재한다
  • 명령어들은 일반 데이터처럼 binary(2진법)으로 되어있다
  • 명령어와 데이터는 메모리에 있다
  • 프로그램과 관련된 프로그램이 존재한다
    • 컴파일러, 링커 ..
  • 어떤 바이너리 코드가 다른 머신에서 실행될 수 있는가?
    • 표준화된 ISA 가 있으면 가능하다

 

Logical Operations(논리 연산)

Operation C Java MIPS
Shift left << << sll
Shift right >> >> srl
Bitwise AND & & and, andi
Bitwise OR | | or, ori
Bitwise NOT ~ ~ nor
  • Bitwise : 비트 단위로 AND, OR, NOT 을 확인한다
  • 한 워드(word)에서 특정한 비트에 대한 연산에서 효과적으로 사용할 수 있다

 

Shift Operation

  • shamt : shift 연산을 몇 번 할 것인가?
  • Shift left logical
    • 왼쪽으로 shift 후 0으로 채운다
    • i bit 만큼 shift left 연산을 하면 2^i 만큼 곱한 효과가 있다
  • Shift right logical
    • 오른쪽으로 shift 후 0으로 채운다
    • i bit 만큼 shift right 연산을 하면 2^i 만큼 나눈 효과가 있다(unsigned 에서만 가능하다)

 

AND Operation

  • 모두 1일 때만 1이 되기 때문에 특정한 비트의 값을 뽑아낼 때 사용한다
    • $t1 과 $t2 모두 1일 때만 $t0가 1
  • MIPS
    • and $t0, $t1, $t2

 

OR Operation

  • 둘 중 하나만 1이어도 1이 되기 때문에 특정한 값을 1로 세팅할 때 사용한다
    • $t1 과 $t2 중 하나만 1이면 $t0가 1
  • MIPS
    • or $t0, $t1, $t2

 

NOT Operation

  • 0 -> 1, 1 -> 0 으로 반대로 만들어주는 연산
  • MIPS
    • nor $t0, $t1, $zero
    • $t1의 값을 모두 반대로 바꿔준다.

 

Conditional Operation

  • if else 와 같은 형태
  • 조건이 true 이면 labeled 되어있는 instruction 으로 branch
  • beq rs, rt, L1
    • rs 와 rt 의 값이 같으면 L1 으로
  • bne rs, rt, L1
    • rs 와 rt 의 값이 같지 않으면 L1 으로
  • j L1
    • 무조건 L1 으로

 

Compiling If Statements

C code

if (i == j) f = g + h;
else f = g - h;
  • f, g, ... in $s0, $s1, ...
Compiled MIPS code

	  bne $s3, $s4, Else
	  add $s0, $s1, $s2
	  j   Exit
Else: sub $s0, $s1, $s2
Exit: ... (Assembler calculates addresses)

 

Compiling Loop Statements

C code

while (save[i] == k) i += 1;
  • i in $s3, k in $s5, address of save in $s6
Compiled MIPS code

Loop:  sll  $t1, $s3, 2            = $s3 * 4
       add  $t1, $t1, $s6
       lw   $t0, 0($t1)
       bne  $t0, $s5, Exit
       addi $s3, $s3, 1
       j    Loop
Exit:  ...

 

Basic Blocks

  • 다음 두 조건을 만족하는 어떤 명령어들의 sequence(집합)
    • 중간에 branch 명령어가 없어야 한다 (마지막엔 가능)
    • 중간에 branch target(label이 된 것) 이 없어야 한다 (처음엔 가능)
      • ex) Loop, Exit
  • 컴파일러와 프로세서는 basic block을 빠르게 실행하게 하기 위한 일을 한다
    • 고성능을 얻기 위함

 

More Conditional Operations

  • 어떤 조건이 true 이면 결과에 1을 세팅, 아니면 0
  • ex)
    • slt rc, rs, rt
      • if(rs < rt) rd = 1; else rd = 0;
    • slti rt, rs, constant
      • if(rs <constant) rt = 1; else rt = 0;
    • slt $t0, $s1, $s2 bne $t0, $zero, L
      • if ($s1 < $s2) branch to L

 

Branch Instruction Design

  • 하드웨어에서 =, ≠ 연산보다 <, ≥ 연산이 더 느리다
728x90