Instructions 1

milkbottle·2023년 4월 13일
0

컴퓨터구조

목록 보기
3/7

Instructions

Introduction

  • 데이터의 단위 word = 32비트 컴퓨터 환경에서는 32bits = 4bytes를 의미
  • Instruction set: 컴퓨터에게 연산을 시키는 명령어들의 집합
  • MIPS(Microprocessor without Interlocked Pipeline Stage가 대표적

Arithmetic operations

  • Add, Subtract 등 산술연산을 의미
  • 한줄에 하나의 instruction, 3개의 operand(1개의 destination, 2개의 source)
  • 2개의 operand가 있는 것은 pseudo instruction이라고 부름

Register

  • MIPS에서는 각 레지스터가 32bit(1word)이고 개수는 32개
  • $s0 ~ $s7 saved / $t0 ~ $t9 temporary
  • $a0 ~ $a3 argument / $v0 ~ $v1 return value
  • $gp global pointer(static 영역의 시작주소) / $fp frame pointer(메모리의 시작주소)
  • $sp stack pointer(stack 영역의 시작주소) / $ra return address(함수 호출되고 다시 돌아올 주소)

Examples

f = (g + h) - (i + j); 를 MIPS로 바꾸시오.
단 f, g, h, i, j는 $s0, $s1, $s2, $s3, $s4로 대응된다.

  add $t0, $s1, $s2
  add $t1, $s3, $s4
  sub $s0, $t0, $t1    

pseudo instruction: lui, move ... 추후 설명

g = h + A[8]; 를 MIPS로 바꾸시오.
단 g, h, A의 시작주소는 $s1, $s2, $s3로 대응된다.

lw $t0, 8($s3)
add $s1, $s2, $t0 로 나타낼 수 있다(??!!)

사실은 아니다! 배열 A[8]은 A[0]에서 8칸을 움직인 공간이므로 MIPS에서 lw에 들어가는 immediate는 Byte address 기준이므로 8 * 4 = 32가 되어야한다.
즉, lw $t0, 32($s3)이 되어야 하는 것이다. Alignment Restriction이라고 부름

A[12] = h + A[8]; 를 MIPS로 바꾸시오.
단 h, A의 시작주소는 $s2, $s3로 대응된다.

  lw \$t0, 32(\$s3)
  add \$t0, \$s2, \$t0
  sw \$t0, 48(\$s3)

Signed and Unsigned Numbers

Signed Number

  • 부호 있는 숫자는 MSB가 1이면 음수, 0이면 양수를 뜻한다.
  • 1을 더하고 2의 보수를 취하면 Unsigned Number
  • -2^31 ~ 2^31 - 1

Unsigned Number

  • 부호 없는 숫자는 MSB까지 Sign bit로 쓰지않기 때문에 Signed보다 양수범위가 2배크다
  • 0~2^32 - 1

Representing Instructions

Register 매핑번호

  • $s0 ~ $s7 는 16~23 (10000~10111)
  • $t0 ~ $t7 는 8~15 (01000~01111), $t8 ~ $t9 는 24~25 (11000~11001)

R Format (6/5/5/5/5/6)

  • op: operation code (opcode)로 instruction마다 매핑되어있음
  • rs: first source register operand
  • rt: second source register operand
  • rd: destination register
  • shamt: shift amount(sll, srl에서 사용)
  • funct: function code로 opcode 처럼 instruction마다 매핑되어있음

    Example
    add $t0, $s1, $s2 를 변환하면 $t0는 8이므로 01000, $s0은 16이므로 10000이고, $s1와 $s2는 각각 17, 18이므로 10001, 10010이 된다.

I Format (6/5/5/16)

  • op: operation code (opcode)로 instruction마다 매핑되어있음
  • rs: first source register operand
  • rt: second source register operand
  • constant or address: 16비트 주소

MIPS fields

lw $t0, 32($s3)를 32bit binary로 바꾸어라.
lw는 op코드가 35, rs가 $s3, rt가 $t0, constant가 32이므로
100011(35)/10011(19)/01000(8)/100000(32)로 1000111001101000100000

Logical Operations

  • Shift 연산 (sll, srl = shift left, shift right)
  • AND, OR, NOR, XOR (각 and, or, nor, xor와 andi, ori 같은 immediate instruction 존재)

Shift left / right logical (sll, srl)

sll $t2, $s0, 4를 32bit binary로 바꾸어라.
sll은 R Format이며, opcode, function이 0이다. 그래서 양쪽 6비트는 모두 000000이다.
즉 op=0, rs=0, rt=16($s0), rd=10($t2), shamt=4, funct=0이므로
000000/00000/10000/01010/00100/000000

srl $t2, $s0, 4를 32bit binary로 바꾸어라.
srl은 R Format이며, opcode=0, function=2이다. 그래서 000000/00000/10000/01010/00100/000010

Conditional Branch 같은가 다른가

  • branch if equal(beq): 두 레지스터의 값이 같으면 라벨로 이동 beq resgister1, resgister2, L1
  • branch if not equal(bne): 두 레지스터 값이 다르면 라벨로 이동 bne register1, register2, L1

    라벨이란? Loop: 처럼 라벨명을 정의하면 해당위치에 인스트럭션을 통해 이동할 수 있다. 반복문에서 쓰고 함수를 정의했을 때 함수의 영역을 표시하기 위해 사용한다.

Example

if (i == j) f = g + h; else f = g - h;를 MIPS로 바꾸어라.
단, f, g, h, i, j는 $s0 ~ $s4

    bne $s3, $s4, Else
    add $s0, $s1, $s2
    j Exit
Else: sub $s0, $s1, $s2
Exit:

while (save[i] == k)
i += 1;
을 MIPS로 바꾸어라.
단, i, k, save의 시작주소는 $s3, $s5, $s6

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

Equality or Inequality 대소비교

  • set on less then(slt): 두 레지스터를 비교해 작으면 1을 저장
  • set on less then immediate(slti): 두 레지스터를 비교해 작으면 1을 저장
  • slt, sltu(u버전은 unsigned기 때문에 MSB=1 이면 2^31로 해석됨

slt와 branch instruction을 통해 모든 조건문을 표현할 수 있다.

  • if ($s0 < $s1) {원하는 행동} 이후 행동
	slt $t0, $s0, $s1
    beq $t0, $zero, L
    원하는 행동
L: 이후 행동
  • if ($s0 ≤ $s1) {원하는 행동} 이후 행동
	slt $t0, $s1, $s0
    bne $t0, $zero, L
    원하는 행동
L: 이후 행동
  • if ($s0 > $s1) {원하는 행동} 이후 행동
	slt $t0, $s1, $s0
    beq $t0, $zero, L
    원하는 행동
L: 이후 행동
  • if ($s0 ≥ $s1) {원하는 행동} 이후 행동
	slt $t0, $s0, $s1
    bne $t0, $zero, L
    원하는 행동
L: 이후 행동

0개의 댓글