Architecture / ISA
Beginner
MIPS32 / RISC-V RV32I
MIPS vs RISC-V 핵심 어셈블리 명령어 1:1 대응 비교 치트시트
산술(Add/Sub), 논리(And/Or/Xor), 메모리 로드/스토어(Lw/Sw), 조건 분기 및 점프(Branch/Jump) 명령어의 MIPS vs RISC-V 문법 차이와 일대일 대응 가이드.
#MIPS #RISC-V #Assembly #Cheat Sheet #Computer Architecture
핵심 개념MIPS와 RISC-V는 모두 로드-스토어(Load-Store) 기반 32개 레지스터 구조를 공유하는 친척 관계의 RISC 아키텍처입니다. 하지만 피연산자 순서, 오프셋 즉시값 표기법, 조건 분기 방식, 지연 슬롯(Delay Slot) 유무에서 결정적인 차이가 있습니다. 두 아키텍처 간 1:1 변환 치트시트입니다.
1. 산술 및 논리 연산 명령어 비교
| 동작 설명 | MIPS 문법 | RISC-V 문법 | 차이점 / 비고 |
|---|---|---|---|
| 레지스터 덧셈 | add $d, $s, $t | add rd, rs1, rs2 | 동일 (rd = rs1 + rs2) |
| 상수 덧셈 | addi $t, $s, imm | addi rd, rs1, imm | MIPS는 rt가 목적지, RISC-V는 rd |
| 레지스터 뺄셈 | sub $d, $s, $t | sub rd, rs1, rs2 | 동일 (rd = rs1 - rs2) |
| 비트 AND / OR | and $d, $s, $t / or | and rd, rs1, rs2 / or | 동일 |
| 비트 XOR | xor $d, $s, $t | xor rd, rs1, rs2 | 동일 |
| 좌측 논리 시프트 | sll $d, $t, shamt | slli rd, rs1, shamt | RISC-V는 즉시값 시프트에 'i' 접미사 사용 |
| 우측 산술 시프트 | sra $d, $t, shamt | srai rd, rs1, shamt | 부호 비트 보존 시프트 |
2. 메모리 접근(Load / Store) 비교
| 동작 설명 | MIPS 문법 | RISC-V 문법 | 차이점 / 비고 |
|---|---|---|---|
| 4바이트 워드 로드 | lw $t0, 8($s0) | lw t0, 8(s0) | 동일한 문법 (목적지, 오프셋(베이스)) |
| 4바이트 워드 스토어 | sw $t0, 8($s0) | sw t0, 8(s0) | 동일한 문법 (소스, 오프셋(베이스)) |
| 1바이트 부호 로드 | lb $t0, 0($s0) | lb t0, 0(s0) | 동일 (부호 확장) |
| 1바이트 부호없는 로드 | lbu $t0, 0($s0) | lbu t0, 0(s0) | 동일 (0 확장) |
3. 조건 분기 및 점프 비교 (가장 큰 차이)
| 동작 설명 | MIPS 문법 (Delay Slot 있음) | RISC-V 문법 (Delay Slot 없음) | 주요 차이점 |
|---|---|---|---|
| 값이 같으면 분기 | beq $t0, $t1, label | beq t0, t1, label | RISC-V는 다음 행을 무조건 실행하지 않음 |
| 값이 다르면 분기 | bne $t0, $t1, label | bne t0, t1, label | 동일 |
| 미만 비교 분기 (<) | slt $at, $t0, $t1 bne $at, $0, label | blt t0, t1, label | RISC-V는 1개 명령어로 직접 대소 분기 가능 |
| 이상 비교 분기 (>=) | slt $at, $t0, $t1 beq $at, $0, label | bge t0, t1, label | MIPS는 slt 플래그 검사 필요, RISC-V는 직접 분기 |
| 함수 호출 (점프 & 링크) | jal target | jal ra, target | MIPS는 암시적으로 $ra, RISC-V는 명시적 링크 레지스터 |
| 함수 복귀 (레지스터 점프) | jr $ra | ret (jalr zero, ra, 0) | RISC-V는 ret 의사 명령어로 제공 |
4. 실전 반복문 어셈블리 1:1 비교
# C 코드: while (i < n) { sum += i; i++; }
# --- [MIPS 어셈블리] ---
loop_mips:
slt $t2, $t0, $t1 # $t2 = (i < n)
beq $t2, $zero, exit_mips
nop # <- 분기 지연 슬롯 (Branch Delay Slot)
add $s0, $s0, $t0 # sum += i
addi $t0, $t0, 1 # i++
j loop_mips
nop # <- 점프 지연 슬롯
exit_mips:
# --- [RISC-V 어셈블리] ---
loop_riscv:
bge t0, t1, exit_riscv # i >= n 이면 탈출 (지연 슬롯 없음! 직관적)
add s0, s0, t0 # sum += i
addi t0, t0, 1 # i++
j loop_riscv # jal zero, loop_riscv
exit_riscv: