SoSe25 Exam Overview

Aufgabe 2 · 8 points · encoding

Aufgabe 2 - Assembler und Maschinencode

Original German, Korean translation, method, source-grounded solution, recall-answer audit, wrong-answer explanations, active recall, and source citations are separated below.

complete

Related Concepts and Current Sources

Weak-topic hook

No active weak-topic rows currently map to this Aufgabe.

Subproblem learning view

소문제별 1타 강사식 풀이 교실

문제를 읽은 직후 필요한 개념을 직관적으로 잡고, 같은 순서로 손풀이를 재현하도록 구성했습니다.

Teilaufgabe

2a

6 points

Original German

Ordne die folgenden Assembler Instruktionen den richtigen Binärdarstellungen zu:

Nr.AssemblerNr.Binärdarstellung
1ori s0, zero, 6A00000000 00010100 10000100 10010011
2addi x9, x9, 1B11111111 10011111 11110100 01101111
3jal s0, loopC00000000 01100100 10000100 00010011
4li x9, 4097D00000000 00000000 00010100 10110111
--E00000000 01100000 01100100 00010011

Recall-Lösung im Gedächtnisprotokoll: 1 -> E, 2 -> A, 3 -> B, 4 -> A UND D.

한국어 문제

다음 RISC-V Assembler Instruktionen을 올바른 32-bit Binärdarstellung과 매칭하라. ori, addi, jal, 그리고 li x9,4097이 섞여 있다. 중요한 점은 li가 RISC-V Basisinstruktion이 아니라 Pseudoinstruction이므로, 값의 크기에 따라 하나 또는 두 개의 실제 Instruktionen으로 확장될 수 있다는 것이다.

한 줄 핵심

opcode로 instruction format을 정한 뒤 rd, rs1, funct3, immediate를 읽는다. li는 실제 instruction이 아닌 pseudoinstruction이다.

0. 초보자 개념 다리

32-bit instruction에서 opcode가 상자 종류를 알려 주고 그 종류에 따라 나머지 칸의 뜻이 정해진다.

1. 이 문제의 풀이 루틴

  1. 하위 7-bit opcode로 format을 정한다.
  2. rd·funct3·rs1·rs2·funct7/immediate를 자른다.
  3. register 이름과 번호, immediate bit 배치를 맞춘다.
  4. field를 다시 이어 원래 word와 같은지 검산한다.

2. 왜 이 방법이 맞을까?

같은 bit 위치도 format에 따라 의미가 다르므로 opcode를 먼저 읽어야 한다.

3. 시험장 실수 방지

li는 pseudoinstruction이며 값에 따라 여러 실제 instruction으로 확장될 수 있다.

최대 상세 해설 · 2a 완전 초보 강의: Assembly와 32-bit binary를 하나씩 연결하기

이 강의의 도착점

binary와 RISC-V를 처음 보는 학습자도 bit를 읽는 방향, instruction field, register 번호, I/U/J format, li pseudoinstruction을 이해하고 A~E를 직접 분해하여 모든 매칭을 재현한다.

0. 정말 아무것도 모른다면 여기서 시작

  • 이 문제는 암호 맞추기처럼 보이지만 실제로는 32칸짜리 신청서를 읽는 문제다. 각 칸에는 0 또는 1만 들어가고, 몇 번째 칸인지에 따라 뜻이 정해진다. 먼저 낯선 기호를 계산하려 하지 말고 ‘어느 칸이 무슨 역할인가’를 찾으면 된다.
  • bit는 0 또는 1 한 칸이다. RISC-V의 여기 instruction은 정확히 32 bit다. 문제에서는 읽기 쉽게 8 bit마다 띄어 썼지만, 띄어쓰기 네 묶음이 서로 다른 field라는 뜻은 아니다. field 경계는 8 bit 경계와 다를 수 있다.
  • binary를 종이에 적을 때 왼쪽은 bit 31, 오른쪽은 bit 0이다. 가장 먼저 읽을 opcode는 오른쪽 끝 bits 6:0이다. 책을 왼쪽부터 읽는 습관 때문에 왼쪽 7 bit를 opcode로 착각하면 이후 모든 답이 무너진다.
  • opcode는 택배 상자의 종류표다. opcode를 보면 이 32 bit를 I-Typ, U-Typ, J-Typ 중 어떤 양식으로 잘라야 하는지 알 수 있다. 양식을 먼저 정하지 않고 임의로 자르면 같은 bit 위치를 잘못 해석한다.
  • register는 CPU 안의 작은 숫자 보관함이다. RISC-V에는 x0, x1처럼 번호가 있고 사람이 읽기 쉬운 별명도 있다. 이 문제에 필요한 것은 x0=zero, x8=s0/fp, x9=s1 세 개다.
  • oriaddi는 I-Typ이다. 둘 다 opcode가 0010011이라 opcode만으로는 구분할 수 없다. 그 안의 작은 구분표인 funct3ori=110, addi=000을 알려 준다.
  • jal은 jump instruction이라 J-Typ을 쓴다. jump 거리는 binary 안에서 순서가 섞여 저장되므로 조각을 제자리에 다시 놓아야 한다. lui는 U-Typ이며 상위 20 bit를 register의 위쪽에 놓고 아래 12 bit를 0으로 만든다.
  • li는 CPU가 직접 실행하는 진짜 instruction 이름이 아니라 Assembler가 편의를 위해 제공하는 Pseudoinstruction이다. 작은 상수는 instruction 하나로, 큰 상수는 luiaddi 두 개로 바뀔 수 있다. 따라서 2a는 단순한 일대일 연결 문제가 아니다.

1. 문제에 나오는 말부터 하나씩

bit
0 또는 1 하나. 32-bit instruction은 이런 칸 32개로 이루어진다.
binary / Binärdarstellung
값이나 instruction을 0과 1로 표현한 것. 이 문제의 A~E가 각각 하나의 32-bit machine instruction이다.
Assembly / Assemblercode
사람이 읽을 수 있게 addi x9,x9,1처럼 적은 instruction 표현.
machine code
CPU가 실제로 해석하는 32개의 0/1. Assembly와 같은 동작을 다른 모습으로 쓴 것이다.
MSB / LSB
MSB는 가장 높은 bit인 왼쪽 bit 31, LSB는 가장 낮은 bit인 오른쪽 bit 0이다.
opcode
오른쪽 끝 7 bit인 bits 6:0. instruction의 큰 종류와 format을 결정한다.
instruction format
32 bit를 어떤 field들로 나누는지 정한 양식. 이 문제에는 I-, U-, J-Typ이 나온다.
rd
destination register. 결과가 들어갈 보관함이며 보통 bits 11:7에 있다.
rs1
첫 번째 source register. 계산에 사용할 기존 값을 읽는 보관함이며 I-Typ에서는 bits 19:15다.
funct3
같은 opcode 안에서 세부 연산을 구분하는 3 bit. OP-IMM에서 000=addi, 110=ori다.
immediate / imm
instruction 자체 안에 직접 들어 있는 작은 상수. addi ...,1의 1과 ori ...,6의 6이 예다.
sign extension
작은 signed immediate를 32 bit로 늘릴 때 맨 앞 sign bit를 반복하는 규칙. 앞 bit가 1이면 음수로 늘어난다.
I-Typ
imm[11:0] | rs1 | funct3 | rd | opcode 순서의 format. 오른쪽부터 opcode, rd, funct3, rs1, imm다.
U-Typ
imm[31:12] | rd | opcode format. lui가 상위 20 bit를 register에 넣을 때 사용한다.
J-Typ
jal용 format. jump immediate 조각이 20 | 10:1 | 11 | 19:12 순서로 흩어져 있다.
Pseudoinstruction
사람이 편하게 쓰는 가짜 한 줄 명령. Assembler가 실제 Basisinstruktion 하나 이상으로 바꾼다.
li
load immediate pseudoinstruction. register에 상수를 만드는 목적이며 상수 크기에 따라 실제 instruction 수가 달라진다.

2. 선생님과 같이 한 칸씩 푸는 과정

  1. 먼저 답을 추측하지 말고 고정 규칙을 종이에 쓴다. 오른쪽 끝은 bit 0이고 opcode=bits 6:0, rd=bits 11:7이다.
  2. I-Typ 틀을 쓴다: imm[31:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0].
  3. U-Typ 틀을 쓴다: upper immediate[31:12] | rd[11:7] | opcode[6:0].
  4. J-Typ 틀을 쓴다: 저장된 순서는 imm[20] | imm[10:1] | imm[11] | imm[19:12] | rd | opcode이고, 실제 offset의 bit 0은 항상 0이다.
  5. 후보 A 00000000 00010100 10000100 10010011의 오른쪽 7 bit는 0010011이다. 따라서 I-Typ OP-IMM이다.
  6. A의 rd=01001=x9, funct3=000=addi, rs1=01001=x9, imm=000000000001=1이다.
  7. 그러므로 A는 addi x9,x9,1이고 Assembly 후보 2와 연결된다.
  8. 후보 B 11111111 10011111 11110100 01101111의 오른쪽 7 bit는 1101111이다. 따라서 J-Typ jal이다.
  9. B의 rd=01000=x8=s0이다. 흩어진 immediate를 imm[20], imm[19:12], imm[11], imm[10:1], 0의 실제 순서로 다시 놓고 sign-extend하면 -8이 된다.
  10. 그러므로 B는 jal s0,-8이다. 문제의 label loop가 현재 PC보다 8 byte 앞이라면 후보 3 jal s0,loop와 일치한다.
  11. 후보 C 00000000 01100100 10000100 00010011의 opcode는 0010011이므로 I-Typ이다.
  12. C의 rd=01000=x8=s0, funct3=000=addi, rs1=01001=x9=s1, imm=000000000110=6이다.
  13. 그러므로 C는 addi s0,s1,6이다. 2a의 네 Assembly 후보에는 없으므로 지금은 ‘남는 후보’라고 표시하고 2b를 위해 보관한다.
  14. 후보 D 00000000 00000000 00010100 10110111의 opcode는 0110111이다. 이는 U-Typ lui다.
  15. D의 rd=01001=x9, upper immediate는 0x1이다. lui는 이를 12 bit 왼쪽으로 놓으므로 실행 뒤 x9는 0x1 << 12 = 0x1000 = 4096이 된다.
  16. D 하나만으로는 목표 4097보다 1 작다. 따라서 D는 후보 4 li x9,4097의 첫 번째 instruction일 가능성이 크다.
  17. 후보 E 00000000 01100000 01100100 00010011의 opcode는 0010011이므로 I-Typ이다.
  18. E의 rd=01000=x8=s0, funct3=110=ori, rs1=00000=x0=zero, imm=6이다.
  19. zero OR 6 = 0 OR 6 = 6이므로 E는 정확히 ori s0,zero,6이고 후보 1과 연결된다.
  20. 이제 후보 4 li x9,4097을 따로 처리한다. signed 12-bit immediate 범위는 -2048부터 2047까지라서 4097은 addi x9,zero,4097 한 줄에 들어가지 않는다.
  21. 4097을 hexadecimal로 쓰면 0x1001 = 0x1000 + 1이다. 먼저 D의 lui x9,0x1이 x9를 4096으로 만든다.
  22. 그다음 A의 addi x9,x9,1이 1을 더해 4097을 만든다. 따라서 후보 4는 D 다음 A 두 binary와 연결된다.
  23. 최종 검산으로 모든 연결을 적는다: 1→E, 2→A, 3→B, 4→D then A. C만 배정되지 않아 2b로 넘어간다.

3. 그래서 정답은 무엇인가?

2a의 최종 매칭은 1 ori s0,zero,6 → E, 2 addi x9,x9,1 → A, 3 jal s0,loop → B(binary가 증명하는 offset은 -8), 4 li x9,4097 → D 다음 A이다. 남는 binary는 C다.

4. 이제 정확한 개념으로 한 단계 더 깊게

  • Assembly와 machine code는 서로 다른 instruction이 아니라 같은 instruction의 사람이 읽는 표현과 CPU가 읽는 표현이다.
  • 32-bit word를 왼쪽부터 적어도 bit 번호는 오른쪽이 0이다. RISC-V opcode는 항상 bits 6:0이므로 오른쪽 끝 7 bit를 먼저 읽는다.
  • I-Typ의 고정 field는 imm[31:20], rs1[19:15], funct3[14:12], rd[11:7], opcode[6:0]이다.
  • OP-IMM opcode 0010011은 연산 하나만 뜻하지 않는다. funct3=000이면 addi, funct3=110이면 ori다.
  • Register alias는 번호의 별명이다. x8s0는 같은 물리적 architectural register이고 x9s1도 같다.
  • U-Typ lui의 immediate 20 bit는 결과의 bits 31:12에 놓인다. 그래서 lui x9,0x1의 결과는 1이 아니라 0x00001000이다.
  • J-Typ은 branch 거리를 2-byte 단위로 표현하므로 실제 immediate bit 0은 저장하지 않고 0으로 간주한다. 나머지 bit들도 instruction 안에서 연속 순서가 아니다.
  • J-immediate의 가장 높은 bit imm[20]은 sign bit다. 이것이 1이면 sign extension 후 음수 offset이 될 수 있다.
  • jal rd,offset은 PC를 PC+offset으로 바꾸는 동시에 원래 다음 주소 PC+4를 rd에 쓴다. 이 문제에서는 rd가 x8=s0다.
  • Signed 12-bit immediate 범위는 -2^11부터 2^11-1, 즉 -2048부터 2047까지다.
  • Pseudoinstruction li는 상수의 값에 따라 expansion이 달라진다. 4097은 12-bit signed 범위를 넘어 luiaddi가 필요하다.
  • 이 특정 값 4097은 low 12 bit가 +1이므로 단순히 lui x9,0x1; addi x9,x9,1로 만들 수 있다. low part의 sign bit가 1인 다른 값은 upper part 보정이 필요할 수 있다.

5. 시험장에서 그대로 쓰는 단계별 풀이

  1. 모든 binary의 오른쪽 끝 7 bit를 먼저 표시하고 opcode별로 I, U, J 세 묶음으로 분류한다.
  2. I-Typ A, C, E는 공통 field 표를 사용해 rd, funct3, rs1, imm 순서로 읽는다.
  3. A는 rd=x9, funct3=000, rs1=x9, imm=1이므로 addi x9,x9,1이다.
  4. C는 rd=x8, funct3=000, rs1=x9, imm=6이므로 addi s0,s1,6이며 2a에서 남긴다.
  5. E는 rd=x8, funct3=110, rs1=x0, imm=6이므로 ori s0,zero,6이다.
  6. D는 U-Typ lui, rd=x9, upimm=1이므로 x9에 0x1000을 만든다.
  7. B는 J-Typ jal, rd=x8, 재조립한 signed offset=-8이다.
  8. 마지막에 pseudo 후보 li를 실제 값 변화로 추적한다: D 후 x9=4096, A 후 x9=4097.
  9. 모든 후보를 연결한 뒤 남은 C가 정말 어느 후보와도 일치하지 않는지 funct3와 register를 다시 확인한다.

6. 예시와 변형 문제 연결

  • addi x5,x0,7은 I-Typ 한 줄로 x5에 7을 만든다. 7은 signed 12-bit 범위에 들어가므로 li x5,7도 보통 이 한 줄로 확장할 수 있다.
  • ori x8,x0,6은 0과 6의 bitwise OR 결과 6을 x8에 쓴다. addi x8,x0,6도 이 값에서는 결과가 6이지만 funct3와 연산 의미는 다르다.
  • lui x5,0x2는 x5=2가 아니라 x5=0x00002000을 만든다. U-Typ immediate 뒤에 12개의 0이 붙는다고 그리면 쉽다.
  • li x5,2047addi x5,x0,2047 하나로 가능하지만 2048은 signed 12-bit 최대값을 넘으므로 upper/lower 조합을 고려해야 한다.
  • J-Typ을 볼 때 symbolic label을 모르면 jal s0,-8처럼 numeric offset까지 쓰면 encoding 실력을 증명할 수 있다.

7. 독일어 만점 답안 템플릿

1 → E, 2 → A, 3 → B und 4 → D gefolgt von A. A ist addi x9,x9,1, B ist jal s0,-8, D ist lui x9,0x1 und E ist ori s0,zero,6. Der Pseudobefehl li x9,4097 wird zu lui x9,0x1 und anschließend addi x9,x9,1 expandiert.

8. 자주 나오는 오답과 교정

  • 왼쪽 끝 7 bit를 opcode로 읽기: opcode는 오른쪽 bits 6:0이다.
  • 8-bit 공백을 field 경계로 믿기: 공백은 가독성용이며 rd나 funct3가 묶음 중간을 가를 수 있다.
  • opcode 0010011만 보고 모두 addi로 쓰기: funct3까지 읽어 ori와 구분해야 한다.
  • x8과 x9의 alias를 뒤집기: x8=s0, x9=s1이다.
  • D를 완전한 li x9,4097로 선택하기: D 후 값은 4096뿐이다.
  • li를 실제 32-bit instruction format이라고 생각하기: li는 pseudo라 0개가 아니라 하나 이상의 실제 instruction으로 바뀐다.
  • B의 immediate를 연속 20 bit처럼 읽기: J-Typ 조각은 재배열해야 한다.
  • J-immediate sign bit 1을 무시해 +8로 쓰기: 재조립 후 sign extension하면 -8이다.
  • A가 후보 2에 쓰였으니 후보 4에는 못 쓴다고 생각하기: 후보 4는 두 instruction expansion이고 A가 그 두 번째로 재사용된다.
  • hex 숫자만 외우고 field 검산을 하지 않기: 시험에서 다른 word가 나오면 적용할 수 없다.

9. 답을 보지 않고 확인하기

  1. 왜 binary의 오른쪽 끝 7 bit부터 읽어야 하는가?
  2. 0010011 opcode 안에서 addi와 ori를 무엇으로 구분하는가?
  3. A의 rd와 rs1은 각각 어느 register인가?
  4. D 실행 직후 x9의 값은 10진수로 얼마인가?
  5. li x9,4097에 D와 A가 모두 필요한가?
  6. B가 증명하는 jump offset과 destination register는 무엇인가?
  7. 2a에서 최종적으로 남는 binary 후보는 무엇인가?
