Skip to content

Commit 9e6f798

Browse files
authored
Merge pull request #33 from ICS-25Fall-FDU/feature/pj
docs: PJ
2 parents 5c0265f + 054b262 commit 9e6f798

File tree

3 files changed

+151
-0
lines changed

3 files changed

+151
-0
lines changed

docs/.vitepress/config/zh.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ function sidebarGuide(): DefaultTheme.Sidebar {
6363
{ text: 'Lab3: FlowLab', link: '/lab/lab3' }
6464
]
6565
},
66+
{
67+
text: '课程项目',
68+
items: [
69+
{ text: 'Y86-64 模拟器', link: 'project/project'}
70+
]
71+
},
6672
{
6773
text: '附录',
6874
items: [

docs/project/project.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# PJ: Y86-64 模拟器
2+
3+
## 项目简介
4+
5+
CSAPP 第四章配套课程项目。
6+
7+
本项目需要基于课本中 Y86-64 指令集实现一个软件层面的模拟处理器,使其能够执行 Y86-64 指令。
8+
9+
## 项目要求
10+
11+
- **单人或组队(不多于3人)** 完成。
12+
- 输入输出格式正确,能够通过测试。
13+
- 对技术栈不作限制,你可以使用 C,C++,python 等编程语言实现模拟器。
14+
- 对处理器架构不作限制,可以是单周期 / 多周期。
15+
- 有兴趣的同学可以在通过测试后做一些创新,可以从课本上的其他章节寻找灵感。
16+
> [!important]
17+
>
18+
> 你需要确保提交的代码中有能够通过测试的基础部分代码。
19+
- 按时提交实验代码与 PPT,完成期末汇报。
20+
21+
## 项目实现
22+
23+
### 处理器架构
24+
25+
单周期 CPU 执行一条指令一般分为以下阶段:
26+
27+
- **取指(Fetch)**:取指阶段从内存中读取指令的字节,使用程序计数器(PC)作为内存地址。
28+
- **译码(Decode)**:从寄存器中读取用于运算的数据。
29+
- **执行(Execute)**:算术/逻辑单元(ALU)执行当前指令,或执行算术运算或计算内存引用的有效地址,或增加或减少栈指针。其间可能会设置条件码。
30+
- **访存(Memory)**:可能会将数据写入内存,或者从内存中读取数据。
31+
- **写回(Write back)**:将最多两个数据写入寄存器。
32+
- **更新PC(PC update)**:将PC更新为下一个指令的内存地址。
33+
34+
### 指令集
35+
36+
Y86-64 指令集在 CSAPP 书中第四章有详细的介绍。以下是 Y86-64 指令集的概述图。
37+
38+
![y86](y86.png)
39+
40+
项目中测试用的指令序列在 `/test` 目录下,具体格式示例:
41+
42+
```yaml
43+
| # prog1: Pad with 3 nop's
44+
0x000: 30f20a00000000000000 | irmovq $10,%rdx
45+
0x00a: 30f00300000000000000 | irmovq $3,%rax
46+
0x014: 10 | nop
47+
0x015: 10 | nop
48+
0x016: 10 | nop
49+
0x017: 6020 | addq %rdx,%rax
50+
0x019: 00 | halt
51+
```
52+
53+
每个测试 `/test/{test_name}.yo` 对应的期望输出在 `/answer/{test_name}.json`,具体格式示例:
54+
55+
```json
56+
[
57+
{
58+
"CC": {
59+
"OF": 0,
60+
"SF": 0,
61+
"ZF": 1
62+
},
63+
"MEM": {
64+
"0": 717360,
65+
"16": 6922050288173973504,
66+
"24": 32,
67+
"8": 16914579456
68+
},
69+
"PC": 10,
70+
"REG": {
71+
"r10": 0,
72+
"r11": 0,
73+
"r12": 0,
74+
"r13": 0,
75+
"r14": 0,
76+
"r8": 0,
77+
"r9": 0,
78+
"rax": 0,
79+
"rbp": 0,
80+
"rbx": 0,
81+
"rcx": 0,
82+
"rdi": 0,
83+
"rdx": 10,
84+
"rsi": 0,
85+
"rsp": 0
86+
},
87+
"STAT": 1
88+
}, // 第一条指令执行完之后的状态码、内存、寄存器、程序计数器状态
89+
]
90+
```
91+
92+
> [!tip]
93+
>
94+
> 1. 你的输出格式应当严格遵循 `/answer` 下的示例。
95+
> - 要求在每条指令执行完毕后输出:完整的寄存器信息和内存非零值(八字节对齐,按小端法解释为十进制有符号整数)。内存非零值指{(内存地址,内存值)|内存值 ≠ 0} ,即所有非零内存值的内存地址-值键值对。
96+
> - 所有输出(含内存地址、寄存器值、内存值)均以十进制输出。
97+
> - 不用关心每次 log 内 key-value 的排列顺序,但要确保列表内 log 的顺序与程序执行顺序一致。
98+
>
99+
> 2. 如果你使用 C / C++ 编程,可以参考第三方库,例如 [nlohmann/json](https://github.com/nlohmann/json)。
100+
>
101+
> 3. 你最终实现的程序应当以 **标准输入流(stdin)** 为输入,**标准输出流(stdout)** 为输出。可以使用 **重定向** 实现读写文件:
102+
>
103+
> ```bash
104+
> # 读取 test/prog1.yo,写入 answer/prog1.json
105+
> ./cpu < test/prog1.yo > answer/prog1.json
106+
> python cpu.py < test/prog1.yo > answer/prog1.json
107+
> ```
108+
109+
## 项目开发与提交
110+
111+
### 环境配置
112+
113+
- 本次项目不同于以往实验,可以在非 Linux 环境下进行开发。
114+
115+
- 你需要根据你的技术栈安装必要的环境,请自行上网搜索。
116+
117+
### 代码下载
118+
119+
由于分组暂未确认,我们还未生成作业仓库,但测试文件已经编写完成,临时仓库地址为 [fduTristin/Y86-64-Simulator](https://github.com/fduTristin/Y86-64-Simulator),在你的开发环境终端执行以下命令以获取临时项目代码。
120+
121+
```bash
122+
git clone git@github.com:fduTristin/Y86-64-Simulator.git
123+
```
124+
125+
> [!info]
126+
>
127+
> - 临时仓库的测试文件之后将不会改变,正式的仓库会新增自动评分脚本以及可能会新增更详细的说明文档。
128+
> - 目录下的 `cpu.h`、`cpu.c`、`cpu.py`、`Makefile` 文件仅供参考,你可以将他们删去。
129+
130+
### 提交
131+
132+
单人完成项目的提交流程与之前的 lab 相同(需要等待正式作业仓库生成),多人协作项目的提交方式待定。
133+
134+
## 评分标准
135+
136+
项目得分计算公式为:
137+
138+
$\text{总分} = \text{得分上限} * (\frac{5}{6}\text{基础功能得分} + \frac{1}{6}\text{汇报得分})$
139+
140+
> [!note]
141+
>
142+
> **选课代码为 CS10005.02 的同学** 请阅读以下内容:
143+
>
144+
> 1. 多人组队的得分上限为总分的 **90%**。
145+
> 2. 创新设计可能会给你的汇报带来更高的分数,但不鼓励在实现前端上花费太多时间。

docs/project/y86.png

677 KB
Loading

0 commit comments

Comments
 (0)