计组复习之第二章结尾和第三章

J-format 指令 J型指令只有 jal 一条, 其含义为 Jump and link 格式为 jal rd label 即将PC + 4的值存入rd(通常为ra), 并将PC的值设为PC + label 其二进制格式为: 其立即数为20位, 因此可以跳转到 [PC - 1 MiB, PC + 1 MiB] 这个范围内的任意 2 字节对齐的地址。 U-format 指令 lui (Load Upper Immediate) - 加载高位立即数 指令含义: lui rd, immediate 其完成的具体操作: 将 immediate 放入 rd 的高20位 将rd 的低20位清零. 我们如果要完成向某寄存器加载32位立即数, 那么要完成的是: 用 lui 设置高20位 用 addi 设置低12位 注意, addi的12位立即数是有符号数, 因此如果要加载的32位立即数的第11位为1, 那么lui 的立即数需要加1来补偿. auipc (Add Upper Immediate to PC) 指令含义: 将高位立即数加到pc上 auipc rd, imm 其完成的具体操作: 将立即数左移20位 将立即数和PC 相加 将结果存入rd ​ 同样, 如果要加载32位地址, 要把lui的立即数 +1 补偿. ...

October 29, 2025

期中复习Chapter4

第四章 处理器 在本章中, 我们将讨论现代计算机中央处理器的组成以及工作方式, 我们会从单周期CPU开始, 逐步扩展到现代的流水线CPU. 序言: 计算机抽象 在计算机系统中, 我们编写的高级语言程序(High Level Language Program)被编译器编译为汇编代码(Assembly Language), 再由汇编器翻译为机器语言(Machine Language). 机器语言被CPU中的硬件架构处理, 而这些架构又是由一个个逻辑门电路组成的. 在第三章中, 我们已经讨论了门电路是如何组成ALU(Arithmetic Logical Unit)等原件的. 在本章中, 我们会聚焦于CPU是如何通过这些抽象的元件进行组合, 完成译码, 存取数据等一系列操作的. CPU Overview 单核处理器的基本组成 一个单核处理器包含数据通路和控制通路两部分. 数据通路是负责处理和传输数据的硬件集合, 其主要包括: 寄存器文件 (Register File, RF) 主内存 (Main Memory) 算数逻辑单元 (ALU) 立即数生成器 (Immediate generator) 而控制通路是负责产生时序和控制信号的硬件集合, 主要包括: 主控制单元 (Main Control Unit) ALU 控制单元(ALU Control Unit) 稍后我们会详细讨论这些硬件是如何组成CPU的. CPU处理指令的基本流程 指令内存(Instruction Memory)从PC中取出指令地址, 将指令送往不同的其他硬件: 寄存器文件 ALU 寄存器文件读取寄存器的值 ALU进行计算, 这里的计算主要分为以下几种类型 对 R-type 或 I-type 指令进行的算数运算 ...

October 28, 2025

riscv中jalr指令实现方式

我们计组老师让我们写出jalr的实现, 于是正好总结一下单周期cpu是如何执行指令的. 周期开始, PC在时钟周期上升沿读取送来的地址, 随后组合电路 Instruction Memory 在一个短小的延迟后输出了指令. 随后, 指令被分为了多个部分, 送往寄存器文件, 立即数生成器和控制单元. 我们现在主要关注作为I-type 指令的 jalr, 其指令格式是: 其作用是将当前 PC 中的地址送入 rd (通常是 ra), 然后把 rs1 + immediate 的值送入PC. 而return一般用代码 jalr x0, ra, x0 实现. 我们可以看到, 其 0~6 位的 opcode 被送往了 control 单元. 然后, 在阅读了 opcode 后, control 单元会生成以下信号: ALUop , 这是一个两位的指令, 被送往ALU. 其用于决定ALU执行什么类型的运算. (add sub and or… etc.) 不同情况下的ALUop如下: 在这里, 我们的ALU要实现一个加法, 并且不需要查看funct3的值. 我们可以合理推测其ALUOP也是 00. ALU control 在收到ALUOP后, 发现自己不需要看funt3 和 funt7, 于是生成了一个 值为 0010 的ALU control. ...

October 20, 2025

CF2147D

