교재처럼 순서대로 읽는 본문
이 글은 요약 카드가 아닙니다. 처음 보는 용어의 뜻부터 시작해, 왜 그런 규칙이 생겼는지와 문제에서 어떻게 사용하는지를 한 흐름으로 설명합니다.
이 장을 공부하는 이유
32개의 0과 1을 통째로 읽지 않습니다. 오른쪽 7 bit인 opcode가 먼저 ‘어떤 모양의 상자’를 쓸지 정하고, 그 뒤에 정해진 위치에서 register와 immediate를 꺼냅니다.
읽고 나면 할 수 있어야 하는 것
- opcode로 instruction format을 선택한다.
- register ABI 이름과 x번호를 왕복한다.
- 흩어진 B/J/S immediate를 재조립하고 sign-extension한다.
먼저 비유로 머릿속 구조 만들기
택배 송장의 바코드를 읽는 것과 같습니다. 맨 먼저 상품 종류(opcode)를 읽어 송장 양식을 고르고, 그 양식에 적힌 위치에서 보내는 사람(rs1), 추가 물건(rs2), 받는 사람(rd), 거리(immediate)를 읽습니다.
그림은 왼쪽에서 오른쪽으로 읽습니다. 각 화살표는 앞 단계의 결과가 다음 단계의 입력이 된다는 뜻입니다. 흐름도만 크게 열기
용어를 평범한 문장으로 바꾸기
독일어와 영어 용어를 소리만 외우지 말고, 아래 설명을 자신의 말로 다시 말해 보세요.
- opcode [6:0]
- instruction 가족과 format을 결정하는 하위 7 bit
- funct3 / funct7
- 같은 opcode 가족 안에서 실제 연산을 구분하는 추가 표지
- rd / rs1 / rs2
- destination / source register field
- sign-extension
- signed 값을 유지하면서 상위 bit를 sign bit로 채우는 것
- Pseudoinstruktion
- assembler가 실제 base instruction으로 바꾸는 편리한 별칭
개념을 처음부터 연결하기
1. Hex를 binary로 바꾸기
Hex 한 자리는 정확히 4 bit입니다. 예를 들어 0x13 = 0001 0011입니다. 32-bit word는 8개의 hex 자리로 왼쪽 0까지 채워야 field 위치가 밀리지 않습니다.
2. Register 역할 구분
`sw a4,8(t0)`에서 t0는 주소 base라 rs1, a4는 저장할 data라 rs2입니다. 표기에 먼저 나온 register가 항상 rs1이라는 규칙은 없습니다.
3. Immediate 재배열
B/J/S format은 hardware 배선과 정렬을 위해 immediate bit가 흩어져 있습니다. 그림의 위치에서 조각을 모으고, branch/jump의 암묵적 bit 0=0을 붙인 다음 sign-extension합니다.
이 챕터에서 계속 사용할 손풀이 표
아래 표는 정답표가 아니라 작업 기억을 외부에 꺼내 놓는 worksheet입니다. 소문제를 풀 때마다 빈 칸을 직접 채우세요.
| 확인 순서 | Field | 기록할 값 |
|---|---|---|
| 1 | opcode [6:0] | 7-bit 값과 format |
| 2 | rd / rs1 / rs2 | ABI 이름·x번호·5-bit |
| 3 | funct3 / funct7 | 연산을 구분하는 값 |
| 4 | immediate | 조각·sign-extension·10진 값 |
| 5 | 검산 | 다시 decode한 assembly |
수식은 위아래 구조로 읽기
평문으로 제곱과 분수를 이어 쓰면 구조를 놓치기 쉽습니다. 아래 수식은 브라우저의 MathML로 렌더되며, 지수·아래첨자·분수를 실제 수학 표기처럼 보여 줍니다.
32-bit instruction field 합계
R-type의 opcode, rd, funct3, rs1, rs2, funct7 폭을 모두 더하면 32 bit입니다.
두 자리 Hex가 표현하는 bit 수
Hex 한 자리는 정확히 4 bit이므로 8자리 Hex가 32-bit instruction 하나입니다.
작은 숫자로 한 번 직접 해보기
`nop = addi x0,x0,0`입니다. imm=0, rs1=0, funct3=000, rd=0, opcode=0010011을 I-type 칸에 넣으면 `000000000000 00000 000 00000 0010011` = `0x00000013`이 됩니다.
이 예제에서 중요한 것은 숫자 자체가 아니라, 어떤 값을 먼저 구하고 그 결과를 다음 계산에 넣는지입니다. 종이에 중간값을 생략하지 않고 적어 보세요.
초보자가 자주 멈추는 지점
bit 31부터 바로 읽기 시작해도 되나요?
전체 표기는 왼쪽이 bit 31이지만 format을 모르면 field 경계를 정할 수 없습니다. 먼저 오른쪽 opcode [6:0]를 읽어 format을 고르세요.
negative immediate가 큰 hex 값처럼 보여요.
해당 immediate bit 폭에서 최상위 bit가 1이면 signed로 sign-extension합니다. 32-bit 전체를 unsigned로 읽으면 branch 방향이 반대가 됩니다.
register 이름만 맞으면 충분한가요?
아닙니다. 같은 register라도 rd·rs1·rs2 중 어느 field인지가 다릅니다. 특히 store는 저장할 data가 rs2이고 주소 base가 rs1입니다.
시험지에서 손으로 쓰는 순서
- pseudo instruction이면 base instruction으로 먼저 펼칩니다.
- 오른쪽 7 bit opcode를 읽고 format 표를 고릅니다.
- rd/rs1/rs2를 5-bit 숫자로 확인합니다.
- funct field와 immediate를 복원합니다.
- assembly를 다시 만들어 원래 후보와 완전히 같은지 역검산합니다.
이 순서를 외우는 목적은 답을 암기하는 것이 아닙니다. 중간 과정을 답안지에 남겨 부분점수를 얻고, 어디에서 잘못됐는지 스스로 찾기 위한 체크포인트입니다.
10개 소문제로 개념 적용하기
각 소문제에는 이 장의 설명을 다시 포함한 독립 수업 페이지가 있습니다. 따라서 링크로 바로 들어가도 선행지식 없이 읽을 수 있습니다.
- 2-0매칭 전체 풀이 루틴독립 수업 열기 →
9개 instruction과 8개 encoding을 짝지으세요. · 5 micro-work
- 2-1`nop` ↔ `0x00000013`독립 수업 열기 →
`nop`의 실제 encoding을 찾으세요. · 3 micro-work
- 2-2`ret` ↔ `0x00008067`독립 수업 열기 →
`ret`의 실제 encoding을 찾으세요. · 3 micro-work
- 2-3`beq s0,s1,12` 매칭독립 수업 열기 →
주어진 branch bit열 중 +12 offset을 찾으세요. · 4 micro-work
- 2-4`sw a4,8(t0)` 매칭독립 수업 열기 →
store word의 source와 base를 구분하세요. · 4 micro-work
- 2-5`add t0,a6,t2` 매칭독립 수업 열기 →
R-type add의 세 register를 확인하세요. · 3 micro-work
- 2-6`jal ra,32` 매칭독립 수업 열기 →
J-type jump offset과 rd를 확인하세요. · 3 micro-work
- 2-7`bne t0,t1,-16` 매칭독립 수업 열기 →
negative branch offset을 복원하세요. · 4 micro-work
- 2-8`sll a2,a4,a5` 매칭독립 수업 열기 →
shift amount가 register에서 오는 R-type을 찾으세요. · 3 micro-work
- 2-9남는 `addi t0,a6,2`독립 수업 열기 →
모든 쌍을 지운 뒤 unmatched instruction을 찾으세요. · 3 micro-work
출처
Source: Probeklausur.pdf / Probeklausur Musterlösung und Hinweise.pdf · 시험 p6 · 공식 해설 p7. 공식 답의 숫자와 course-specific datapath/FSM 가정은 변경하지 않았습니다.