확인문제 정답 보기
  1. RISC-V 32-bit instruction의 opcode가 정의상 bits 6:0에 있기 때문이다.
  2. bits 14:12의 funct3로 구분한다. addi=000, ori=110이다.
  3. A는 rd=01001=x9=s1, rs1=01001=x9=s1이다.
  4. lui x9,0x10x1000, 즉 4096을 만든다.
  5. D가 4096을 만들고 A가 1을 더해야 목표 4097이 되기 때문이다.
  6. B는 jal with rd=01000=x8=s0, offset=-8이다.
  7. C가 남는다. C는 2b에서 addi s0,s1,6으로 decode한다.

Interactive practice

Assembler ↔ Binary matching

각 instruction에 해당하는 candidate를 선택하세요.

Teilaufgabe

2b

2 points

Original German

Einer der Binärbits hatte keine Zuordnung. Welche Instruktion ist da gegeben?

Recall-Antwort: addi s0, s1, 6 (x8 und x9).

Normalisierungshinweis: Im Original stehen mojibake-Formen wie Bin채rdarstellung und Lösung; semantisch ist Binärdarstellung und Lösung gemeint. Außerdem ist Gesammt ein Schreibfehler für Gesamt. Die Binärstrings werden unverändert als msb links, lsb rechts behandelt, wie in Übung 1 gefordert.

한국어 문제

위 목록 중 어떤 Assembler Instruktion에도 배정되지 않은 32-bit binary 하나를 decode하라. 답은 opcode부터 읽고, 형식(I-Typ/J-Typ/U-Typ)을 정한 뒤 rd, rs1, funct3, immediate를 확인해서 써야 한다.

한 줄 핵심

남은 32-bit word를 opcode부터 독립 decode하고, register 번호와 sign-extended immediate로 역검산한다.

0. 초보자 개념 다리

남은 퍼즐 조각을 후보에 억지로 맞추지 말고 opcode부터 새 instruction을 조립한다.

1. 이 문제의 풀이 루틴

  1. bits 6:0의 opcode를 읽는다.
  2. format대로 field를 분리한다.
  3. immediate를 재배열하고 sign extension한다.
  4. 완성한 assembly를 다시 encode한다.

2. 왜 이 방법이 맞을까?

decode와 re-encode 왕복 검산이 register 번호와 immediate 오류를 잡아 준다.

3. 시험장 실수 방지

field는 bit 0이 있는 오른쪽부터 센다.

최대 상세 해설 · 2b 완전 초보 강의: 남은 binary C를 opcode부터 독립 decode하기

이 강의의 도착점

2a의 매칭 결과를 외우지 않고도 남은 32-bit word C를 오른쪽 opcode부터 정확히 잘라 addi s0,s1,6으로 복원하고 다시 encode하여 검산한다.

0. 정말 아무것도 모른다면 여기서 시작

  • 2b는 ‘남은 것은 C니까 recall 답을 쓰자’는 문제가 아니다. 시험이 확인하려는 능력은 32개의 0/1만 보고 원래 Assembly instruction을 복원하는 것이다.
  • 주소나 값이 적힌 binary처럼 보여도 이 32 bit는 하나의 instruction이다. instruction 안에는 동작 종류, 결과를 넣을 register, 읽을 register, 작은 상수가 각자 정해진 자리에 들어 있다.
  • 우리는 C를 한 번에 읽지 않는다. 먼저 opcode 7 bit로 큰 양식을 찾고, 그 양식의 칸막이를 올린 다음 각 field를 하나씩 번역한다.
  • C는 00000000 01100100 10000100 00010011이다. 공백을 지우면 32 bit지만, 계산 중에는 12|5|3|5|7 칸으로 다시 나누어 읽는다.
  • 마지막에는 얻은 Assembly를 다시 같은 field에 넣는다. 원래 C가 그대로 나오면 decode가 맞다. 이 왕복 검산은 register 번호를 하나 틀리거나 immediate를 잘못 읽는 실수를 잡는다.

1. 문제에 나오는 말부터 하나씩

decode
machine-code bit를 field로 나누고 사람이 읽는 Assembly instruction으로 복원하는 과정.
encode
Assembly instruction의 각 요소를 bit field에 넣어 machine code를 만드는 반대 과정.
field
32-bit instruction 안에서 한 역할을 맡은 연속된 칸 묶음.
OP-IMM
register 값과 instruction 안의 immediate를 사용해 계산하는 instruction 큰 그룹. opcode는 0010011.
addi
add immediate. addi rd,rs1,immrd = rs1 + SignExt(imm)을 수행한다.
s0 / x8
같은 register의 ABI 별명과 번호. binary에는 이름이 아니라 번호 8=01000이 들어간다.
s1 / x9
같은 register의 ABI 별명과 번호. 번호 9의 5-bit 표현은 01001.
positive immediate
imm의 최상위 sign bit가 0인 양수. 000000000110은 10진수 6이다.
re-encode
decode한 답을 다시 bit로 만들어 원본과 같은지 확인하는 검산 방법.

2. 선생님과 같이 한 칸씩 푸는 과정

  1. 원본 C를 적는다: 00000000 01100100 10000100 00010011.
  2. 가장 오른쪽 7 bit를 센다. 0010011이 나온다. 이는 OP-IMM이며 I-Typ format을 사용한다.
  3. I-Typ 칸막이를 쓴다: imm[31:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0].
  4. C에 칸막이를 적용하면 000000000110 | 01001 | 000 | 01000 | 0010011이 된다.
  5. 맨 오른쪽 opcode 0010011은 이미 I-Typ OP-IMM임을 확인했다.
  6. 그 왼쪽 rd 01000을 unsigned binary로 읽으면 8이다. register table에서 x8의 ABI 이름은 s0이므로 결과가 s0에 저장된다.
  7. 그 왼쪽 funct3 000을 OP-IMM 표에서 찾으면 addi다. 같은 opcode라도 110이었다면 ori였으므로 이 확인을 생략하면 안 된다.
  8. 그 왼쪽 rs1 01001은 9이므로 x9=s1이다. 계산에 사용할 기존 값은 s1에서 읽는다.
  9. 가장 왼쪽 immediate 000000000110의 sign bit는 0이므로 양수다. binary 110은 4+2=6이므로 imm=6이다.
  10. I-Typ Assembly 순서는 mnemonic, rd, rs1, imm다. 지금까지 얻은 것을 넣으면 addi s0,s1,6이다.
  11. 동작을 평범한 말로 읽는다: ‘s1에 들어 있던 값에 6을 더해 s0에 저장한다.’ 예를 들어 s1=10이면 실행 뒤 s0=16이다.
  12. 이제 re-encode한다. imm 6=000000000110, rs1 s1=01001, funct3 addi=000, rd s0=01000, opcode=0010011을 이어 붙인다.
  13. 결과는 00000000011001001000010000010011이고 8 bit씩 띄우면 원본 00000000 01100100 10000100 00010011과 같다.
  14. 따라서 최종 답은 C=addi s0,s1,6이며 recall 답과도 일치한다.