题目链接 题意: Alice 和 Bob 玩游戏, 可以轮流对序列进行如下操作: 选择序列 a 中的某个数字 x, 然后: 1.对于a中每个x, 当前操作玩家获得1分. 2.序列a中所有x变为 x - 1 如果两人均希望最大化得分, 输出最终两人的分数. 稍微思考一下, 如果所有数字都是偶数, 那么后手可以通过复制先手的行动, 获得和先手完全一样的分数. 如果有多个奇数, 对于每个奇数其实只用考虑第一次拿, 拿完以后就会变成必然可以平分的偶数. 所以两者会贪心地把数目最多的奇数依次变成偶数, 并在所有数都变成偶数后平分剩下的分数. 代码: #include <bits/stdc++.h> #define int long long using namespace std; struct solve { int n, ansa = 0, ansb = 0, anss = 0; vector<int> a; map<int, int> mp; vector<pair<int, int>> vec; solve() { cin >> n; a.resize(n + 1); for (int i = 1; i <= n; i++) cin >> a[i], mp[a[i]]++; } void run() { for (auto [t, num] : mp) { vec.push_back({-num, t}); } sort(vec.begin(), vec.end()); int nm = 0; for (auto [num, t] : vec) { num = -num; if (t % 2 == 1) { nm++; if (nm % 2 == 1) { ansa += num; } else { ansb += num; } anss += (t - 1) * num; } else { anss += t * num; } } cout << ansa + (anss / 2) << ' ' << ansb + (anss / 2) << '\n'; } }; signed main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { solve sl; sl.run(); } return 0; } 此题给我们的启示是, 博弈题可以从小的情况开始推理, 口胡一些看起来很对的做法, 然后就ac了() ...

October 20, 2025

如何简化向网站提交文章的过程

就现在而言, 我如果要写一篇文章, 大概的工作流是这样的: 在cmd里运行命令 hugo new posts/name_of_the_post.md 编写文章, 同时在cmd里运行 hugo server(不能是wsl, 因为这样无法实时监视网站的变化!) 把文章的 draft: true 改为 false. 打开我的wsl, 运行命令 rsync -avz --delete public/ ubuntu@121.4.46.163:/var/www/haruhi.com.cn 输入密码. 如果发现bug, 再ssh到我的服务器, 在vsc中尝试修改. 其间包含若干次输入密码. 为了简化这两个过程, 我决定: 让我自己每次不用再输入密码. 让我可以在(cmd)命令行里无痛推送我的文章. 1很简单, 只需要配置ssh的免密登录即可. 我们在wsl中运行命令ssh-keygen -t rsa -b 4096, 生成一个新的密钥对. 然后运行命令 ssh-copy-id ubuntu@121.4.46.163 将公钥推送至服务器. 再将密钥复制至windows的.ssh文件夹中. cp ~/.ssh/id_rsa /mnt/c/Users/你的用户名/.ssh/id_rsa 这样, 无论是在wsl还是cmd中, 我们都做到了无痛登录. 但是, rsync -avz --delete public/ ubuntu@121.4.46.163:/var/www/haruhi.com.cn 这条命令实在是太长了. 因此我们让ai帮忙写一个sh脚本 #!/bin/bash echo ">>> 1. 开始构建 Hugo 网站..." hugo # 检查hugo命令是否成功 if [ $? -eq 0 ]; then echo ">>> 2. Hugo 构建成功!开始 rsync 同步..." rsync -avz --delete public/ ubuntu@121.4.46.163:/var/www/haruhi.com.cn echo ">>> 3. 同步完成!网站已成功部署。" else echo ">>> Hugo 构建失败,请检查错误!" exit 1 fi 由于我们打开cmd比打开wsl稍显快捷, 我们再写一个bat 脚本. ...

October 19, 2025

关于网站问题的实验

在部署网站初期的过程中, 我发现了这样一个问题: 在运行命令 hugo 和 命令 hugo server 后, 在 http://localhost:1313/posts/ 里可以看到完整并且正常渲染数学公式的文章内容, 但是在网页端无法看到, 并且显示了 这样的字样. 我在观察了主页的index.html后, 发现其中有这样的一段代码. <a href="http://localhost:55781/" accesskey="h" title="Haruhi的博客 (Alt + H)">Haruhi的博客</a> 于是猜想是不是因为疏忽把文章重定向到了本地端口. 于是我转向本地的public文件夹, 发现其仍然指向本地端口. 我们试着运行hugo重新构建这个文件夹. 惊讶地发现, 代码变成了http://haruhi.com.cn/. 通过询问ai, 我发现hugo 和 hugo server 是两种不同的命令. 前者是构建一个可以直接部署在服务器上的public文件夹, 而后者则是生成一个本地版的public 文件夹. 我原来认为hugo server 只是把public部署在本地服务器上, 这个想法是错误的. 因此解决方法是: 在测试时使用hugo server, 而在正式部署前额外运行一次hugo. 这个问题解决了, 但于此同时又出现了新的问题: 图片无法在网页中显示. 如下: 在手动检查了服务器端的html文件后, 我们神奇地发现其似乎指向了一个不存在的png 文件, 于是再次构建提交后, 问题解决了. 至此, 我们的网站终于完成了最基础的显示图片, 显示 $\LaTeX$ 的功能了.下一篇文章, 我将阐述我是如何简化构建过程的.

October 18, 2025

最终完整测试

你好. 你好1 世界上只有一种英雄主义. print('难道这就是你分手的借口?') $$ \int^a_b f(x)dx $$ $\omega$ 我是狗

October 17, 2025

Test2

3号测试.

October 17, 2025

How Does This Website Work

大家好, 我是大狗大狗叫叫叫.

October 16, 2025

Hello World

这是一个测试.

October 16, 2025