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)
- 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이 된다.
- 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: 이후 행동