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