3. 그래서 정답은 무엇인가?

남은 후보 C는 field로 000000000110 | 01001 | 000 | 01000 | 0010011이고, 따라서 addi s0, s1, 6이다. 의미는 s0 = s1 + 6이다.

4. 이제 정확한 개념으로 한 단계 더 깊게

  • Decode는 항상 opcode에서 시작한다. opcode를 모르고 rd나 immediate부터 추측하면 어떤 format인지 몰라 field 경계를 정할 수 없다.
  • C의 opcode 0010011은 I-Typ OP-IMM group이다. 이 group은 register 하나와 12-bit immediate 하나를 입력으로 사용한다.
  • I-Typ field는 왼쪽부터 12,5,3,5,7 bit이고 합은 32다. 이 합을 확인하면 한 칸 밀려 자르는 실수를 발견할 수 있다.
  • Register field는 5 bit다. 5 bit로 0부터 31까지 32개 register를 나타낼 수 있다.
  • 01000은 8이라 x8, ABI alias는 s0다. 01001은 9라 x9, alias는 s1이다.
  • funct3=000은 OP-IMM 문맥에서 addi다. funct3의 의미는 opcode 문맥에 따라 해석해야 하며 독립적으로 외운 000 하나만으로는 부족하다.
  • Immediate 000000000110은 12-bit signed two's-complement 값이다. sign bit가 0이므로 그대로 6이다.
  • addi는 arithmetic overflow trap을 일으키는 별도 signed add가 아니라 modulo XLEN 정수 덧셈 의미를 갖지만, 이 문제에서는 단순히 rs1+6으로 이해하면 충분하다.
  • ABI 이름 s0/s1은 사람을 위한 별명이고 encoding에는 x8/x9의 5-bit 번호만 들어간다.
  • Endian 문제와 화면의 bit 순서를 섞지 않는다. 여기서는 문제 지시대로 32-bit instruction word를 MSB 왼쪽, LSB 오른쪽으로 읽는다. memory byte order를 뒤집는 문제가 아니다.

5. 시험장에서 그대로 쓰는 단계별 풀이

  1. C의 오른쪽 7 bit 0010011을 읽어 I-Typ OP-IMM으로 결정한다.
  2. I-Typ 경계 12|5|3|5|7을 적용한다.
  3. rd 01000을 x8=s0로 변환한다.
  4. funct3 000을 addi로 변환한다.
  5. rs1 01001을 x9=s1로 변환한다.
  6. imm 000000000110을 signed 12-bit 값 +6으로 변환한다.
  7. Assembly operand 순서 rd,rs1,imm에 넣어 addi s0,s1,6을 만든다.
  8. 같은 field를 다시 이어 원본 C가 되는지 확인한다.

6. 예시와 변형 문제 연결

  • 만약 rd만 01001로 바뀌면 addi s1,s1,6이 된다. field 다섯 bit 차이가 destination을 바꾼다.
  • 만약 funct3가 110이면 같은 opcode와 같은 register라도 ori s0,s1,6이 된다. 그래서 funct3 확인이 필수다.
  • 만약 immediate가 111111111110이면 12-bit two's complement -2다. sign extension 후 addi s0,s1,-2가 된다.
  • addi s0,s1,6에서 s1=10이면 s0=16이 되고 s1 자체는 바뀌지 않는다. rd만 쓰기 대상이기 때문이다.
  • Hex로 검산하면 C는 0x00648413이다. 그러나 초보 단계에서는 hex보다 field split을 먼저 확실히 익히는 것이 중요하다.

7. 독일어 만점 답안 템플릿

Das nicht zugeordnete Binärwort C wird als I-Typ zerlegt: imm=000000000110=6, rs1=01001=x9=s1, funct3=000, rd=01000=x8=s0, opcode=0010011. Damit lautet die Instruktion addi s0,s1,6.

8. 자주 나오는 오답과 교정

  • 남았다는 이유만으로 답을 외워 쓰고 field 근거를 적지 않기: 중간점수를 잃고 변형 문제를 풀지 못한다.
  • C의 왼쪽 0000000을 opcode로 보기: opcode는 오른쪽 끝이다.
  • 8-bit 공백대로 네 부분만 나누기: I-Typ은 12|5|3|5|7로 나눈다.
  • rd와 rs1을 뒤집어 addi s1,s0,6으로 쓰기: rd는 bits 11:7, rs1은 bits 19:15다.
  • x8=s1, x9=s0로 alias를 뒤집기: 정확히 x8=s0, x9=s1이다.
  • funct3를 보지 않고 ori라고 쓰기: C의 funct3는 000이라 addi다.
  • immediate 110을 3이나 다른 값으로 읽기: binary place value는 4+2=6이다.
  • sign extension을 무조건 음수화라고 오해하기: sign bit가 0이면 앞을 0으로 채워 양수 6이다.
  • Assembly operand 순서를 rs1,rd,imm으로 쓰기: RISC-V 표기는 addi rd,rs1,imm이다.
  • re-encode 없이 끝내기: 한 bit 경계 오류를 잡을 마지막 기회를 놓친다.

9. 답을 보지 않고 확인하기

  1. C의 opcode는 무엇이며 어떤 format을 뜻하는가?
  2. I-Typ의 다섯 field를 왼쪽부터 말할 수 있는가?
  3. C의 rd 01000은 어떤 register인가?
  4. C의 rs1 01001은 어떤 register인가?
  5. C의 funct3 000은 이 opcode에서 어떤 mnemonic을 뜻하는가?
  6. immediate 000000000110은 왜 +6인가?
  7. addi s0,s1,6의 실행 의미를 평범한 문장으로 말할 수 있는가?
  8. 최종 답을 다시 encoding했을 때 어떤 field 문자열이 되는가?
