<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>pyl</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://www.pylindex.top/blog/</id>
  <link href="https://www.pylindex.top/blog/" rel="alternate"/>
  <link href="https://www.pylindex.top/blog/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, pyl</rights>
  <title>Null's blog</title>
  <updated>2026-07-05T09:50:01.148Z</updated>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<blockquote><p>从<a href="/blog/posts/23f12bf5/">前文</a>继续。</p></blockquote><p>前段时间博客关了，而且也没什么时间去写之前那个中国芯比赛的后续。今天用hexo重建了一下，迁移了点以前的东西，就顺便把这个后续也写了。<br>离那一次去大连已有大约9个月了，记忆略微模糊，只能跟着当时的照片来回忆一下了。在正式讲述之前，我先要说说前情提要。</p><hr><p>在收到比赛通知的前几个月，正值八年级的初中黄金时段，万般风貌，空闲时间不少。我参加的是个学剪辑的社团，教的都是我认识的信息老师们。由于我接触编程比较早，便给人一种天赋较好的假象，早在七下左右就参加了机器人的比赛，虽只拿了省二等奖未进国赛，但也算是见了世面并且给这些老师留下了好印象。就在这时，有个叫“xx省（xx市）xx编程大赛”的，就是纯python，像刷leetcode一样那种，我好奇，就去了。<br>市赛的题目有点难度但不多，我现在只记得两道，一个是用turtle画图的，一个是最后一个得用DFS（海岛种树填湖之类的这种，后来才知道很烂大街的题目）。这属实到了我能力范围之外的，前面那些常识和if、循环我还能应付应付，这些对我这个Vibe Coding专业选手（我还是最早开始使用cc的，当时好像才sonnet 3.7，我注册anyrouter白嫖claude，还疯狂创建github小号并自己拉自己，那时候是好时候，github没啥注册限制，域名邮箱都可以，any也没有限制，我一口气刷了1k多刀，今年才蹬完）实在有点难以应付。于是我灵机一动，发挥优良传统，施展技术才能，直接开始搜索引擎查找“免费chatgpt gpt chatgpt中文网 chatgpt镜像站 claude gemini free”。算那边的人员有点脑子，屏蔽了百度，但是我cn.bing.com完全正常。我直接搜到了一个神秘小网站，把复制的题目丢进去，直接点击回车，对了，别忘记点上thinking，然后飞速的，答案就出来了。再次劳驾一下我的手按下ctrl+v，复制粘贴到比赛系统里，提交。完美！同时，我还用亲爱的必应检查了一下前面一堆常识题的答案，然后不负众望众望所归的拿了市一等奖，直接晋级省赛。</p><p>市赛的经验让我意识到这几点：万一断网就玩完了；搜不到ai网站就玩完了（我忘记把url记下来了！大失误大失误）。那我只能来点下下策了。毕竟写过点项目，底子在这，直接开学！先硬把DFS、BFS这些重要东西学会（当时是会了，现在彻底沉浸gpt&#x2F;claude构筑的乌托邦里了，项目倒是写了不少，star倒是拿了不少，算法倒是退步了不少），然后开始——找ai网站。经过一番搜寻，我找到了metaso.cn这个ai搜索，有思考有搜索，网址好记忆，完美！我把它仔细记下，当作备选方案，心里也有了底。<br>到了省赛（在江对岸的xx市，坐个轮渡过去，很美好的体验），题目难度反而还没市赛大！前面没有任何难点（在我看来，我看旁边同学都被难住了，20道编程题都没做完一半），倒数第二题由于忘带草稿纸，我只能在那个写代码的系统里面推式子（貌似正确方法是用代码写if和循环之类的，但是我爱数学！），成功解决。最后一题挺新颖，是个什么图像识别的问题，我回忆一下题目：给定一个大的数组，由0、1组成，和一个小数组，要把这个数组覆盖到大数组上，然后给出最大重合1的数量（黑白块，而且有点像CNN里面那个卷积核之类的）。我一开始尝试用一堆循环解决，但是不太成功，于是我打开metaso.cn，输入题目描述，回车，对了，别忘记勾上深度思考，答案直接出来了！我直接复制粘贴run一气呵成，绿啦！无可厚非的省一等奖，直接完美收官（这个比赛是有浏览器页内录屏的，但是我常年网上冲浪，chrome可再熟悉不过了！开个新窗口，他能录到算我输！监考也是个麻烦，我只能一只眼睛放哨一只眼睛看屏幕，加上高速Alt+Tab，也是完美避免了）（还有件好玩的事，旁边那位貌似也搞过代码，就是有点神经质，在考试机上装vscode和python，然后试图运行一个奇怪的脚本，是什么我忘了，然后要用到pip，但是好像不怎么会用shell，至少在pwsh上像个智障，装python还没加path，直接写路径还报错，比如这种：”C:\Users\xxx\xxx\xxx\…\pip.exe” install xxx，报错，试了好久还不停问监考老师，感觉监考老师快翻白眼了，明明前面加个<code>&amp;</code>就能解决的，一直折腾到开始比赛还没好）。总的来说，这次在xxxx职业技术学院的比赛真是欢乐与笑容并存，十分美好。</p><p>现在回想，我的这两个一等奖或许真的是巧合。当年貌似是deepseek r1左右，思考模型还比较少见，但是已经出现，LLM的智力跃升已经不远（opus 4&#x2F;gpt 5&#x2F;gemini 2.5&#x2F;3 pro貌似还没出现？）所以对此方面的防范也比较少。可以说，没有这一切的巧合堆起来，就没有这几个奖。说到vibe coding，我倒是最早使用的一批。我在小学五、六年级接触到gpt 3.5并开始利用它写作文（连小学毕业前的最后一篇也是gpt 3.5写的），并在同一时期（此时AGI霞光初显）接触到了编程。在很早的时候我就像现在的人到处疯狂找claude code、codex中转站一样，我也是找并找到了很多免费用gpt 3.5&#x2F;4的网站，然后开始了AI写代码的生涯。当时还是Web Chat，但是极大的激发了我的兴趣和潜力，但凡我早一点都不会坚持下去因为太困难，晚一点没有资源也是一样的结果。在一段漫无目的之后，我开始写一个项目，好像是一个登录、管理之类的，并在初一、二左右彻底毕业了python语法，并且写（魔改）了几个自己的项目，比如nano-gpt改的古诗词生成系统，学生管理等等练手的项目（交上去还能混几个市一等奖，就是没啥用罢了）。然后接触到了cursor这类，超脱了WebChat拥有了更高的效率。为了进一步提升自己，找了几个开源项目写写pr，并且极大提升了水平、接触了cli工具、思想更加前卫（像我这样把绝大多数代码丢给ai，自己只做架构设计和功能提出，连审核都丢给自动化ai审核的AI阶级维新派「清末李鸿章史称资产阶级维新派，而我这人虽只是苍茫浪潮里的水分子，但且给自己编个派系」极少，大多都不敢，但是经过我的实践没有丝毫问题，效率倒是能成倍翻），并且维护了自己的项目。这些都会在即将到来的初三毕业暑假详细叙述（如果想的起来），这里仅做初回顾。</p><hr><p>比较长的前情告一段落，让我们随着航班到达美丽的大连海畔。（以下均为看着照片回忆）2025年7月30日23时46分，少年激动的心时速超过了飞机，提前降落了到前方已经近在咫尺的大连国际机场。<img src="https://image.fatcattech.cn/i/2026/05/16/10ixxeg.jpg" alt="飞机俯视海滨" decoding="async" loading="eager" fetchpriority="high">次日，到了海边的一个广场（前面忘了名字忘了反正挺晒的），太阳辣辣海鸥翱翔白浪翻涌，乃人生头回见如此美丽的海边。<img src="https://image.fatcattech.cn/i/2026/05/16/10ixwmv.jpg" alt="海边，日光" decoding="async" loading="lazy" fetchpriority="auto">由于走太多，回宾馆养精蓄锐。新月1日，跟着一个旅行团，跨过跨海大桥，<img src="https://image.fatcattech.cn/i/2026/05/16/10ixxlt.jpg" alt="跨海大桥海景" decoding="async" loading="lazy" fetchpriority="auto">心情澎湃，转眼驱车进入动物园，东南沿海人第一次见散养老虎、<img src="https://image.fatcattech.cn/i/2026/05/16/10ixxsb.jpg" alt="老虎" decoding="async" loading="lazy" fetchpriority="auto">纯正鸵鸟、正宗黑熊、地道山羊！真是激动涕零，俄而至又一海边，买上火腿肠，套上救生衣，给海中央的海鸥带来了大自然的馈赠，下了船到旁边买一蒸笼的海鲜，满满幸福！<img src="https://image.fatcattech.cn/i/2026/05/16/10ixynn.jpg" alt="海鲜" decoding="async" loading="lazy" fetchpriority="auto">（之后还去看了个印象旅顺，爱国主义教育拉满了，就是太困了，纯纯历史课，像是五猖会父亲让讯哥儿背的鉴略，在脑内留不下半点痕迹，在此不详提）回到市区（？暂且这么定义，我也不清楚），到了一个大广场，正好有个啤酒节。啤酒我是没什么兴趣，倒是买了一大包M豆，然后两天吃完了。夜幕降临之后（19:30）开始了大桥灯光秀，那座跨海大桥突然散出熠熠光辉，照耀着人山人海，也在我心里留下了熠熠光辉。<br>2号，参加比赛。摄影资料较少，仅靠脑内回忆了。貌似是在开发区的一个产业园内一块大地方，进去先是消费，小吃街一样不过是室内的,我买了个炸鸡全当中午饭（以后念念不忘，回来之后还在加点上一包炸鸡，勾上蜂蜜芥末酱，仿佛能短暂地带我回到那个晴朗的夏日）。随后排了一个长队，到里面领上号牌，等了一会。这时候，我看到旁边都是一些看上去比小学生还小的学生，结果手上拿着城市模型你敢信！我当时就懵逼了，转念一想，好嘛，这个比赛纯纯水货，果然便宜没好货，免费来看一堆小学生拿着花几万报的小课班在老师指导下做的作品获奖（这是我从同校另一位选手听来的，他当时是初一，省赛是个什么happycoding，也拿了一等奖被推荐过来「这个比赛不是省赛的延续，但是省赛拿了一等奖可以免初赛、复赛等直接进入决赛且省（复）赛自动一等奖」，他买了个倒车雷达成品，花了700多「我哭笑不得，花了30做的东西来看他们神仙打架来着的」，结果他的答辩老师说是这都是他们<strong>培训班</strong>的入门水平，小学<strong>二年级</strong>做的，天啊，GENIUS！）。到了我，结局不必多说，评委说我这作品太简单了，虽然立意够深、愿景够好，但是终究不够复杂（比不上他们的微缩版城市模型——这当然！我一个纯纯折腾后端python的，哪里搞的起来这种层面的硬件技术！况且我的钱、我家里的钱也不允许啊）。后来去看，三等奖，也是意外之喜了，不过结局不太重要，重要的是这次宝贵的经历、硬件的接触和大连的优美风光！（我这样在东南沿海不沿海城市的人，一辈子没怎么旅游，就这么几次：越南、西安、北京、大连，没了，看世界极少，导致小镇做题家风貌显现，还好我及时将更多精力投入编程防止变成做题呆子；教育内卷，疯狂报课，我们班加上我只有区区3人未上补习班；更有甚者一周6节晚上11点多才到家，惨痛不堪！难以想象！很多人只知道豆包、抖音、刷视频，对技术的忽视，家长对电脑的恶毒看法，无一不在扼杀着一个个希望！）结束之后，已而夕阳在山，人影散乱，海风吹过，前往宾馆下的饭店吃顿地道东北菜，又去海边看看海景，有种人生圆满的感觉。3日，上午去了一个极大的院子，看到了从未看到可能将来很少看到的的极地生物比如北极熊、企鹅，海里的王八、鱼们，表演的海豚、<img src="https://image.fatcattech.cn/i/2026/05/16/10ixsmn.jpg" alt="海豚" decoding="async" loading="lazy" fetchpriority="auto">室外的鸟、大鹦鹉、<img src="https://image.fatcattech.cn/i/2026/05/16/10ixsd6.jpg" alt="鹦鹉" decoding="async" loading="lazy" fetchpriority="auto">鸭子、缆车（是不是混入了什么奇怪的东西）、叫不上名字的长脖子白羽毛的鸟，打开眼界，精彩纷呈。下午，坐着飞机离开了美丽的大连。Ade，美丽活泼的动物们，Ade，洪波涌起的海浪们！（次日下午，还看到了彩虹）<img src="https://image.fatcattech.cn/i/2026/05/16/10ixpb6.jpg" alt="彩虹" decoding="async" loading="lazy" fetchpriority="auto"></p><hr><p>欢乐、美好，除此、无他！多年以后我可能会想起那个海风阵阵的夏日，那有着遗憾的比赛。<br>部落格重建，以后的叙事会偏向平实，并对往事做出回顾。在毕业后的暑假，我计划对我的童年及义务教育阶段的人生做一次全面的回顾、思考、记录。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/388522f1/</id>
    <link href="https://www.pylindex.top/blog/posts/388522f1/"/>
    <published>2026-05-16T11:38:23.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>从<a href="/blog/posts/23f12bf5/">前文</a>继续。</p>
