명령어(Instructions)[2]

임승섭·2023년 4월 5일
0

Computer Architecture

목록 보기
2/19

명령어의 내부 표현 Represent Instructions

  • Instructions are encoded in binary, called machine code
  • MIPS instructions
    • Encoded as 32-bit instruction words
    • small number of formats encoding opcode, register numbers, ...
      • R-type, I-type, J-type
  • Register numbers
    • $t0 - $t7 are reg's 8 - 15
    • $t8 - $t9 are reg's 24 - 25
    • $s0 - $s7 are reg's 16 - 23

MIPS R-format Instructions (R : register)

oprsrtrdshamtfunct
6 bits5 bits5 bits5 bits5 bits6 bits
  • Instruction fields (각각을 field라고 부른다)
    • op : operation code (opcode)
      • 명령어가 실행할 연산의 종류로서 연산자(opcode)라고 부른다.
    • rs : first source register number
      • 첫 번째 근원지(source) 피연산자 레지스터
    • rt : second source register number
      • 두 번째 근원지 피연산자 레지스터
    • rd : destination register number
      • 목적지(destination) 레지스터. 연산 결과가 기억된다.
    • shamt : shift amount (00000 for now)
      • 자리이동(shift) 양(amount)..
    • funct : function code (extends opcode)
      • op 필드에서 연산 종류 표시하고 funct 필드에서 그 중의 한 연산을 구체적으로 저장한다.
  • Example
    add $t0, $s1, $s2

    oprsrtrdshamtfunct
    special$s1$s2$t00add
    017188032
    00000010001100100100000000100000

    => 0000 0010 0011 0010 0100 0000 0010 0000 (2)
    => 0 2 3 2 4 0 2 0 (16)


MIPS I-format Instructions (I : Immediate)

oprsrtconstant or address
6 bits5 bits5 bits16 bits
  • I-type은 수치 연산데이터 전송 명령어에서 사용된다.

  • Immediate arithmetic and load/store instructions

    • rt : destination or source register number
    • Constant : -215 to +215-1
    • Address : offset added to base address in rs
  • R-type과 I-type의 처음 세 필드는 이름과 크기가 같고, I 타입의 네 번째 필드 길이는 R 타입의 나머지 세 필드 길이를 더한 것과 같게 하였다.
  • 명령어 형식은 첫 번째 필드의 값을 보고 구분한다. 형식별로 op 필드가 가질 수 있는 값들이 다르기 때문에, op 필드를 보고 R-type으로 할 지 I-type으로 할 지 결정한다.

Design Principle 4 : Good design demands good compromises

  • In I-type,
    1. lw, sw (memory)
      • lw $1, 100($2)
      • lw $1, $2, 100
    2. addi (ALU)
      • addi $1, $2, 4
    3. BEQ (branch)
      • BEQ $11, $2, target

Assembly -> Machine example

  • C code
    base address of A in $t1, h in $s2
	A[300] = h + A[300];
  • Compiled
	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]
  • Machine code
    // 1200은 세 칸을 다 먹고 있는 것.
    oprsrtrdaddress/shamtfunct
    35981200
    01888032
    43981200
  • lw와 sw는 I-type으로 들어가는 걸 확인할 수 있다.
  • lw(op 필드값 = 35), $t1 (base register, 9), $t0(destination register, 8), offset(1200 = 300 * 4)
  • add(op 필드값 = 0, func 필드값 = 32), 3 register operand(18, 8, 8)

연습문제 풀이가 좀 필요해 보인다.


Stored Program Computers

  • 명령어는 data와 같이 2진법으로 나타내진다
  • 명령어와 data는 메모리에 저장된다
  • 프로그램은 compilers, linkers로 operate할 수 있다
  • 2진법은 compiled program들이 다른 computer에서도 호환될 수 있도록 해준다 (Standardized ISAs)

    Standardized ISAs?


논리연산 명령어 Logical Operations

OperationCJavaMIPS
Shift left<<<<sll
Shift right>>>>>srl
Bitwise AND&&and, andi
Bitwise OR||or, ori
Bitwise NOT~~nor

Shift Operation

oprsrtrdshamtfunct
6 bits5 bits5 bits5 bits5 bits6 bits
  • shamt : How many positions to shift

  • Shift left

    • shift left and fill with 0 bits
    • sll by i bits multiplies by 2i (???)
  • Shift right

    • shift right and fill with 0 bits
    • srl by i bits divides by 2i (unsigned only) (???)
  • Example
    11 -> 110 -> 1100
    3 -> 6 -> 12 (only for unsigned number)

  • Example (left shift 4)
    원래 값은 $s0에 있고, 결과를 $t2 레지스터에 저장한다.

    sll $t2, $s0, 4 #reg $t2 = reg $s0 << 4 bits
    op(sll : 0) rs(사용x : 0) rt($s0 : 16) rd($t2 : 10) shamt(4) funct(0)


