leehyeon-dv 님의 블로그
2.7 Instructions for Making Desicions 본문
2.7 Instructions for Making Desicions
leehyeon-dv 2024. 11. 16. 16:08🔑Table of Contents
- Conditional Operations - 조건
- Compiling If Statements - if문 컴파일
- Compiling Loop Statements - 반복 구문 컴파일
- Basic Blocks
- More Conditional Operations - 더 조건적인 것
- Branch Instruction Design - 분기 명령 설계
- Signed vs Unsigned - 부호 있는 vs 부호 없는
📌Conditional Operations
만약 조건이 true면, label된 instruction으로 향하게 하는 branch(아닐경우->false, contunue sequentially)
beq rs,rt, L1
만약 rs == rt 면, L1인 instruction으로 이동
bne rs,rt, L1
만약 rs != rt 면, L1인 instruction으로 이동
J L1
무조건 L1이라고 표시된 instruction으로 이동
📌Compiling If Statements
*C code:
if (i == j) f = g + h;
else f = g - h;
ㆍf는 $s0에, g는 $s1에, h는 $s2에, i는 $s3에, j는 $s4에.
*컴파일된 MIPS code:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit: ... ← 어셈블러가 계산한 주소
📋Quiz!
C코드를 컴파일된 MIPS코드로 바꿔라 (필요시 임시레지스터 최소한으로 사용가능)
if (i != j) f = a[10]-g;
else f = k+g;
//i,j,f,g,k -> $s0, $s1, $s2, $s3, $s4
//a의 기본주소 -> $s5
beg $s0, $s1, Else
lw $t0, 40($s5)
sub $s2, $t0, $s3
j Exit
Else : add $s2, $s4, $s3
Exit: ...
📌Compiling Loop Statements
*C code:
while (save[i] == k) i += 1;
ㆍi는 $s3에, k는 $s5에, 배열 save의 시작 주소는 $s6에.
*컴파일된 MIPS code:
Loop: sll $t1, $s3, 2 (처음 주어질 i index만큼의 주소(4byte)를 위해 2^2=4를 곱해둠)
add $t1, $t1, $s6 (offset(위에서 구해둔 i*4)에 시작 주소 더하면 save[i]의 주소)
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit: ...
📋Quiz!
C코드를 컴파일된 MIPS코드로 바꿔라 (필요시 임시레지스터 최소한으로 사용가능)
while (test[i] != f)
i -= 1
//i,f -> $s2, $s3
//test의 기본주소 -> $s1, label은 Loop, Exit사용
Loop: sll $t0, $s2, 2 (i*4)
add $t0, $t0, $s1 (기본주소 + i)
lw $t1, 0($t0) (해당위치값 적재)
beq $t1, $s3, Exit (같으면 분기)
addi $s2, $s2, -1
j Loop
Exit: ...
📌Basic Blocks
basic block = instruction들의 순서대로 모인 집합
- embedded branch(일체형분기)는 없다(단, 끝부분에는 있을수있음)
- branch target(분기 대상, labeled)은 없다 (첫부분엔 있을수있음)
- 중간에는 branch도없고, labeled된(점프할 곳으로 지정된) 곳도 없다, 분기가 없는 작업덩어리
- 컴파일러는 최적화를 위해 이런 basic block들을 찾아낸다
- 진보된(고성능) 프로세서는 basic block들의 수행을 가속시킬 수 있다
📌More Conditional Operations
조건이 true -> 결과 1로 설정(아니면, 0)
slt rd, rs,rt
만약 rs < rt 면, rd =1 ( else rt =0)
slti rt, ts, constant
만약 rs < constant, rt =1( else rt =0)
*beq와 bne의 혼합으로 사용됨
slt $t0, #s1, $s2 # if ($s1 < $s2)
bne $t0, $zero, L # 0이 아니면(=1) L로 이동
📌Branch Instruction Design
blt(branch less than), bge(branch greater or equal)가 없는 이유
= 하드웨어 입장에서는 <같은 연산이 =보다 느리기에 좋은 설계를 위한 타협이다
- 모든 분기를 지원하면 한 instruction마다 기존보다 더 많은 일을 수행해 클럭속도가 느려진다
- 모든 instruction 전체가 불이익을 받음(느려진 클럭속도로)
📌Signed vs Unsigned
부호 있는 비교 : slt, slti
부호 없는 비교 : sltu, sltiu (절댓값비교)
📝 예제
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001
slt $t0, $s0, $s1 #-1 < 1 →$t0 = 1( else $t0 =0)
sltu $t0, $s0, $s1 #4,294,967,295 < 1 → $t0 = 1( else $t0 =0)
'컴퓨터구조 및 설계 > 2장. language of the computer' 카테고리의 다른 글
2.10 MIPS Addressing for 32-Bit Immediates and Addresses (0) | 2024.11.17 |
---|---|
2.9 Communicating with People (0) | 2024.11.16 |
2.8 Supporting Procedures in Computer Hardware (0) | 2024.11.16 |