명령어(instructions)[1]

임승섭·2023년 4월 5일
0

Computer Architecture

목록 보기
1/19
post-thumbnail

Instruction Set

RISC : Reduced Instruction Set Computer

  • ARMS, MIPS

CISC : Complex Instruction Set Computer

  • x86

하드웨어 연산 Arithmetic Operations

Add and subtract, three operands

operator vs operatand ?

Two sources and one destination
add a, b, c : b와 c를 더해서 그 합을 a에 넣어라.

Design Principle 1 : Simplicity favours regularity
(간단하기 위해서는 규칙적인 것이 좋다)

C code vs Compiled MIPS code

  • C code :
 f = (g + h) - (i + j)
  • Compiled MIPS code
 add t0, g, h // temp t0 = g + h
 add t1, i, j // temp t1 = i + j
 sub f, t0, t1 // f = t0 - t1

피연산자

Register Operands

  • 산술 명령어(arithmetic instruction)의 피연산자(Operand)에는 제약이 있다.
  • 레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치 몇 곳에 있는 것 만을 사용할 수 있다.

What register means?

  • MIPS has a 32 x 32-bit register file

    • Numbered 0 to 31

    • 32-bit data called a 'word'

      • MIPS 구조에서 레지스터의 크기는 32비트이다
      • MIPS에서는 32비트가 한 덩어리로 처리되는 일이 매우 빈번해서 이를 워드라고 부른다
      • 레지스터의 개수는 한정되어 있고, 보통 32개의 레지스터가 있다.
  • Assembler names (for register)
    • $t0 ~ $t9 for tempeorary values. (저장하기 위한)

    • $s0 ~ $s7 for saved variables.
      This register names map to real register

Design Principle 2 : Smaller is faster
(작은 것이 더 빠르다)

Register Operand Example

  • C code :
    f, g, h, i, j in $s0 ~$s4
 f = (g + h) - (i + j);
  • Compiled MIPS code :
 add $t0, $s1, $s2
 add $t1, $s3, $s4
 sub $s0, $t0, $t1

메모리 피연산자 Memory Operands

  • Main memory used for composite data.
    메인 메모리에서는 단순 변수 외에도 배열(array), 구조체(structure)와 같은 복잡한 자료구조를 사용한다. 이런 복잡한 자료구조 하나에는 레지스터 개수보다 훨씬 많은 데이터 원소가 있을 수 있다.
  • 프로세서는 소량의 데이터만을 레지스터에 저장할 수 있고, 컴퓨터 메모리는 수십억 개의 데이터를 저장할 수 있다.
  • 따라서, 배열이나 구조체 같은 자료구조는 메모리에 보관한다.
  • 그렇다면, MIPS에서 산술연산은 레지스터에서만 실행되므로, 메모리와 레지스터 간 데이터를 주고받는 명령어가 필요하다. 명령어는 메모리 주소를 지정해야 한다.
  • 메모리에서 레지스터로 데이터를 복사해 오는 데이터 전송 명령을 load라 한다. lw
  • load와 반대로 레지스터에서 메모리로 데이터를 보내는 명령을 store라고 한다. sw
  • Memory is byte addressed. Each address identifies an 8-bit byte
  • Words are aligned in memory. Address must be a multiple of 4
  • MIPS는 Big Endian 방식을 사용한다
    : Most significant byte at least address of a word

Memory Operand Example 1

  • C code :
    g in $s1, h in $s2, base address(시작 주소) of A in $s3
 g = h + A[8];
  • Compiled MIPS code :
    Index 8 requires offset of 32. 4 bytes per word
lw $t0, 32($s3) # load word
add $s1, $s2, $t0
  • 피연산자 중 하나(A[])가 메모리에 있기 때문에, 먼저 A[8]을 레지스터로 옮긴 후, 연산을 시작해야 한다.
  • 배열 원소의 주소는 $s3에 있는 배열의 시작 주소에 32를 더한 값이다. 이 상수 부분을 변위(offset)라고 한다. 또한, 주소 계산을 위해 여기에 더해지는 레지스터 $s3를 base register라고 한다.

Memory Operand Example 2

  • C code :
    h in $s2, base address(시작 주소) of A in $s3
A[12] = h + A[8]
  • Compiled MIPS code :
    Index 8 requires offset of 32
lw $t0, 32($s3) # temporary reg(?) $t0 gets A[8]
add $t0, $s2, $t0 # temporary reg(?) $t0 gets h + A[8]
sw $t0, 48($s3) # store h + A[8] back into A[12]

Register vs. Memory

  • Registers are faster to access than memory.
  • Operating on memory data requires loads and stores.
    More instructions to be executed.

    레지스터는 메모리보다 접근시간이 짧고 처리량도 많다

  • Complilers must use register for variables as much as posssible. Only spill to memory for less frequently used variables.
    (컴퓨터가 갖고 있는 레지스터보다 프로그램에서 사용하는 변수가 더 많은 경우가 자주 있기 때문에, 컴파일러는 자주 사용되는 변수를 가능한 한 많이 레지스터에 넣고 나머지 변수는 메모리에 저장했다가 필요할 때 꺼내서 레지스터에 넣는다. 이 때 자주 사용하지 않는 변수를 메모리에 넣는 일을 spilling 이라고 말한다.)

상수 피연산자 Immediate Operands

  • Constant data specified in an instruction
    addi $s3, $s3, 4
  • No subtract immediate instruction. Just use a negative instruction
    addi $s2, $s1, -1

Design Principle 3 : Make the common case fast
(자주 생기는 일을 빠르게 하라)

  • MIPS registor 0($zero) is the constant 0. It cannot be overwritten. It is useful for common operations. Adding zero means just move.
    move instruction
    add $t2, $s1, $zero

Signed and Unsigned

Unsigned Binary Integers

Given n-bit number, range : 0 to 2n12^n - 1
Using 32 bits, 0 to 4,294,967,295


2's complement Signed Integers

Given n-bit number, range : 2n1-2^{n-1} to 2n112^{n-1} - 1
Using 32 bits, -2,147,483,628 to +2,148,483,647

Bit 31 is sign bit

  • 1 for negative numbers
  • 0 for non-negative numbers

Non-negative numbers have the same unsigned and 2's complement representation.

0                        : 0000 0000 ... 0000
-1                       : 1111 1111 ... 1111
Most-negative : 1000 0000 ... 0000
Most-positive  : 0111 1111 ... 1111


Signed Negation

  • Complement and add 1
x + x바 = 1111...111 => -1
x바 + 1 = -x
+2 = 0000 0000 ... 0010
-2 = 1111 1111 ... 1101 + 0000 0000 ... 0001
   = 1111 1111 ... 1110 

Sign Extension

  • Representing a number using more bits. Preserve the numeric value
  • In MIPS instruction set
    • addi : extend immediate value
    • lb, lh : extend loaded byte/halfword

      Byte = 8bits
      Halfword = 16bits
      Word = 32 bits
      Doubleword = 64 bits
      Quadword = 128 bits

    • beq, bne : extend the displacement (나중에 더 나올 예정)

  • Replicate the sign bit to the left
    +2 : 0000 0010 => 0000 0000 0000 0010
    -2 : 1111 1110 => 1111 1111 1111 1110

0개의 댓글