확인문제 정답 보기
  1. opcode는 0010011이며 I-Typ OP-IMM group이다.
  2. imm[11:0] | rs1 | funct3 | rd | opcode, bit 수로는 12|5|3|5|7이다.
  3. 01000은 8이므로 x8=s0다.
  4. 01001은 9이므로 x9=s1이다.
  5. OP-IMM에서 funct3 000은 addi다.
  6. sign bit가 0이고 오른쪽 set bit의 가중치가 4와 2라서 4+2=6이다.
  7. s1의 기존 값에 6을 더해 그 결과를 s0에 저장한다. s1은 바뀌지 않는다.
  8. 000000000110 | 01001 | 000 | 01000 | 0010011이며 공백을 정리하면 원래 C와 같다.

Interactive practice

RISC-V 32-bit decoder

hex word를 입력하면 opcode와 register field가 색상별로 분해됩니다.

Intro

Metadata

FeldInhalt
Aufgabe2
TitelAssembler und Maschinencode
Punkte8 Punkte
Empfohlene Zeit8 Minuten
Tutor modeencoding
KonzepteRISC-V instruction encoding, I-Typ, U-Typ, J-Typ, opcode, funct3, immediate, li pseudoinstruction
Recall-source confidencemittel: die Aufgabe und Bitstrings sind lesbar, aber das Gedächtnisprotokoll ist not official und keine offizielle Lösung
Verification statusindependent_decode_complete

Verifikationsquellen: Gedächtnisprotokoll Rechnerorganisation SoSe25.md#aufgabe-2, Uebung\Übung 1.pdf pages-1,5-6, Uebung\Übung 1 Musterlösung.pdf pages-1-2,7-8, Uebung\Übung 2.pdf page-1, Uebung\Übung 2 Musterlösung\Rechnerorganisation_Übung2_Lösung.pdf pages-1-3, Uebung\Übung 4.pdf page-1, Uebung\Lösung 4.pdf pages-1-2, Uebung\RISC-V Reference.pdf pages-1-2.

Original German

2a) ~ 6 Punkte

Ordne die folgenden Assembler Instruktionen den richtigen Binärdarstellungen zu:

Nr.AssemblerNr.Binärdarstellung
1ori s0, zero, 6A00000000 00010100 10000100 10010011
2addi x9, x9, 1B11111111 10011111 11110100 01101111
3jal s0, loopC00000000 01100100 10000100 00010011
4li x9, 4097D00000000 00000000 00010100 10110111
--E00000000 01100000 01100100 00010011

Recall-Lösung im Gedächtnisprotokoll: 1 -> E, 2 -> A, 3 -> B, 4 -> A UND D.

2b) ~ 2 Punkte

Einer der Binärbits hatte keine Zuordnung. Welche Instruktion ist da gegeben?

Recall-Antwort: addi s0, s1, 6 (x8 und x9).

Normalisierungshinweis: Im Original stehen mojibake-Formen wie Bin채rdarstellung und Lösung; semantisch ist Binärdarstellung und Lösung gemeint. Außerdem ist Gesammt ein Schreibfehler für Gesamt. Die Binärstrings werden unverändert als msb links, lsb rechts behandelt, wie in Übung 1 gefordert.

Korean Translation

2a) 약 6점

다음 RISC-V Assembler Instruktionen을 올바른 32-bit Binärdarstellung과 매칭하라. ori, addi, jal, 그리고 li x9,4097이 섞여 있다. 중요한 점은 li가 RISC-V Basisinstruktion이 아니라 Pseudoinstruction이므로, 값의 크기에 따라 하나 또는 두 개의 실제 Instruktionen으로 확장될 수 있다는 것이다.

2b) 약 2점

위 목록 중 어떤 Assembler Instruktion에도 배정되지 않은 32-bit binary 하나를 decode하라. 답은 opcode부터 읽고, 형식(I-Typ/J-Typ/U-Typ)을 정한 뒤 rd, rs1, funct3, immediate를 확인해서 써야 한다.

Concept Lesson

Prerequisites

이 문제를 풀려면 먼저 RISC-V register 번호를 알아야 한다. x0 = zero, x8 = s0/fp, x9 = s1이다. RISC-V Reference의 register table이 이 대응을 준다 (Uebung\RISC-V Reference.pdf pages-1-1).

두 번째로 instruction format을 외우기보다 표로 재구성할 수 있어야 한다. Reference와 Übung 1은 I-Typ을 imm[11:0] rs1 funct3 rd opcode, U-Typ을 imm[31:12] rd opcode, J-Typ을 imm[20,10:1,11,19:12] rd opcode 순서로 둔다 (Uebung\Übung 1.pdf pages-5-6, Uebung\RISC-V Reference.pdf pages-1-2).

Key Terms

Begriff
opcode하위 7비트. instruction 종류를 먼저 가른다.
funct3같은 opcode 안에서 연산을 더 구분한다. addi=000, ori=110.
rddestination register, bits 11:7.
rs1first source register, bits 19:15.
immimmediate. 형식마다 비트 배치와 sign extension 규칙이 다르다.
PseudoinstructionAssembler가 하나 이상의 Basisinstruktionen으로 바꾸는 축약 표현. 공식 ISA instruction 자체는 아니다.

What Is Tested

시험은 단순히 addi opcode를 외웠는지보다, 32-bit word를 아래에서부터 안정적으로 쪼개는 능력을 본다. Übung 1 Aufgabe 1.2도 Assembler와 Maschinensprache를 양방향 변환하라고 하고, solution은 각 word를 format과 field로 나눠 decode한다 (Uebung\Übung 1 Musterlösung.pdf pages-1-2).

Why Students Get It Wrong

가장 흔한 실수는 binary를 왼쪽부터 opcode라고 착각하는 것이다. RISC-V 32-bit word를 msb 왼쪽으로 적어도 opcode는 항상 오른쪽 끝 7비트다. 두 번째 실수는 li를 하나의 instruction이라고 생각하는 것이다. Übung 2와 Lösung 4는 12-bit보다 큰 상수를 luiaddi 조합으로 만들며, addi immediate가 sign-extend된다는 점을 강조한다 (Uebung\Übung 2 Musterlösung\Rechnerorganisation_Übung2_Lösung.pdf pages-1-3, Uebung\Lösung 4.pdf pages-1-2).

Problem Interpretation

