shamt: 이동할 위치 수
rs가 쓰이지 않고, rt에 소스 표현
4자리를 left 이동하면, 를 곱한 것과 같다.
function=0이면 left, 2이면 right
일부 비트들을 감추는 mask하는 데 유용
word에 비트를 포함하는 데 유용
not이 없어서 nor로 묘사한다.
nor $t0, $t1, $zero
⋅ 조건이 참인 경우 지정된 명령어로 분기
beq rs, rt, L1 #rs==rt이면 L1로 (I-Format)
bne rs, rt, L1 #rs!=rt이면 L1로 (I-Format)
j L1 #L1로 무조건 점프 (J-Format)
if 조건에서 같지 않으면 else로 점프할 때, 어셈블러가 주소를 계산한다.

분기(branch) 명령을 포함하지 않는다. (맨 끝에는 있을 수 있다)
분기 목적이나 분기 레이블도 없는 (맨 앞에 있는 것은 허용된다) 시퀀스이다.
⋅ 컴파일러는 최적화를 위한 기본블록을 식별한다.
⋅ 고급 프로세서는 기본블록 실행을 가속화할 수 있다.
(최적화의 대상)
⋅ 조건이 참인 경우 결과를 1로 설정 (아닌 경우 0)
slt rd, rs, rt #rs<rt인 경우 rd=1
slti rt, rs, 상수 #rs<상수인 경우 rt=1

->blt로 안쓰고 결합해서 사용하는 이유는 클럭 속도가 느려지거나 별도의 클럭 사이클이 더 필요하게 되기 때문에 빠른 명령어 2개를 사용하는 것이 더 유리하다.
⋅ $a0 ~ $a3: 인수 레지스터(4 - 7)
⋅ $v0, $v1: 결과값 레지스터(2, 3)
⋅ $gp: global pointer for 정적 데이터(28)
⋅ $sp: 스택 포인터(29)
⋅ $fp: frame pointer(30) 스택 시작 주소
⋅ $ra: return address(31) 돌아가야 할 주소
⋅ jal ProcedureAddress #점프하면서 다음 명령어의 주소를 $ra 레지스터에 저장 (jump and link)
⋅ jr $ra #$ra에 저장된 주소로 점프 (PC+4)


호출자는 스택에 return 주소 ($ra)를 다른 함수 호출 전 꼭 저장해야 한다. - 호출 후 스택에서 복원
$sp가 가변적이므로 스택의 시작점인 $fp를 사용
사용하는 스택을 frame이라고 함.
$sp로 상대적인 위치로 표현하면 나중에 해석하기가 힘듦. 코드 디버깅하는 사람들이 볼 때도 어려움. 헷갈림. 이런 문제를 없애기 위해 사용.
$gp의 역할>전역변수 접근 주소.
I-Type의 주소는 16bits
16bits으로 표현할 수 있는 주소가 적음
⋅ 16bit만으로는 전역변수 영역을 포인팅하기 어려워서 gp레지스터를 사용.
⋅ 전역변수에 대한 접근 단순화.
⋅ 상대주소로 표현하기 위해서.
⋅ gp는 전역변수 영역의 중간을 가리킴.
⋅ 바이트 인코딩된 char 집합
⋅ 유니코드: 32비트 char 집합
⋅ lb rt, offset(rs) lh rt, offset(rs) #short
⋅ lbu rt, offset(rs) lhu rt, offset(rs) #char
⋅ sb rt, offset(rs) sh rt, offset(rs) #byte/halfword
#lbu -> char, unsigned short
c언어는 문자열을 표시할 때 끝에 값이 0인 바이트 하나를 둠.
(“Cal” = 67, 97, 108, 0) ASKII의 null ‘\0’
대부분의 상수는 작음. (16비트면 충분)
가끔 32비트 상수.
lui rt, constant #상수값을 레지스터 상위 16bits에.
ori #나머지 채워넣음

⋅ 조건부 분기
다음 명령어 주소 PC+4
I-Format
대상 주소 = PC+4+offset4 #대상 주소로 점프
⋅ jump(j and jal) :26bits 주소가 실제로는 28bits 표현하는 것처럼 보임(4의 배수)

명령어 2개로.
jump는 J-Format이므로 주소가 더 넓음.