</blockquote>
<p>前段时间博客关了，而且也没什么时间去写之前那个中国芯比赛的后续。今天用hexo重建了一下，迁移了点以前的东西，就顺便把这]]>
    </summary>
    <title>我是AI阶级维新派——参赛后日谈</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>选择一看很简单，欲写古诗已忘言。林彪贺龙有何联？<br>阅读理解哪座桥，作文介绍不知道。一百马上就跑掉。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/c7d02a56/</id>
    <link href="https://www.pylindex.top/blog/posts/c7d02a56/"/>
    <published>2025-12-09T00:24:13.000Z</published>
    <summary>
      <![CDATA[<p>选择一看很简单，欲写古诗已忘言。林彪贺龙有何联？<br>阅读理解哪座桥，作文介绍不知道。一百马上就跑掉。</p>]]>
    </summary>
    <title>浣溪沙·语文期末</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>日出鸡才鸣，校园人满盈。<br>人人都背诵，句句都惊心。<br>铃声随乐动，师无动如初。<br>出门两旁望，无人泪汪汪。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/94d738e4/</id>
    <link href="https://www.pylindex.top/blog/posts/94d738e4/"/>
    <published>2025-09-18T00:24:13.000Z</published>
    <summary>
      <![CDATA[<p>日出鸡才鸣，校园人满盈。<br>人人都背诵，句句都惊心。<br>铃声随乐动，师无动如初。<br>出门两旁望，无人泪汪汪。</p>]]>
    </summary>
    <title>江南望</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>青门缓开手颤抖，红光闪过眼球抬。<br>轻声缓步走进去，地狱无门闯进来。<br>阳光闪光耀键盘高，无言以对盯着看。<br>心理战术总有用，低垂头颅终是败。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/84ad2d32/</id>
    <link href="https://www.pylindex.top/blog/posts/84ad2d32/"/>
    <published>2025-08-18T11:25:28.000Z</published>
    <summary>
      <![CDATA[<p>青门缓开手颤抖，红光闪过眼球抬。<br>轻声缓步走进去，地狱无门闯进来。<br>阳光闪光耀键盘高，无言以对盯着看。<br>心理战术总有用，低垂头颅终是败。</p>]]>
    </summary>
    <title>死门学生行</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>周末放假试卷多，考试全差。一看五九，激起竹竿阵阵炸。  上课轻困微风来，睁眼微观。惊出冷汗，班任盯着你看。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/899a6446/</id>
    <link href="https://www.pylindex.top/blog/posts/899a6446/"/>
    <published>2025-07-19T09:18:13.000Z</published>
    <summary>
      <![CDATA[<p>周末放假试卷多，考试全差。一看五九，激起竹竿阵阵炸。  上课轻困微风来，睁眼微观。惊出冷汗，班任盯着你看。</p>]]>
    </summary>
    <title>采桑子·数学</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<h1 id="物流毕，快递一"><a href="#物流毕，快递一" class="headerlink" title="物流毕，快递一"></a>物流毕，快递一</h1><p>等待两天后，快递终于到齐了。实际的操作完全比我想象的简单需要，在网上找几个引脚图，然后一个个接上去就行了。然后再找几个示例，拼接一下代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ------------------- 1. 引入库 -------------------</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SPI.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;MFRC522.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;SoftwareSerial.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;DFRobotDFPlayerMini.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 2. 定义引脚和常量 -------------------</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RST_PIN 9</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> SS_PIN  10</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 3. 创建对象实例 -------------------</span></span><br><span class="line"><span class="function">MFRC522 <span class="title">mfrc522</span><span class="params">(SS_PIN, RST_PIN)</span></span>;</span><br><span class="line"><span class="function">SoftwareSerial <span class="title">mySoftwareSerial</span><span class="params">(<span class="number">2</span>, <span class="number">3</span>)</span></span>; <span class="comment">// RX, TX</span></span><br><span class="line">DFRobotDFPlayerMini myDFPlayer;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 4. 定义全局变量 -------------------</span></span><br><span class="line">String lastCardUID = <span class="string">&quot;&quot;</span>; <span class="comment">// 用于存储上一个触发播放的卡片UID，防重复的关键</span></span><br><span class="line"><span class="type">bool</span> dfPlayerInitialized = <span class="literal">false</span>; </span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 5. setup() 初始化函数 (保持不变) -------------------</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  Serial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  <span class="keyword">while</span> (!Serial);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// --- 步骤一: 初始化并检查 MFRC522 ---</span></span><br><span class="line">  SPI.<span class="built_in">begin</span>();</span><br><span class="line">  mfrc<span class="number">522.</span><span class="built_in">PCD_Init</span>();</span><br><span class="line">  byte version = mfrc<span class="number">522.</span><span class="built_in">PCD_ReadRegister</span>(mfrc<span class="number">522.</span>VersionReg);</span><br><span class="line">  <span class="keyword">if</span> (version == <span class="number">0x00</span> || version == <span class="number">0xFF</span>) &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;错误: MFRC522 通信失败! 请检查接线。程序已停止。&quot;</span>));</span><br><span class="line">    <span class="keyword">while</span> (<span class="number">1</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;MFRC522 模块通信正常!&quot;</span>));</span><br><span class="line"></span><br><span class="line">  <span class="comment">// --- 步骤二: 初始化并检查 DFPlayer ---</span></span><br><span class="line">  mySoftwareSerial.<span class="built_in">begin</span>(<span class="number">9600</span>);</span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;正在初始化 DFPlayer Mini 模块...&quot;</span>));</span><br><span class="line">  <span class="keyword">if</span> (myDFPlayer.<span class="built_in">begin</span>(mySoftwareSerial)) &#123;</span><br><span class="line">    dfPlayerInitialized = <span class="literal">true</span>;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;DFPlayer 初始化成功!&quot;</span>));</span><br><span class="line">    myDFPlayer.<span class="built_in">volume</span>(<span class="number">20</span>);</span><br><span class="line">    myDFPlayer.<span class="built_in">EQ</span>(DFPLAYER_EQ_NORMAL);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    dfPlayerInitialized = <span class="literal">false</span>;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;DFPlayer 初始化失败! 请检查接线和SD卡。&quot;</span>));</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  Serial.<span class="built_in">println</span>(<span class="built_in">F</span>(<span class="string">&quot;\n系统准备就绪，请刷卡...&quot;</span>));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 6. loop() 主循环函数 (已修复) -------------------</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  <span class="comment">// --- 步骤一: 检测是否有新的NFC卡片靠近 ---</span></span><br><span class="line">  <span class="comment">// 如果没有检测到新卡，就将 lastCardUID 清空，这是允许卡片移除后再次触发的关键</span></span><br><span class="line">  <span class="keyword">if</span> (!mfrc<span class="number">522.</span><span class="built_in">PICC_IsNewCardPresent</span>()) &#123;</span><br><span class="line">    lastCardUID = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// --- 步骤二: 尝试读取卡片序列号 ---</span></span><br><span class="line">  <span class="comment">// 如果成功检测到但读取失败（比如卡片移动太快），也直接返回</span></span><br><span class="line">  <span class="keyword">if</span> (!mfrc<span class="number">522.</span><span class="built_in">PICC_ReadCardSerial</span>()) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// --- 步骤三: 格式化读取到的 UID ---</span></span><br><span class="line">  String currentCardUID = <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="keyword">for</span> (byte i = <span class="number">0</span>; i &lt; mfrc<span class="number">522.</span>uid.size; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (mfrc<span class="number">522.</span>uid.uidByte[i] &lt; <span class="number">0x10</span>) &#123;</span><br><span class="line">      currentCardUID += <span class="string">&quot;0&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    currentCardUID += <span class="built_in">String</span>(mfrc<span class="number">522.</span>uid.uidByte[i], HEX);</span><br><span class="line">    <span class="keyword">if</span> (i &lt; mfrc<span class="number">522.</span>uid.size - <span class="number">1</span>) &#123;</span><br><span class="line">      currentCardUID += <span class="string">&quot; &quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  currentCardUID.<span class="built_in">toUpperCase</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// --- 步骤四: 防重复播放的核心判断 ---</span></span><br><span class="line">  <span class="comment">// 只有当 当前卡片的UID 与 上次触发播放的UID 不同时，才执行操作</span></span><br><span class="line">  <span class="keyword">if</span> (currentCardUID != lastCardUID) &#123;</span><br><span class="line">    Serial.<span class="built_in">print</span>(<span class="string">&quot;检测到新标签 UID: &quot;</span>);</span><br><span class="line">    Serial.<span class="built_in">println</span>(currentCardUID);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 更新 lastCardUID 为当前卡的 UID，防止下次循环重复触发</span></span><br><span class="line">    lastCardUID = currentCardUID;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 检查DFPlayer并播放音频</span></span><br><span class="line">    <span class="keyword">if</span> (dfPlayerInitialized) &#123;</span><br><span class="line">      <span class="built_in">playAudioForCard</span>(currentCardUID);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      Serial.<span class="built_in">println</span>(<span class="string">&quot;检测到标签，但 DFPlayer 尚未就绪，无法播放。&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// --- 步骤五: 让卡片休眠 ---</span></span><br><span class="line">  <span class="comment">// 虽然上面的逻辑已经能防重复，但调用 HaltA 是一个好习惯，</span></span><br><span class="line">  <span class="comment">// 它可以立即让当前卡片进入不活跃状态，使读卡器的状态管理更清晰。</span></span><br><span class="line">  mfrc<span class="number">522.</span><span class="built_in">PICC_HaltA</span>();</span><br><span class="line">  mfrc<span class="number">522.</span><span class="built_in">PCD_StopCrypto1</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ------------------- 7. playAudioForCard() 自定义函数 (保持不变) -------------------</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">playAudioForCard</span><span class="params">(String uid)</span> </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (uid == <span class="string">&quot;1D 93 C7 0D 0D 10 80&quot;</span>) &#123;</span><br><span class="line">    myDFPlayer.<span class="built_in">playMp3Folder</span>(<span class="number">1</span>);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;正在播放: 音频1&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (uid == <span class="string">&quot;1D 92 C7 0D 0D 10 80&quot;</span>) &#123;</span><br><span class="line">    myDFPlayer.<span class="built_in">playMp3Folder</span>(<span class="number">2</span>);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;正在播放: 音频2&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (uid == <span class="string">&quot;1D 91 C7 0D 0D 10 80&quot;</span>) &#123;</span><br><span class="line">    myDFPlayer.<span class="built_in">playMp3Folder</span>(<span class="number">3</span>);</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;正在播放: 音频3&quot;</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    Serial.<span class="built_in">println</span>(<span class="string">&quot;未识别的标签&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后往TF卡里面放一些TTS的音频，就完美解决了。唯一不足的地方就是RFID-RC522模块还需要焊一下。成品：<br><img src="https://image.fatcattech.cn/i/2026/05/16/sg6rk0.jpg" alt="成品" decoding="async" loading="eager" fetchpriority="high"></p><h1 id="后续改进"><a href="#后续改进" class="headerlink" title="后续改进"></a>后续改进</h1><p>我还买了几个2.4GHz的射频模块，但是需要3.3V的电压。Arduino上的接口不够了，所以我还额外买了一个5V-&gt;3.3V的降压模块。这家发货真的快，1h之内就发了，所以我明天就得看是研究无线电了。</p><h1 id="额外彩蛋"><a href="#额外彩蛋" class="headerlink" title="额外彩蛋"></a>额外彩蛋</h1><p>那几个NFC贴纸还很多，我在手机上用一个叫<code>NFC Writer</code>的软件写了点东西进去，比较好玩的是写一点应用启动。包名推荐：</p><ul><li><code>com.netease.dwrg.mi</code></li><li><code>com.MiHoYo.ys.mi</code><blockquote><p>我也不知道为什么必须要加<code>.mi</code>后缀，如果不加我的手机搜不到（vivo&#x2F;iQOO）</p></blockquote></li></ul><p>或者你也可以写入一个URL：</p><ul><li><a href="http://www.pylindex.top/rick/">http://www.pylindex.top/rick/</a></li></ul><p>明天看看能不能忽悠几个人来试试水。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>比赛的就这么多，看来比较简单，估计拿个安慰奖。不过我实在不想再耗费脑细胞了，所以就看Gemini的文字功底了，看看它写的介绍能达到什么高度。拿到降压模块我可能还会改进改进，会的话下回再说。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/23f12bf5/</id>
    <link href="https://www.pylindex.top/blog/posts/23f12bf5/"/>
    <published>2025-07-16T02:06:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="物流毕，快递一"><a href="#物流毕，快递一" class="headerlink" title="物流毕，快递一"></a>物流毕，快递一</h1><p>等待两天后，快递终于到齐了。实际的操作完全比我想象的简单需要，在网上找几个引脚图，然后一个个接上去就]]>
    </summary>
    <title>
      <![CDATA[Arduino->不要啦！]]>
    </title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<h1 id="山重水复疑无路"><a href="#山重水复疑无路" class="headerlink" title="山重水复疑无路"></a>山重水复疑无路</h1><p>为了参加那个莫名奇妙被推荐过去的<em>中国‘芯’助力中国梦——全国青少年通信科技创新大赛</em>，我得麻烦一下我的钱包。比赛规则中要求必须使用国产的开发板，所以我还麻烦了我暑假里宝贵的脑细胞想一想应该买什么开发板。一开始我买的是火龙果的一个单片机开发板，然后这个3天不发货，我点进去一看，霍！店铺已打烊！我直接退款举报一套小连招外加马上打开咸鱼。<br>咸鱼上看了半天，选定了一款ch340g国产芯片的Arduino UNO。卖家说好的第二天上午发货，我晚上问他，他说忘掉了，正式气煞我也。50块钱，说好的给我发6片，又说忘了，只给我了5片，还好知道补发。</p><h1 id="曲折终见Arduino"><a href="#曲折终见Arduino" class="headerlink" title="曲折终见Arduino"></a>曲折终见Arduino</h1><p>到货已经4天，不过效果非常好。让Gemini给我写了几行亮灯的代码，然后跟着B站一个教程配置好了CLion，C++写起来也比较轻松，不像那个汇编，写着左脑感觉这玩意太抽象，右脑觉得这玩意不能给我点抽象层吗？</p><h1 id="我也只能亮个灯"><a href="#我也只能亮个灯" class="headerlink" title="我也只能亮个灯"></a>我也只能亮个灯</h1><p>我想该做些什么的时候，偶然间想起了《百年孤独》里面那个失忆的村子，不是贴标签吗，我就<strong>一拍即合</strong>，打算用NFC实现类似效果，具体的价值见下<del>Claude写的</del>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">近年来，我国人口老龄化加速，阿尔茨海默病患者数量持续增长。患者常常无法识别身边的人和物，给家庭带来沉重负担。本项目设计了一款基于Arduino和NFC技术的交互式语音记忆盒子，通过&quot;触碰即播放&quot;的简单交互，帮助患者唤醒记忆。项目选用国产YX5200语音芯片，实现了高性价比的解决方案。经测试，系统响应迅速、操作简单，特别适合认知能力下降的老年人使用。</span><br></pre></td></tr></table></figure><p>于是我光速去买配件：</p><table><thead><tr><th>元件名称</th><th>备注</th></tr></thead><tbody><tr><td>MFRC522</td><td>NFC读写模块</td></tr><tr><td>DFPlayer Mini</td><td>语音播放模块</td></tr><tr><td>NFC标签贴纸</td><td>NTAG213芯片</td></tr><tr><td>Micro SD卡</td><td>1GB</td></tr><tr><td>面包板 &amp; 杜邦线</td><td>连接套装</td></tr><tr><td>迷你音箱</td><td>2W 8欧姆</td></tr><tr><td>SI24R1</td><td>2.4G射频模块</td></tr></tbody></table><p>买完之后，就只能等了，现在只能对着板子上仅有的一盏灯看了。剩下的等我东西到了再来叙述。</p><p><strong>预知后事如何，且听下回<del>再吹</del>分解</strong></p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/b02665a2/</id>
    <link href="https://www.pylindex.top/blog/posts/b02665a2/"/>
    <published>2025-07-14T06:03:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="山重水复疑无路"><a href="#山重水复疑无路" class="headerlink" title="山重水复疑无路"></a>山重水复疑无路</h1><p>为了参加那个莫名奇妙被推荐过去的<em>中国‘芯’助力中国梦——全国青少年通信科技创新大赛</em>]]>
    </summary>
    <title>
      <![CDATA[Arduino<-让我看看！]]>
    </title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<h1 id="今天心血来潮学了汇编，以下记录学到的知识"><a href="#今天心血来潮学了汇编，以下记录学到的知识" class="headerlink" title="今天心血来潮学了汇编，以下记录学到的知识"></a>今天心血来潮学了汇编，以下记录学到的知识</h1><h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><p><code>extern</code> 引用外部函数：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">extern ExitProcess</span><br><span class="line">extern WriteConsoleA</span><br><span class="line">extern GetStdHandle</span><br></pre></td></tr></table></figure><p><code>section .data</code> 标志初始化变量段</p><p>初始化变量格式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">var1 db &lt;var_data&gt;</span><br><span class="line">msg db &#x27;Hello, World&#x27;, 0xA ;0xA是换行符</span><br><span class="line"></span><br><span class="line">var2 equ &lt;expression&gt;</span><br><span class="line">msg_len equ $ - msg ;表示msg变量的长度</span><br></pre></td></tr></table></figure><p><code>section .text</code> 标志可执行代码段</p><p><code>_start</code> 代表程序入口点</p><h2 id="常用指令"><a href="#常用指令" class="headerlink" title="常用指令"></a>常用指令</h2><h3 id="数据传送指令"><a href="#数据传送指令" class="headerlink" title="数据传送指令"></a>数据传送指令</h3><p><code>mov</code> 指令用于在寄存器之间或寄存器与内存之间移动数据。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mov rax, 100 ; 将立即数 100 移动到 rax 寄存器</span><br><span class="line">mov rbx, rax ; 将 rax 寄存器的值复制到 rbx 寄存器</span><br></pre></td></tr></table></figure><h3 id="算术运算指令"><a href="#算术运算指令" class="headerlink" title="算术运算指令"></a>算术运算指令</h3><ul><li><code>add</code>: 加法</li><li><code>sub</code>: 减法</li><li><code>inc</code>: 递增</li><li><code>dec</code>: 递减</li><li><code>xor</code>: 异或 (常用于将寄存器清零)</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">mov rax, 100</span><br><span class="line">add rax, 50  ; rax = 150</span><br><span class="line">sub rax, 25  ; rax = 125</span><br><span class="line">inc rax      ; rax = 126</span><br><span class="line">dec rax      ; rax = 125</span><br><span class="line">xor rcx, rcx ; rcx = 0</span><br></pre></td></tr></table></figure><h3 id="比较与跳转指令"><a href="#比较与跳转指令" class="headerlink" title="比较与跳转指令"></a>比较与跳转指令</h3><ul><li><code>cmp</code>: 比较两个操作数，并根据结果设置标志位。</li><li><code>jmp</code>: 无条件跳转。</li><li><code>jne</code>: 如果不相等则跳转 (jump if not equal)。</li><li><code>jle</code>: 如果小于或等于则跳转 (jump if less or equal)。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">; if-else 结构</span><br><span class="line">mov rax, 10</span><br><span class="line">mov rbx, 20</span><br><span class="line">cmp rax, rbx</span><br><span class="line">jne else_block ; 如果 rax != rbx, 跳转到 else_block</span><br><span class="line"></span><br><span class="line">if_block:</span><br><span class="line">    mov rcx, 1</span><br><span class="line">    jmp end_if</span><br><span class="line"></span><br><span class="line">else_block:</span><br><span class="line">    mov rcx, 99</span><br><span class="line"></span><br><span class="line">end_if:</span><br><span class="line">    ; ...</span><br><span class="line"></span><br><span class="line">; 循环结构</span><br><span class="line">mov rcx, 1</span><br><span class="line">loop_start:</span><br><span class="line">    ; ... 循环体 ...</span><br><span class="line">    inc rcx</span><br><span class="line">    cmp rcx, 10</span><br><span class="line">    jle loop_start ; 如果 rcx &lt;= 10, 跳转到 loop_start</span><br></pre></td></tr></table></figure><h2 id="函数与调用约定"><a href="#函数与调用约定" class="headerlink" title="函数与调用约定"></a>函数与调用约定</h2><h3 id="函数定义与调用"><a href="#函数定义与调用" class="headerlink" title="函数定义与调用"></a>函数定义与调用</h3><p>一个典型的函数包含函数序言、函数体和函数尾声。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">; 定义一个函数</span><br><span class="line">AddTwoNumbers:</span><br><span class="line">    ; 函数序言 (Function Prologue) - 建立栈帧</span><br><span class="line">    push rbp            ; 保存调用者的基指针</span><br><span class="line">    mov rbp, rsp        ; 建立我们自己的基指针</span><br><span class="line"></span><br><span class="line">    ; 函数体 (Function Body)</span><br><span class="line">    ; 参数已经由调用者放在了 rcx 和 rdx 中</span><br><span class="line">    mov rax, rcx        ; 把第一个参数 (a) 放入 rax</span><br><span class="line">    add rax, rdx        ; rax = rax + 第二个参数 (b)</span><br><span class="line">    ; 现在计算结果 (a+b) 已经按约定存放在了 rax 中</span><br><span class="line"></span><br><span class="line">    ; 函数尾声 (Function Epilogue) - 恢复栈帧</span><br><span class="line">    mov rsp, rbp        ; 释放局部变量空间 (我们这里没有)</span><br><span class="line">    pop rbp             ; 恢复调用者的基指针</span><br><span class="line">    ret                 ; 返回！(跳转到 call 指令留下的返回地址)</span><br><span class="line"></span><br><span class="line">; 调用函数</span><br><span class="line">mov rcx, 50 ; 第一个参数</span><br><span class="line">mov rdx, 25 ; 第二个参数</span><br><span class="line">call AddTwoNumbers</span><br><span class="line">; 返回值在 rax 中</span><br></pre></td></tr></table></figure><h3 id="参数传递与返回值-x64-Windows-调用约定"><a href="#参数传递与返回值-x64-Windows-调用约定" class="headerlink" title="参数传递与返回值 (x64 Windows 调用约定)"></a>参数传递与返回值 (x64 Windows 调用约定)</h3><p>在x64 Windows调用约定中，函数参数和返回值的传递有明确的规则：</p><ul><li><strong>参数传递</strong>: 前四个整数或指针参数按从左到右的顺序依次放入 <code>rcx</code>, <code>rdx</code>, <code>r8</code>, <code>r9</code> 寄存器。更多的参数则通过栈传递。</li><li><strong>返回值</strong>: 整数或指针类型的返回值通常存储在 <code>rax</code> 寄存器中。</li></ul><p>在上面的 <code>AddTwoNumbers</code> 例子中：</p><ol><li><code>mov rcx, 50</code> 和 <code>mov rdx, 25</code> 将两个参数放入了正确的寄存器。</li><li>函数内部直接从 <code>rcx</code> 和 <code>rdx</code> 读取参数。</li><li><code>add rax, rdx</code> 的计算结果（返回值）被存放在 <code>rax</code> 中。</li><li>调用 <code>call AddTwoNumbers</code> 之后，主程序通过读取 <code>rax</code> 寄存器来获取函数的返回值。</li></ol><h2 id="栈操作与-sub-rsp-40-的重要性"><a href="#栈操作与-sub-rsp-40-的重要性" class="headerlink" title="栈操作与 sub rsp, 40 的重要性"></a>栈操作与 <code>sub rsp, 40</code> 的重要性</h2><h3 id="栈的基本操作"><a href="#栈的基本操作" class="headerlink" title="栈的基本操作"></a>栈的基本操作</h3><p><code>push</code> 和 <code>pop</code> 用于在函数调用期间保存和恢复寄存器的状态，确保函数调用不会破坏调用者的寄存器。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">; 函数序言中保存基指针</span><br><span class="line">push rbp</span><br><span class="line"></span><br><span class="line">; ...</span><br><span class="line"></span><br><span class="line">; 函数尾声中恢复基指针</span><br><span class="line">pop rbp</span><br></pre></td></tr></table></figure><h3 id="sub-rsp-40-与-Shadow-Space"><a href="#sub-rsp-40-与-Shadow-Space" class="headerlink" title="sub rsp, 40 与 Shadow Space"></a><code>sub rsp, 40</code> 与 Shadow Space</h3><p>在x64 Windows调用约定中，<code>sub rsp, 40</code> 这行代码至关重要。它不仅仅是为局部变量分配空间，更重要的是它遵循了调用约定中的 <strong>Shadow Space</strong> (影子空间) 规则。</p><ul><li><strong>什么是Shadow Space?</strong>: 调用约定规定，当一个函数（调用者）准备调用另一个函数（被调用者）时，它必须在栈上为被调用者预留一块空间。这块空间被称为 “Shadow Space”。在x64 Windows上，这块空间的大小是32字节（可以容纳4个64位寄存器）。</li><li><strong>为什么需要它?</strong>: 这块空间允许被调用函数在不修改自己栈帧的情况下，方便地保存 <code>rcx</code>, <code>rdx</code>, <code>r8</code>, <code>r9</code> 这四个参数寄存器的值。</li><li><strong>为什么是40字节?</strong>: <code>call</code> 指令会将返回地址（8字节）压入栈中。为了保持栈的16字节对齐（这在x64下是推荐的，可以提高性能），并且为32字节的Shadow Space腾出空间，我们需要分配 <code>32 + 8 = 40</code> 字节。<code>sub rsp, 40</code> 正好满足了这个要求，它为即将到来的 <code>call</code> 指令做好了准备。</li></ul><p><strong>总结</strong>: <code>sub rsp, 40</code> 是在函数调用前，为满足x64 Windows调用约定而进行的关键栈操作，它分配了32字节的Shadow Space并确保了栈的对齐。</p><h2 id="Windows-API-调用详解"><a href="#Windows-API-调用详解" class="headerlink" title="Windows API 调用详解"></a>Windows API 调用详解</h2><p>通过 <code>call</code> 指令调用 <code>extern</code> 声明的外部函数。以下是常用API的参数和返回值说明：</p><ul><li><p><strong><code>ExitProcess</code></strong>: 终止当前进程。</p><ul><li><strong>接收值</strong>: <code>rcx</code> - 进程的退出码 (一个32位无符号整数)。<code>0</code> 通常表示成功。</li><li><strong>返回值</strong>: 无。</li></ul></li><li><p><strong><code>GetStdHandle</code></strong>: 获取标准输入、输出或错误设备的句柄。</p><ul><li><strong>接收值</strong>: <code>rcx</code> - 一个指定标准设备的32位整数。常用值包括：<ul><li><code>-10</code>: 标准输入 (STD_INPUT_HANDLE)</li><li><code>-11</code>: 标准输出 (STD_OUTPUT_HANDLE)</li><li><code>-12</code>: 标准错误 (STD_ERROR_HANDLE)</li></ul></li><li><strong>返回值</strong>: <code>rax</code> - 返回一个句柄。如果失败，返回 <code>INVALID_HANDLE_VALUE</code> (-1)。</li></ul></li><li><p><strong><code>WriteConsoleA</code></strong>: 将一个ASCII字符串写入控制台。</p><ul><li><strong>接收值</strong>:<ul><li><code>rcx</code>: 通过 <code>GetStdHandle</code> 获取的控制台输出句柄。</li><li><code>rdx</code>: 指向要写入的字符串缓冲区的指针。</li><li><code>r8</code>: 要写入的字符数。</li><li><code>r9</code>: 指向一个变量的指针，该变量用于接收实际写入的字符数（可以为0，表示不关心）。</li><li><code>[rsp+32]</code>: (栈上传递的第五个参数) 必须为0。</li></ul></li><li><strong>返回值</strong>: <code>rax</code> - 如果函数成功，返回非零值。如果失败，返回零。</li></ul></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">; 示例：打印 &quot;Hello, World!&quot;</span><br><span class="line">mov rcx, -11          ; 获取标准输出句柄</span><br><span class="line">call GetStdHandle</span><br><span class="line"></span><br><span class="line">mov rcx, rax          ; 第一个参数：句柄</span><br><span class="line">mov rdx, msg          ; 第二个参数：字符串地址</span><br><span class="line">mov r8, msg_len       ; 第三个参数：字符串长度</span><br><span class="line">mov r9, 0             ; 第四个参数：不关心写入的字符数</span><br><span class="line">sub rsp, 32           ; 为第五个参数在栈上分配空间</span><br><span class="line">mov QWORD [rsp+32], 0 ; 第五个参数：必须为0</span><br><span class="line">call WriteConsoleA</span><br><span class="line">add rsp, 32           ; 清理为第五个参数分配的栈空间</span><br></pre></td></tr></table></figure><h1 id="一个脚本"><a href="#一个脚本" class="headerlink" title="一个脚本"></a>一个脚本</h1><p>我还写了一个Python脚本用来帮我快速编译asm文件：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="comment"># ANSI escape codes for colors</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Color</span>:</span><br><span class="line">    RESET = <span class="string">&#x27;\033[0m&#x27;</span></span><br><span class="line">    RED = <span class="string">&#x27;\033[31m&#x27;</span></span><br><span class="line">    GREEN = <span class="string">&#x27;\033[32m&#x27;</span></span><br><span class="line">    YELLOW = <span class="string">&#x27;\033[33m&#x27;</span></span><br><span class="line">    BLUE = <span class="string">&#x27;\033[34m&#x27;</span></span><br><span class="line">    MAGENTA = <span class="string">&#x27;\033[35m&#x27;</span></span><br><span class="line">    CYAN = <span class="string">&#x27;\033[36m&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">run_command</span>(<span class="params">command</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Runs a command and checks for errors, handling different encodings.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.CYAN&#125;</span>执行命令: <span class="subst">&#123;Color.YELLOW&#125;</span><span class="subst">&#123;<span class="string">&#x27; &#x27;</span>.join(command)&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="comment"># Run command without text decoding to get raw bytes</span></span><br><span class="line">    result = subprocess.run(command, capture_output=<span class="literal">True</span>, shell=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Try to decode output with gbk, fallback to utf-8</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        stdout = result.stdout.decode(<span class="string">&#x27;gbk&#x27;</span>)</span><br><span class="line">        stderr = result.stderr.decode(<span class="string">&#x27;gbk&#x27;</span>)</span><br><span class="line">    <span class="keyword">except</span> UnicodeDecodeError:</span><br><span class="line">        stdout = result.stdout.decode(<span class="string">&#x27;utf-8&#x27;</span>, errors=<span class="string">&#x27;ignore&#x27;</span>)</span><br><span class="line">        stderr = result.stderr.decode(<span class="string">&#x27;utf-8&#x27;</span>, errors=<span class="string">&#x27;ignore&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> result.returncode != <span class="number">0</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>错误: 执行命令失败: <span class="subst">&#123;<span class="string">&#x27; &#x27;</span>.join(command)&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> stdout.strip():</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>标准输出:\n<span class="subst">&#123;stdout.strip()&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> stderr.strip():</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>标准错误:\n<span class="subst">&#123;stderr.strip()&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.GREEN&#125;</span>成功。<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> stdout.strip():</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.YELLOW&#125;</span>标准输出:\n<span class="subst">&#123;stdout.strip()&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;Main function to assemble and link the asm file.&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt; <span class="number">2</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>用法: python asmc.py &lt;文件名.asm&gt; [库...]<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    asm_file = sys.argv[<span class="number">1</span>]</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> asm_file.lower().endswith(<span class="string">&#x27;.asm&#x27;</span>):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>错误: 第一个参数必须是 .asm 文件, 但收到的是 <span class="subst">&#123;asm_file&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    base_name = os.path.splitext(asm_file)[<span class="number">0</span>]</span><br><span class="line">    obj_file = base_name + <span class="string">&#x27;.obj&#x27;</span></span><br><span class="line">    exe_file = base_name + <span class="string">&#x27;.exe&#x27;</span></span><br><span class="line">    </span><br><span class="line">    libs = sys.argv[<span class="number">2</span>:]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1. nasm -f win64 xxx.asm -o xxx.obj</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;\n<span class="subst">&#123;Color.MAGENTA&#125;</span>--- 步骤 1: 汇编文件 ---<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    nasm_command = [<span class="string">&#x27;nasm&#x27;</span>, <span class="string">&#x27;-f&#x27;</span>, <span class="string">&#x27;win64&#x27;</span>, asm_file, <span class="string">&#x27;-o&#x27;</span>, obj_file]</span><br><span class="line">    run_command(nasm_command)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. link xxx.obj /subsystem:console /entry:_start /out:xxx.exe xxx.lib ...</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;\n<span class="subst">&#123;Color.MAGENTA&#125;</span>--- 步骤 2: 链接目标文件 ---<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    link_command = [<span class="string">&#x27;link&#x27;</span>, obj_file, <span class="string">&#x27;/subsystem:console&#x27;</span>, <span class="string">&#x27;/entry:_start&#x27;</span>, <span class="string">f&#x27;/out:<span class="subst">&#123;exe_file&#125;</span>&#x27;</span>] + libs</span><br><span class="line">    run_command(link_command)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3. del xxx.obj</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;\n<span class="subst">&#123;Color.MAGENTA&#125;</span>--- 步骤 3: 清理 ---<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.CYAN&#125;</span>正在删除: <span class="subst">&#123;Color.YELLOW&#125;</span><span class="subst">&#123;obj_file&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        os.remove(obj_file)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.GREEN&#125;</span>成功。<span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> OSError <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;Color.RED&#125;</span>错误: 删除文件 <span class="subst">&#123;obj_file&#125;</span> 失败: <span class="subst">&#123;e&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;\n<span class="subst">&#123;Color.GREEN&#125;</span>所有步骤已成功完成！已生成可执行文件: <span class="subst">&#123;Color.YELLOW&#125;</span><span class="subst">&#123;exe_file&#125;</span><span class="subst">&#123;Color.RESET&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>用法：<br>    python asmc.py &lt;your_file.asm&gt; [library1.lib library2.lib …]<br>例如：<br>    python asmc.py hello.asm kernel32.lib</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/994c7db2/</id>
    <link href="https://www.pylindex.top/blog/posts/994c7db2/"/>
    <published>2025-07-13T05:34:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="今天心血来潮学了汇编，以下记录学到的知识"><a href="#今天心血来潮学了汇编，以下记录学到的知识" class="headerlink" title="今天心血来潮学了汇编，以下记录学到的知识"></a>今天心血来潮学了汇编，以下记录学到的知识</h1><]]>
    </summary>
    <title>勇闯汇编</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>一次放假就一天，作业胜似不要钱。何时才能全写完？  无可奈何时逝去，似曾相识学归来。坐在课上想回来。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/56c777d9/</id>
    <link href="https://www.pylindex.top/blog/posts/56c777d9/"/>
    <published>2025-07-09T09:24:13.000Z</published>
    <summary>
      <![CDATA[<p>一次放假就一天，作业胜似不要钱。何时才能全写完？  无可奈何时逝去，似曾相识学归来。坐在课上想回来。</p>]]>
    </summary>
    <title>浣溪沙·节假日</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>人口全趋老龄，地球欲爆堪忧。<br>江河湖海尽污流，经济作物难收。<br>大洋洲中袋鼠，山火每被雷勾。<br>美洲美国都姓美，NIGGER 独步全球。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/10f62a20/</id>
    <link href="https://www.pylindex.top/blog/posts/10f62a20/"/>
    <published>2025-04-18T00:25:28.000Z</published>
    <summary>
      <![CDATA[<p>人口全趋老龄，地球欲爆堪忧。<br>江河湖海尽污流，经济作物难收。<br>大洋洲中袋鼠，山火每被雷勾。<br>美洲美国都姓美，NIGGER 独步全球。</p>]]>
    </summary>
    <title>西江月·地理</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>常记周日日暮，狂写无法结束。<br>困入作文中，不知试卷出路。<br>悲乎，悲乎，<br>作业本无归路。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/3f98df94/</id>
    <link href="https://www.pylindex.top/blog/posts/3f98df94/"/>
    <published>2025-04-06T03:28:00.000Z</published>
    <summary>
      <![CDATA[<p>常记周日日暮，狂写无法结束。<br>困入作文中，不知试卷出路。<br>悲乎，悲乎，<br>作业本无归路。</p>]]>
    </summary>
    <title>如梦令</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>清明时节雨纷纷，<br>家中作业写断魂。<br>借问鬼火何处有？<br>烧了作业祭鬼魂。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/73b4a924/</id>
    <link href="https://www.pylindex.top/blog/posts/73b4a924/"/>
    <published>2025-04-04T03:23:00.000Z</published>
    <summary>
      <![CDATA[<p>清明时节雨纷纷，<br>家中作业写断魂。<br>借问鬼火何处有？<br>烧了作业祭鬼魂。</p>]]>
    </summary>
    <title>清明劫</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>镇江府教学楼，放学留。<br>万里试卷无垠，眼泪流。<br>忆往昔，念未来，几时休。<br>只想停笔不前，无盼头。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/ed0c92d5/</id>
    <link href="https://www.pylindex.top/blog/posts/ed0c92d5/"/>
    <published>2025-03-18T00:25:28.000Z</published>
    <summary>
      <![CDATA[<p>镇江府教学楼，放学留。<br>万里试卷无垠，眼泪流。<br>忆往昔，念未来，几时休。<br>只想停笔不前，无盼头。</p>]]>
    </summary>
    <title>相见欢·初中</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>大风起兮不停歇，飞鸟突显人不见。<br>曜日混入浓雾里，乌云遮天云遮月。<br>声响随风就飘散，只留鲜红消失前。<br>群蜂闻味拥出去，钢铁城墙封锁来。<br>沉石落水不复出，墙边围栏轻松跨。<br>回家心愿最后说，随风消散天地间。<br>光天化日本应有，却道人心可变天。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/1ec15bb0/</id>
    <link href="https://www.pylindex.top/blog/posts/1ec15bb0/"/>
    <published>2025-03-15T23:55:00.000Z</published>
    <summary>
      <![CDATA[<p>大风起兮不停歇，飞鸟突显人不见。<br>曜日混入浓雾里，乌云遮天云遮月。<br>声响随风就飘散，只留鲜红消失前。<br>群蜂闻味拥出去，钢铁城墙封锁来。<br>沉石落水不复出，墙边围栏轻松跨。<br>回家心愿最后说，随风消散天地间。<br>光天化日本应有，却道人心可变天。<]]>
    </summary>
    <title>铁城落羽</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>不羡高中双休好，只休身体不休脑。<br>遣返外地打工人，自古革命中年人。<br>一座大山压身上，千古一帝敲门来。<br>不为政策社会好，只恨自己太了了。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/3f9c1055/</id>
    <link href="https://www.pylindex.top/blog/posts/3f9c1055/"/>
    <published>2025-03-12T01:54:00.000Z</published>
    <summary>
      <![CDATA[<p>不羡高中双休好，只休身体不休脑。<br>遣返外地打工人，自古革命中年人。<br>一座大山压身上，千古一帝敲门来。<br>不为政策社会好，只恨自己太了了。</p>]]>
    </summary>
    <title>乙巳杂诗·其二</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<p>一步无底深渊，两步精神病院，三步老师门前。<br>推门进入，破口大骂眼前。</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/1f0f790f/</id>
    <link href="https://www.pylindex.top/blog/posts/1f0f790f/"/>
    <published>2025-03-12T00:25:28.000Z</published>
    <summary>
      <![CDATA[<p>一步无底深渊，两步精神病院，三步老师门前。<br>推门进入，破口大骂眼前。</p>]]>
    </summary>
    <title>天净沙·门前</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<h1 id="第一章-问题发现"><a href="#第一章-问题发现" class="headerlink" title="第一章 问题发现"></a>第一章 问题发现</h1><p>在我家里，使用了树莓派连接光猫进行拨号上网上网，并且用<a href="https://w1.fi/cgit/hostap/">hostadp</a>进行WiFi共享并分发。<strong>However</strong>，这个无论如何没法分发<code>ipv6</code>地址。所以，我决定采用一个方法，来让我家里的设备里的服务可以被外网访问。于是乎，我就想到了<code>frp</code>。</p><h1 id="第二章-服务端安装"><a href="#第二章-服务端安装" class="headerlink" title="第二章 服务端安装"></a>第二章 服务端安装</h1><p>目前<em>frp</em>的最新版本是<code>v0.61.1</code>，我们下载最新版至一个文件夹内：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">aria2c <span class="string">&quot;https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm64.tar.gz&quot;</span> -x 16 -o ./frp_0.61.1_linux_arm64.tar.gz</span><br></pre></td></tr></table></figure><p>接下来解压这个文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tar -xvzf frp_0.61.1_linux_arm64.tar.gz</span><br><span class="line"><span class="built_in">rm</span> frp_0.61.1_linux_arm64.tar.gz</span><br><span class="line"><span class="built_in">cd</span> ./frp_0.61.1_linux_arm64</span><br></pre></td></tr></table></figure><p>可以看到有以下文件：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">├── frpc</span><br><span class="line">├── frpc.toml</span><br><span class="line">├── frps</span><br><span class="line">├── frps.toml</span><br><span class="line">└── LICENSE</span><br></pre></td></tr></table></figure><p>删除无关文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> frpc frpc.toml LICENSE frps.toml</span><br></pre></td></tr></table></figure><p>接下来编辑start.sh：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./frps --bind-port 7000 --dashboard-port 7500 -t 选择一个密码 --dashboard-user 选择一个用户名 --dashboard-pwd 选择一个密码</span><br></pre></td></tr></table></figure><p>添加执行权限：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x ./start.sh</span><br></pre></td></tr></table></figure><p>新建screen窗口：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">screen -S frps</span><br></pre></td></tr></table></figure><p>开启frps服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./start.sh</span><br></pre></td></tr></table></figure><p>退出screen窗口：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">按下 Crtl + A，接着按 D</span><br></pre></td></tr></table></figure><p>打开<code>Server IP:7500</code>可以进入控制面板，在弹出的输入框里输入用户名和密码，这里未涉及，不再作解释。</p><h1 id="第三章-小结"><a href="#第三章-小结" class="headerlink" title="第三章 小结"></a>第三章 小结</h1><p>目前，服务端已经搭建好，可以正常使用，地址为<code>Server IP:7000</code>。</p><p>** Enjoy It !**</p>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/76b170c9/</id>
    <link href="https://www.pylindex.top/blog/posts/76b170c9/"/>
    <published>2024-12-27T07:14:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="第一章-问题发现"><a href="#第一章-问题发现" class="headerlink" title="第一章 问题发现"></a>第一章 问题发现</h1><p>在我家里，使用了树莓派连接光猫进行拨号上网上网，并且用<a href="https://w1]]>
    </summary>
    <title>Frp内网穿透搭建记录</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
  <entry>
    <author>
      <name>pyl</name>
    </author>
    <content>
      <![CDATA[<h1 id="第一章-机遇"><a href="#第一章-机遇" class="headerlink" title="第一章 机遇"></a>第一章 机遇</h1><p>迫于学校的<em>无聊生活</em>，我们迫不得已给自己找点乐子。在三国杀的灵感激发下，我们（一共5人）终于是创造了一款<em>崭新的**亮闪闪</em>的卡牌游戏，我们把他叫做：<br><strong>世界大战</strong></p><h1 id="第二章-江南制造厂"><a href="#第二章-江南制造厂" class="headerlink" title="第二章 江南制造厂"></a>第二章 江南制造厂</h1><p>在一开始，我们就定下了十分宏伟的愿景：尽量制造<em>丰富</em>，<em>有趣</em>，<em>多样化</em>，<em>十分多</em>的卡牌。为了达成这一目标，我们率先定下来150张的目标。接下来的4天内，不论上课下课，我们5个人在一张张大约<em>6cm*3cm</em>的纸条上面写各式各样的功能牌。除此之外，我们还制造了五个国家分别是：<em>林国</em>，<em>陈国</em>，<em>顺国</em>，<em>姜国</em>，<em>潘国</em>，还给每个国家上了<em>独一无二</em>而又<em>有趣</em>的专属BUFF。150张的目标很快达成，我们脚步不停，最后制造了大约361张。这其中，由于我物理课翻字典找灵感被<em>军克戴</em>看到了，字典还遭受了一些<em>无妄之灾</em>。</p><h1 id="第三章-江南分类场"><a href="#第三章-江南分类场" class="headerlink" title="第三章 江南分类场"></a>第三章 江南分类场</h1><p>基础的<a href="#%E6%B1%9F%E5%8D%97%E5%88%B6%E9%80%A0%E5%8E%82">制造卡牌的工作</a>完成之后，望着堆积如山的卡牌，我们充满了斗志。首先，顺子带来了如此多卡牌的家——一个<em>全身透明的</em>笔盒。接下来，我们就正式开始了分类场的<em>Hard Work</em>。我们将<em>亲爱的</em>卡牌们分为几堆，把每张牌归为<em>攻击</em>，<em>防御</em>，<em>特殊</em>，<em>单位</em>，<em>附属国</em>（后两种有时候归为前三种），然后给前三种都标上等级：<em>1</em>，<em>2</em>，<em>3</em>。这时，游戏骨架已经基本完成了。</p><h1 id="第四章-顺子规则专柜"><a href="#第四章-顺子规则专柜" class="headerlink" title="第四章 顺子规则专柜"></a>第四章 顺子规则专柜</h1><p>接下来，我们将活计交给了全场智商最高的顺子。制定规则这件事么，虽然活不多，但是脑细胞的消耗绝对是一等一的。他对整个游戏进行了<em>完整的<strong>翔实的</strong>丰满的</em>规则，对所有牌的关于等级的克制都做了详细的规定。这其中我们剩下的四个人也提供了不少的灵感。</p><h1 id="第五章-游戏基本完成"><a href="#第五章-游戏基本完成" class="headerlink" title="第五章 游戏基本完成"></a>第五章 游戏基本完成</h1><p>到这时，游戏已经基本完成了。我们先试玩了几把，调整了平衡之后就彻底完工了。自己做的玩起来就是舒服，是打发时间的利器：</p><h2 id="我们充满了力气与手段！"><a href="#我们充满了力气与手段！" class="headerlink" title="我们充满了力气与手段！"></a>我们充满了力气与手段！</h2><h1 id="第六章-信息时代"><a href="#第六章-信息时代" class="headerlink" title="第六章 信息时代"></a>第六章 信息时代</h1><p>为了应对老师的<em>抽查</em>和<em>没收</em><del>虽然从未有过</del>，我们决定把所有卡牌交与我，让我备份在电脑上并且用统一字体打印出来。我欣然同意。我花了星期五的下午+星期六一天的<del>摸鱼</del>努力+星期天的大半个下午，终于是全部打字录入进了电脑。其中，我还写了一个Python脚本帮我提高效率。之后，我使用了<em>Python</em>将它们做成了 PDF 便于打印。这玩意虽然排版不行，但是裁剪后就可以了。一共三十张<em>共15元</em>。</p><h1 id="第七章-展望未来"><a href="#第七章-展望未来" class="headerlink" title="第七章 展望未来"></a>第七章 展望未来</h1><ul><li>添加git闭源储存库</li><li>完善&#x2F;res&#x2F;cards&#x2F;*.json中的内容，添加对象，数值</li><li>添加&#x2F;res&#x2F;country文件夹，其中存储国家json文件，包括名称（name），血量（HP），BUFF（buff）项</li><li>添加详细的规则至rules.md文件</li></ul>]]>
    </content>
    <id>https://www.pylindex.top/blog/posts/8b8e5c6c/</id>
    <link href="https://www.pylindex.top/blog/posts/8b8e5c6c/"/>
    <published>2024-12-22T11:53:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="第一章-机遇"><a href="#第一章-机遇" class="headerlink" title="第一章 机遇"></a>第一章 机遇</h1><p>迫于学校的<em>无聊生活</em>，我们迫不得已给自己找点乐子。在三国杀的灵感激发下，我们（一共5人）终于]]>
    </summary>
    <title>世界大战开发记录</title>
    <updated>2026-07-05T09:50:01.148Z</updated>
  </entry>
</feed>