AND Operation

  • Useful to mask bits in a word
  • Select some bits, clear other to 0 (???)
  • and $t0, $t1, $t2
    $t1과 $t2를 and 연산한 결과를 $t0에 저장한다.

OR Operation

  • Useful to include bits in a word
  • Set some bits to 1, leave others unchanged (???)
  • or $t0, $t1, $t2
    $t1과 $t2를 or 연산한 결과를 $t0에 저장한다.

NOT Operation

  • Useful to invert bits in a word
  • Change 0 to 1, and 1 to 0
  • MIPS has NOR 3-operand instruction
    a NOR b == NOT (a or b)

    nor $t0, $t1, $zero

    Register 0 : always read as zero

    $t1과 0와 nor 연산한 결과를 $t0에 저장한다.
    즉, $t1에 not 연산한 결과를 $t0에 저장한다.


판단을 위한 명령어 Conditional Operation

Branch to a labeled instruction if a condition is true. Otherwise, continue sequentially.

브랜치 (branch)는 컴퓨터 프로그램에있어서, 컴퓨터에 의해 실행될 때, 컴퓨터로 하여금 다른 명령 시퀀스의 실행을 시작하게 할 수있는 명령이다.

"logical vs. conditional" -> "bitwise vs. conditional"

x & y    // bitwise AND, 0101 & 0011 = 0001
x | y    // bitwise OR,  0101 | 0011 = 0111
vs.
x && y   // true if both x and y are true
x || y   // true if either x or y are true

beq rs, rt, L1
: if (rs == rt) branch to instruction labeled L1;
: rs와 rt의 값이 같으면 L1에 대핟하는 문장으로 가라
beq = brach if equal

bne rs, rt, L1
: if (rs != rt) branch to instruction labeled L1;
: rs와 rt의 값이 같지 않으면 L1으로 가라
bne = branch if not equal

j L1
: unconditional jump to instruction labeled L1;

  • beq, bne : conditional branch (조건부 분기)
  • j : unconditional branch (무조건 분기)

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 // s3!=s4 이면 Else로 넘어가
       add $s0, $s1, $s2 // s0 = s1 + s2 (skipped if i!= j)
       j	Exit // go to Exit
Else : sub $s0, $s1, $s2 // s0 = s1 - s2 (skipped if i = j)
Exit : ...

Compiling Loop Statements

  • C code :
while (save[i] == k)
	i += 1;
// i in $s3, k in $s5, base address(시작 주소) of save in $s6(???)
  • Compiled MIPS code :
Loop :	sll $t1, $s3, 2 // temp reg $t1 = i * 4
		add $t1, $t1, $s6 // $t1 = address of save[i]
        lw $t0, 0($t1) // temp reg $t0 = save[i]
        bne $t0, $s5, Exit // go to Exit if (k != save[i])
        addi $s3, $s3, 1
        j Loop // go to Loop
Exit : 	...
  • 첫 번째는 우선 save[i]를 임시 레지스터로 가져와야 한다. 인덱스 i에 4를 곱해서 base address에 더해줘야 한다.
  • 4를 곱한 것은 2비트씩 left shift한 것과 같다
  • $t1에 먼저 i에 4를 곱한 값을 저장하고, 배열의 base address를 더해주어, save[i]의 주소를 찾는다.
  • $t0에 save[i] 값을 저장한다.

기본 블록 Basic Blocks

A basic block is a sequence of instructions with no embedded branches (except at end) and no branch target(except at beginning)

  • A compiler identifies basic blocks for optimization
  • An advanced processor can accelerate execution of basic blocks

    basic block : Branch나 Return같은 제어 명령어로 끝남(다른 위치로 이동하지 않고 순서대로 실행되는 코드의 Block들을 의미)


More Conditional Operation

  • condition이 true이면 값을 1로 지정한다.
  • set less than (immediate)
  • slt rd, rs, rt
    : if (rs < rt) rd = 1; else rd = 0;
  • slti rt, rs, constant
    : if (rs < constant) rt = 1; else rt = 0;
  • Use in combination with beq, bne
    slt $t0, $s1, $s2 // if (s1 < s2)
    bne $t0, $zero, L // branch to L

Siged vs Unsigned

$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001

  • slt $t0, $s0, $s1 # signed
    : -1 < +1 => $t0 = 1
  • sltu $t0, $s0, $s1 # unsigned
    : +4,294,967,295 > + 1 => $t0 = 0
  • Signed : slt, slti
  • Unsigned : sltu, sltui

Branch Instruction Design

  • Why not blt, bge, etc?
    : Hardware for <, >=, ... is slower than =, !=
    Combining with branch involves more work per instruction, requiring a slower clock
  • beq and bne are the common case.
  • This is a good design compromise

0개의 댓글