Given

Assembler 후보 4개와 32-bit binary 후보 5개가 주어진다. 한 binary는 남아야 하며, 남은 binary를 직접 decode해야 한다.

Find

2a에서는 각 Assembler 후보가 어느 binary 후보와 대응되는지 찾는다. 2b에서는 남은 binary의 instruction mnemonic과 operands를 찾는다.

Constraints

모든 binary는 32비트이고 msb가 왼쪽에 적혀 있다. RV32I 기준으로 decode한다. li는 pseudo이므로 실제로는 luiaddi 두 개가 될 수 있다.

Traps

A는 standalone addi x9,x9,1이면서 동시에 li x9,4097의 두 번째 basis instruction이다. 그래서 one-to-one matching 문제가 아니라 pseudo expansion을 허용하는 matching 문제다. Bjal이고 J-immediate가 섞인 순서로 저장되므로 일반 I-immediate처럼 읽으면 안 된다.

Formula/Rules

FormatBit fields
I-Typimm[11:0] rs1 funct3 rd opcode
U-Typimm[31:12] rd opcode
J-Typimm[20] imm[10:1] imm[11] imm[19:12] rd opcode

addi: opcode 0010011, funct3 000, operation rd = rs1 + SignExt(imm). ori: opcode 0010011, funct3 110, operation rd = rs1 | SignExt(imm). jal: opcode 1101111, operation PC = PC + SignExt({imm[20:1], 0}), rd = PC + 4. lui: opcode 0110111, operation rd = {upimm, 12'b0}. These are listed in the RISC-V Reference (Uebung\RISC-V Reference.pdf pages-1-2).

Required Hand-Written Intermediate State

시험장에서는 각 binary에 대해 최소한 hex, opcode, format, rd, funct3, rs1, imm를 표에 적는다. jalimm[20|10:1|11|19:12] 조각도 따로 적는다.

Solving Procedure

  1. 32-bit binary의 오른쪽 7비트 opcode를 읽는다.
  2. opcode로 format을 결정한다: 0010011이면 I-Typ ALU immediate, 0110111이면 U-Typ lui, 1101111이면 J-Typ jal.
  3. rd = bits[11:7]를 5비트 register 번호로 바꾼다.
  4. I-Typ이면 funct3 = bits[14:12], rs1 = bits[19:15], imm = bits[31:20]를 읽고 sign-extend한다.
  5. U-Typ이면 upimm = bits[31:12]이고 실제 값은 upimm << 12다.
  6. J-Typ이면 immediate를 imm[20] imm[10:1] imm[11] imm[19:12] 0 순서로 재조립하고 sign-extend한다.
  7. Pseudoinstruction 후보가 있으면 Basisinstruktionen 전체가 맞는지 확인한다. li x9,4097 = 0x1001은 12-bit signed immediate 범위를 넘으므로 lui x9,0x1addi x9,x9,1이 필요하다.
  8. 마지막으로 hex로 검산한다. 같은 binary가 pseudo expansion의 일부로 재사용될 수 있는지 따로 표시한다.
Detailed Solution

7.1 Candidate A

Binary:

00000000 00010100 10000100 10010011

Hex: 0x00148493

I-Typ split:

FieldBitsValue
imm[11:0]0000000000011
rs101001x9 = s1
funct3000addi
rd01001x9 = s1
opcode0010011OP-IMM

Therefore:

addi x9, x9, 1

This matches candidate 2. It is also the second instruction of li x9,4097.

7.2 Candidate B

Binary:

11111111 10011111 11110100 01101111

Hex: 0xFF9FF46F

J-Typ split:

FieldBitsValue
imm[20]1negative sign
imm[10:1]1111111100part of offset
imm[11]1part of offset
imm[19:12]11111111part of offset
rd01000x8 = s0/fp
opcode1101111jal

Reassembled immediate:

imm = sign_extend(1 11111111 1 1111111100 0) = -8

Therefore:

jal s0, -8        # symbolisch: jal s0, loop, falls loop bei PC-8 liegt

This matches candidate 3. jal stores PC+4 in rd, so with rd=x8 the return/link value is written to s0.

7.3 Candidate C

Binary:

00000000 01100100 10000100 00010011

Hex: 0x00648413

I-Typ split:

FieldBitsValue
imm[11:0]0000000001106
rs101001x9 = s1
funct3000addi
rd01000x8 = s0/fp
opcode0010011OP-IMM

Therefore:

addi s0, s1, 6

This does not match any 2a Assembler candidate and is the correct answer for 2b.

7.4 Candidate D

Binary:

00000000 00000000 00010100 10110111

Hex: 0x000014B7

U-Typ split:

FieldBitsValue
imm[31:12]000000000000000000010x1
rd01001x9 = s1
opcode0110111lui

Therefore:

lui x9, 0x1       # x9 = 0x00001000

This is not the whole li x9,4097, but it is the first expansion instruction.

7.5 Candidate E

Binary:

00000000 01100000 01100100 00010011

Hex: 0x00606413

I-Typ split:

FieldBitsValue
imm[11:0]0000000001106
rs100000x0 = zero
funct3110ori
rd01000x8 = s0/fp
opcode0010011OP-IMM

Therefore:

ori s0, zero, 6

This matches candidate 1.

7.6 Pseudoinstruction li x9,4097

Target value:

4097 decimal = 0x00001001 = 0x1000 + 0x001

Because 4097 is outside signed 12-bit immediate range [-2048, 2047], li x9,4097 cannot be just addi x9,zero,4097. It must use a high part and a low part:

lui  x9, 0x1      # x9 = 0x00001000
addi x9, x9, 1    # x9 = 0x00001001

Bit/hex check:

Expansion stepFieldsBinaryHex
lui x9,0x1imm[31:12]=00000000000000000001, rd=01001, opcode=011011100000000 00000000 00010100 101101110x000014B7
addi x9,x9,1imm=000000000001, rs1=01001, funct3=000, rd=01001, opcode=001001100000000 00010100 10000100 100100110x00148493

So candidate 4 maps to D and A, in that execution order. This agrees with the RISC-V Reference pseudoinstruction rule and with Übung 2 / Lösung 4 on li expansion and sign-extended addi immediates (Uebung\RISC-V Reference.pdf pages-2-2, Uebung\Übung 2 Musterlösung\Rechnerorganisation_Übung2_Lösung.pdf pages-1-3, Uebung\Lösung 4.pdf pages-1-2).

7.7 Final Answers

AufgabeCorrect matchVerified reason
1 ori s0, zero, 6EI-Typ OP-IMM, funct3=110, rd=x8, rs1=x0, imm=6
2 addi x9, x9, 1AI-Typ OP-IMM, funct3=000, rd=x9, rs1=x9, imm=1
3 jal s0, loopBJ-Typ, rd=x8, immediate -8
4 li x9, 4097D then Alui x9,0x1; addi x9,x9,1
2b remainingCaddi s0, s1, 6

Recall-Answer Audit

Recall claimVerdictExplanation
1 -> EcorrectE decodes to ori s0, zero, 6.
2 -> AcorrectA decodes to addi x9, x9, 1.
3 -> Bcorrect if loop = PC-8B is jal s0, -8; symbolic label loop is plausible but label address is not in the recall source.
4 -> A UND Dcorrect but order should be D then Ali x9,4097 expands to lui first, addi second.
2b addi s0, s1, 6correctC decodes exactly to addi x8,x9,6.

First possible error in a student solution: assigning D alone to li x9,4097. That leaves x9=0x1000, not 0x1001, so the low 12 bits are missing. Violated rule: li rd, imm[31:0] expands to lui rd, imm[31:12] plus addi rd, rd, imm[11:0] when needed.

Verification status: all recalled answers are independently verified by bit decoding except the exact symbolic label name loop for jal; the binary proves an offset of -8, and loop is accepted only as the recalled symbol for that offset.

Wrong-Answer Explanations

Wrong answerWhy students choose itWhy it is wrongViolated ruleFast checkCorrect approach
A = ori s0, zero, 60010011 is seen and the student guesses OP-IMM without checking funct3.A has funct3=000, so it is addi, not ori; rd=x9, not x8.funct3 distinguishes OP-IMM instructions.Bits 14:12 of A are 000.Decode funct3, then rd/rs1.
D = li x9,4097 as a single instructionD looks like the high value 0x1000.D alone is lui x9,0x1, leaving x9=4096.li is a Pseudoinstruction and can expand to multiple Basisinstruktionen.Simulate value after lui: 0x1 << 12 = 0x1000.Add the low part with addi x9,x9,1, candidate A.
B = jal s0,+8The immediate bits are read in normal left-to-right order.J-Typ immediate is scrambled and sign-extended; bit 31 is 1, so this is negative.J-Typ immediate layout is 20,10:1,11,19:12 plus low zero.Top bit of B is 1; offset cannot be positive small +8.Reassemble J-immediate and sign-extend to get -8.
C = ori s0,s1,6Immediate and registers look like E, so the mnemonic is guessed.C has funct3=000; ori requires funct3=110.Same opcode does not imply same mnemonic.Compare C bits 14:12: 000.Write addi s0,s1,6.
li x9,4097 = addi x9,zero,4097The student treats all immediates as arbitrary constants.I-Typ immediate is only signed 12-bit; 4097 does not fit.I-Typ has 12-bit sign-extended immediate.Range check: 4097 > 2047.Use lui/addi expansion.

Exam-Room Method

Time budget: spend about 5 minutes decoding all five binaries, 2 minutes handling li, and 1 minute checking leftovers.

First table to write:

CodeHexopcodeFormatmnemonic
A0x001484930010011Iaddi
B0xFF9FF46F1101111Jjal
C0x006484130010011Iaddi
D0x000014B70110111Ului
E0x006064130010011Iori

Partial credit: even if the final symbolic label is uncertain, write jal s0, -8; that demonstrates the correct J-immediate decode. For li, write both basis instructions and mark their order.

Last check: every I-Typ OP-IMM word must end in 0010011; ori must have funct3=110; addi must have funct3=000; lui must end in 0110111; jal must end in 1101111.

Active Recall

Questions

  1. Concept check: 왜 li x9,4097addi x9,zero,4097 하나로 encoding될 수 없는가?
  2. Hand calculation: 00000000 01100100 10000100 00010011을 opcode부터 decode하라.
  3. Transfer variant: li x9,2047은 몇 개의 Basisinstruktionen으로 충분한가? 반대로 li x9,2048은 어떻게 확장할 수 있는가?
  4. J-format drill: jal s0,-8에서 rd와 opcode는 각각 어떤 5비트/7비트 값인가?

Answers

  1. I-Typ addi immediate는 signed 12-bit라서 범위가 [-2048,2047]이다. 4097은 범위를 넘으므로 luiaddi가 필요하다.
  2. opcode 0010011 -> I-Typ OP-IMM; rd=01000=x8=s0; funct3=000=addi; rs1=01001=x9=s1; imm=6. 답: addi s0,s1,6.
  3. 2047은 signed 12-bit에 들어가므로 addi x9,zero,2047 하나로 충분하다. 2048은 bit 11이 set되어 low immediate가 sign-extend되므로 보통 lui x9,0x1; addi x9,x9,-2048처럼 상위 값을 보정해서 만든다.
  4. rd=s0=x8=01000, opcode for jal is 1101111.

Sources

SourceLocatorUsed for
Gedächtnisprotokoll Rechnerorganisation SoSe25.md#aufgabe-2, lines 108-133 in indexed chunkRecalled original problem and recall answer, not official
Uebung\Übung 1.pdfpages-1,5-6Statement that binary is msb-left/lsb-right; RISC-V formats and RV32I reference
Uebung\Übung 1 Musterlösung.pdfpages-1-2,7-8Field-by-field examples for Assembler/Maschinensprache, including ori, jal, and binary decode
Uebung\Übung 2.pdfpage-1li exercise and warning that addi immediate sign-extends
Uebung\Übung 2 Musterlösung\Rechnerorganisation_Übung2_Lösung.pdfpages-1-3Larger constants with lui/addi; examples around li
Uebung\Übung 4.pdfpage-1Pseudobefehl definition task and li expansion prompt
Uebung\Lösung 4.pdfpages-1-2Official explanation: pseudoinstructions expand to basis instructions; li and sign-extension correction
Uebung\RISC-V Reference.pdfpages-1-2Register aliases, instruction formats, opcodes/funct3, pseudoinstruction table

Completion Check