<aside> 💡 목차
</aside>


sub는 add와 다를 바 없다. rs 와 2의 보수화된 rt 를 더한것이 빼기니까
<aside> 💡 MIPS 산술/논리 연산은 3개의 피연산자를 사용합니다. RISC-V의 설계 목표인 단순성과 효율성을 달성하기 위해서 3개만 사용합니다
1️⃣ 결과 레지스터 : 연산의 결과가 저장되는 레지스터 2️⃣ 피연산자 1 : 첫 번째 피연산자 3️⃣ 피연산자 2 : 두 번째 피연산자 ****또는 immediate value (상수 값)
add $t0, $s0, 10 # $t0 : 결과 레지스터 # $s0 : 피연산자 1 (레지스터값) # 10 : 피연산자 2 (상수값)
</aside>
<aside> 💡 (2️⃣내용 보충)
피연산자는 레지스터 또는 16비트 immediate 값을 사용할 수 있습니다.
instruction에서 addu , subu 와 같이 'u'가 붙으면 unsigned라는 뜻으로 오버플로우를 무시한다
레지스터: $0 ~ $31까지의 32개 레지스터 중 하나 16비트 immediate 값: 0 ~ 65535 사이의 16비트 정수
add $t0, $s0, 10
# $t0 : 레지스터
# $s0 : 레지스터
# 10 : 16비트 정수
<aside> 💡 아니 immediate value (상수 값) 을 왜 씀?
두 번째 피연산자에 상수값을 더하는 이유는 다음과 같습니다.
효율성: 하드웨어의 복잡성을 줄일 수 있습니다.
단순성: 명령어의 길이를 줄일 수 있습니다.
add $t0, $s0, $s1
#첫 번째 명령은 두 개의 레지스터를 피연산자로 사용하기 때문에
#명령어가 4바이트입니다.
add $t0, $s0, 10
#두 번째 명령은 두 번째 피연산자에 상수값을 사용하기 때문에
#명령어가 3바이트입니다.
</aside>
</aside>
<aside> 3️⃣ 비교 연산도 산술 논리 연산에 포함됩니다.
== , > , < 과 같은 비교 연산을 말함
다음 명령은 $s0 레지스터의 값이 10보다 작은지 확인합니다.
slt $t0, $s0, 10
#연산의 결과는 true 또는 false
#만약 true면, $t0 레지스터는 1이 저장
</aside>
<aside> 💡 한 레지스터만 사용하면 오버플로우 문제가 있기 때문입니다
</aside>
명시적으로 접근해야 합니다.
즉, HI와 LO 레지스터의 값을 읽거나 쓰기 위해 명령어를 사용해야 합니다.
<aside> 💡 어디에 저장됨?
질문!!! 10 / 3 하면 몫이 3 나머지가 1인데, HI에 3이 저장되고, LO에 1이 저장되는것이 맞습니까?
아니다!!!!→ 몫이 LO
→ 나머지 HI
</aside>
<aside>
💡 복잡해보이지만, 사실은 add , add imediate 가 가장 중요하고
나머지들은 이 둘의 파생버전이다
| 명령어 | 예시 | 뜻 | 멘트 | 표현가능범위 |
|---|---|---|---|---|
add |
add $1, $2, $3 | $2+$3 결과를 | ||
| $1에 넣어라 | 3 operands; exception possible | |||
| 각 피연산자중 하나라도32비트가 넘어가면 | ||||
| MSB값이 변경되어 오버플로우 발생 가능 | $2^8$ - 1 = 255 까지 | |||
add immediate |
addi $1 ,$2, 100 | $2 + 100 결과를 | ||
| $1에 넣어라 | + constant; exception possible | |||
| 두번째 피연산자인 정수가 32비트가 넘어가면 | ||||
| 오버플로우 발생 가능 | $2^8$ - 1 = 255 까지 | |||
add unsigned |
addu $1, $2, $3 | $2+$3 결과를 | ||
| $1에 넣어라 | 3 operands; no exceptions | |||
| 각 피연산자들이 32비트가 넘어가도 | ||||
| 오버플로우가 바뀌지 않는다. | $2^8$ = 256 까지 |
| 명령어 | 예시 | 뜻 |
|---|---|---|
multiply |
HI, LO ← $2 $\times$$3 | 결과의 몫은 LO |
| 나머지는 HI에 | ||
| 넣어라 | ||
divide |
HI, LO ← $2 / $3 | 결과의 몫은 LO |
| 나머지는 HI에 | ||
| 넣어라 | ||
Move from HI |
||
Move from LO |
$1 ← HI or LO | HI 나 LO 값을 |
| $1에 넣어라 |
<aside> 💡 근데 인스트럭션 하나에 4byte인데 이는 곧 32bit.
add에서 기본 21bit쓰고 나면 11비트가 남네?
→ 남은 비트를 shamt , funct 로 사용
</aside>