<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CPUをつくろう on 森羅万象プロジェクト</title><link>https://shinrabansyo.github.io/blog/01_cpu%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8D%E3%81%86/</link><description>Recent content in CPUをつくろう on 森羅万象プロジェクト</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sun, 01 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://shinrabansyo.github.io/blog/01_cpu%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8D%E3%81%86/index.xml" rel="self" type="application/rss+xml"/><item><title>CPU自作の準備</title><link>https://shinrabansyo.github.io/blog/2023/12/01/01-01_cpu%E8%87%AA%E4%BD%9C%E3%81%AE%E6%BA%96%E5%82%99/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://shinrabansyo.github.io/blog/2023/12/01/01-01_cpu%E8%87%AA%E4%BD%9C%E3%81%AE%E6%BA%96%E5%82%99/</guid><description>&lt;p&gt;最終更新：2024/05/07：metalsメインから公式sbtメインの選択肢を追加&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;今回は、「CPUを自作するための基盤」を用意していきます。&lt;br&gt;
&lt;strong&gt;1.CPUって一人でつくれるの！？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2.出てくる用語を簡単に解説&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3.今回のCPUづくりにつかうもの&lt;/strong&gt;&lt;br&gt;
について話していきます。&lt;/p&gt;
&lt;h1 id="1cpuって一人で作れるの"&gt;1.CPUって一人で作れるの！？&lt;a class="td-heading-self-link" href="#1cpu%e3%81%a3%e3%81%a6%e4%b8%80%e4%ba%ba%e3%81%a7%e4%bd%9c%e3%82%8c%e3%82%8b%e3%81%ae" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPUってどんな部品なのかと言われたら、「○○装置とついている中の、演算装置・記憶装置」　「3が一番弱くて、5、7、9がつくと強くなる」 「製造プロセス(nm)が小さいほど性能が良くなる」などと答える人が多いのではないでしょうか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;筆者も作り始める前は、「どのような命令を読み取ってどのように処理するんだろう」　「めっちゃ細い銅線と半導体、NAND回路をいい感じに組めたらおk？」　「裏でポインタとかメモリアドレスをいい感じに振り分けてくれてるんだろうなぁ」　なんて思っていました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実際、CPUはいい感じの回路が組めて、命令を読み取って、演算・記憶できるものが市販されているのでしょう。（じゃないと売れないですもんね。）でも、ネットを見たり、ゲームをしたりできるような命令や演算ができるものを個人で制作するのは至難の業です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ただ、仮に必要最低限のCPUをつくった(つくれる)のならば、市販されているCPUはその拡張や応用でつくられていると思えるようになるかもしれません。また、もしあなたがC言語やC++、Go言語やRustといったプログラミング言語を勉強する機会があれば、つまずく人の多いポインタやアドレスの原理が理解しやすくなるかもしれません（これは個人的な体験談ですが）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;まあ、とにかく、ダマされたと思って始めてみませんか？&lt;/strong&gt; 筆者もよくわからないままつくり始めて、なんとかなっているので、、、&lt;/p&gt;
&lt;h1 id="2出てくる用語を簡単に解説"&gt;2.出てくる用語を簡単に解説&lt;a class="td-heading-self-link" href="#2%e5%87%ba%e3%81%a6%e3%81%8f%e3%82%8b%e7%94%a8%e8%aa%9e%e3%82%92%e7%b0%a1%e5%8d%98%e3%81%ab%e8%a7%a3%e8%aa%ac" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(筆者調べ≒正確、ではありません、あくまで参考までに。)&lt;/p&gt;
&lt;h3 id="テキストエディタvisual-studio-code"&gt;テキストエディタ：Visual Studio Code&lt;a class="td-heading-self-link" href="#%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%82%a8%e3%83%87%e3%82%a3%e3%82%bfvisual-studio-code" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;あくまでもテキストエディタであってIDE(統合開発環境)ではない。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt; のExtension(拡張機能)がつよつよすぎてプログラミングに用いられるようになった。&lt;/li&gt;
&lt;li&gt;ちなみに筆者は無料の↑コレと有料のIDE&lt;a href="https://www.jetbrains.com/"&gt;(Jetbrains製品)&lt;/a&gt;を使ったことがあるが、色々な言語やライブラリを使って学習・開発したいのであればVSCode、特化した言語やフレームワークを使っての開発やお仕事で指定されている開発ではIDEを利用することも割とあるので、どちらも使えるようになって損はないと思っている。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="プログラミング言語java-scala-chisel"&gt;プログラミング言語：Java, Scala, Chisel&lt;a class="td-heading-self-link" href="#%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e8%a8%80%e8%aa%9ejava-scala-chisel" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Javaは王道といってよいほどの知名度、プロダクトがある。大規模開発が得意。&lt;/li&gt;
&lt;li&gt;ScalaはJavaっぽく、良いとこ取りで作られた言語で、データ処理が得意。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chisel-lang.org/"&gt;Chisel&lt;/a&gt;はScalaの&lt;a href="https://www.jetbrains.com/ja-jp/mps/concepts/domain-specific-languages/"&gt;DSL&lt;/a&gt;で、ハードウェア設計に特化。
&lt;ul&gt;
&lt;li&gt;（このプロジェクトで筆者はScalaとChiselとやらを知った、なんてメンバーには言えない。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="3今回のcpuづくりにつかうもの"&gt;3.今回のCPUづくりにつかうもの&lt;a class="td-heading-self-link" href="#3%e4%bb%8a%e5%9b%9e%e3%81%aecpu%e3%81%a5%e3%81%8f%e3%82%8a%e3%81%ab%e3%81%a4%e3%81%8b%e3%81%86%e3%82%82%e3%81%ae" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;今回は以下のものを使ってCPUを作っていきます。（クッキングみたい。）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発環境：&lt;a href="https://code.visualstudio.com/Download"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visual Studio Code内で必要なプラグイン：
&lt;ul&gt;
&lt;li&gt;Extension Pack for &lt;a href="https://www.oracle.com/java/technologies/javase-downloads.html"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scala-lang.org/download/"&gt;Scala&lt;/a&gt; (Metals)&lt;/li&gt;
&lt;li&gt;Scala Syntax (official)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サンプルコード：&lt;a href="https://github.com/Astalisks/CPU_FirstActivityWithShinrabansho"&gt;筆者のGitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="これが動けばok"&gt;これが動けばOK！！&lt;a class="td-heading-self-link" href="#%e3%81%93%e3%82%8c%e3%81%8c%e5%8b%95%e3%81%91%e3%81%b0ok" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://shinrabansyo.github.io/images/docs/01-01/01_goal.gif" alt="ゴール"&gt;&lt;/p&gt;
&lt;p&gt;とりあえず、このディレクトリをgit cloneしてきて、中のJavaプログラム×2とScalaプログラムが動けばOKです。&lt;br&gt;
できる方はどんな手を使ってもよいので、どうぞ。&lt;/p&gt;</description></item><item><title>加算器をつくる</title><link>https://shinrabansyo.github.io/blog/2024/03/01/01-02_%E5%8A%A0%E7%AE%97%E5%99%A8%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/</link><pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate><guid>https://shinrabansyo.github.io/blog/2024/03/01/01-02_%E5%8A%A0%E7%AE%97%E5%99%A8%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/</guid><description>&lt;p&gt;今回は &lt;strong&gt;足し算だけできるCPU（の一部）&lt;/strong&gt; を作っていきたいと思います。&lt;/p&gt;
&lt;p&gt;今回は、「加算器（Adder）」について、&lt;br&gt;
&lt;strong&gt;1.加算ができるモノ ≒ 低機能CPU？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2.足し算プログラムなんて作ったことあるよ？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3.物理的に足し算ができるCPUを作りたい！&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;4.加算器をChiselでつくってみた！&lt;/strong&gt;
に分けて説明していきます。&lt;/p&gt;
&lt;h1 id="1加算ができるモノ--低機能cpu"&gt;1.加算ができるモノ ≒ 低機能CPU？&lt;a class="td-heading-self-link" href="#1%e5%8a%a0%e7%ae%97%e3%81%8c%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%a2%e3%83%8e--%e4%bd%8e%e6%a9%9f%e8%83%bdcpu" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;・CPUに必要なパーツについて、ChatGPTに聞いてみた（ものを要約した）ところ、以下のような要素があるとのことでした。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;演算処理ユニット（Arithmetic Logic Unit, ALU）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数値演算: 加算、減算、乗算、除算などの基本的な算術演算を実行。&lt;/li&gt;
&lt;li&gt;論理演算: AND、OR、NOT、XORなどのビット単位の論理演算を行う。&lt;br&gt;
（これらは全部NANDを組み合わせるだけでできる。NAND最強。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;制御ユニット（Control Unit, CU）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令の解釈: プログラムから読み込んだ命令を解釈し、何を行う必要があるかを判断。&lt;/li&gt;
&lt;li&gt;命令の実行: 各種装置に対して命令を送り、実行を管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;レジスタ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一時的なデータ保持: 処理中のデータや中間結果を一時的に保持。&lt;/li&gt;
&lt;li&gt;特定の機能を持つレジスタ: 命令ポインタ、ステータスレジスタなど。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;キャッシュメモリ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高速アクセス: 頻繁に使用されるデータや命令を一時的に保持し、高速なアクセスを可能にする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;バスインターフェースユニット&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ転送: CPUとメモリや他のデバイス間でデータを転送。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;命令セットアーキテクチャ（ISA）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令セット: CPUが理解できる命令のセット。このセットに基づいてプログラムはCPUに命令を出す。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;パイプライン処理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同時実行: 複数の命令を同時に処理することで、効率的な実行を実現。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;クロックとタイミング&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;システムクロック: CPUの処理速度を決定するタイミング信号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;しかし、CPUの機能を全て個人で実装するにはノウハウや時間が足りない人も多いでしょう（作ったことない人でばなおさら）。ここでよく言われるのが、「足し算ができるCPUを作成できれば、それは究極的に機能を制限したCPUといえる」という話で、上の1.を作成しているとはいえるかもしれません。&lt;/li&gt;
&lt;li&gt;いきなりメモリ機能やクロック機能を作れと言われてもできる気がしない（？）し、開発の時に「とりあえず動作確認のために加算器を作ろう」という流れになったというメタ的な事情もありますので、今回は加算器を作成していきます（ということで納得してください、、）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="2足し算プログラムなんて作ったことあるよ"&gt;2.足し算プログラムなんて作ったことあるよ？&lt;a class="td-heading-self-link" href="#2%e8%b6%b3%e3%81%97%e7%ae%97%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%aa%e3%82%93%e3%81%a6%e4%bd%9c%e3%81%a3%e3%81%9f%e3%81%93%e3%81%a8%e3%81%82%e3%82%8b%e3%82%88" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;「足し算できるモノを作ってください」と言われたら、PythonやJavaでも作れます（筆者も大学講義でC言語とJavaやりました）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Java&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Adder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 使用例&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Adder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;adder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そこで、&lt;strong&gt;ChiselというDSL&lt;/strong&gt;の出番なわけです。&lt;br&gt;
ScalaはJavaベースなので、パッと見はJavaと同じように見えます。&lt;/p&gt;</description></item><item><title>命令を送る・受け取る</title><link>https://shinrabansyo.github.io/blog/2025/09/01/01-03_%E5%91%BD%E4%BB%A4%E3%82%92%E9%80%81%E3%82%8B%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://shinrabansyo.github.io/blog/2025/09/01/01-03_%E5%91%BD%E4%BB%A4%E3%82%92%E9%80%81%E3%82%8B%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B/</guid><description>&lt;p&gt;今回は &lt;strong&gt;足し算以外の命令がわかるCPU&lt;/strong&gt; を作っていきたいと思います。&lt;/p&gt;
&lt;p&gt;今回は「ALU（算術論理ユニット）」について、&lt;br&gt;
&lt;strong&gt;1.ALUができたら足し算以外も「分かる」らしい、、&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2.命令を「分かる」ために必要な要素とは？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;3.そもそも、電気だけで命令をどう作っている？&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;4.ALUをChiselでつくってみた！&lt;/strong&gt;
に分けて説明していきます。&lt;/p&gt;
&lt;h1 id="1aluができたら足し算以外も分かるらしい"&gt;1.ALUができたら足し算以外も「分かる」らしい、、&lt;a class="td-heading-self-link" href="#1alu%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%9f%e3%82%89%e8%b6%b3%e3%81%97%e7%ae%97%e4%bb%a5%e5%a4%96%e3%82%82%e5%88%86%e3%81%8b%e3%82%8b%e3%82%89%e3%81%97%e3%81%84" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;・前回の記事では、CPUの機能の一部として&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;演算処理ユニット（Arithmetic Logic Unit, ALU）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;数値演算: 加算、減算、乗算、除算などの基本的な算術演算を実行。&lt;/li&gt;
&lt;li&gt;論理演算: AND、OR、NOT、XORなどのビット単位の論理演算を行う。&lt;br&gt;
（これらは全部NANDを組み合わせるだけでできる。NAND最強。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という説明をしました。そして前回までの記事で「足し算だけできるCPU」を作成しました。しかし、足し算「だけ」でなく、引き算掛け算割り算、はたまたビットシフト（2乗とか）を行うとなると、「足し算か（そうでないか）を判別できるCPU」を作る必要があります。&lt;a href="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html"&gt;Intel社のCPU&lt;/a&gt;や&lt;a href="https://www.amd.com/content/dam/amd/en/documents/archived-tech-docs/datasheets/22529.pdf"&gt;AMD社のCPU&lt;/a&gt;は「1bitから15bitの命令を判別できるCPU」であるそうですが、それよりは「10bit固定の命令を判別できるCPU」を作る方が簡単な印象をもちます。そこでなんと「32bitの命令を判別できるCPU」の作成経験があるメンバーがいて、今回はその方のノウハウを参考に作業を進めることになりました。&lt;/p&gt;
&lt;p&gt;少し脱線しますが、&lt;a href="https://www.security-camp.or.jp/index.html"&gt;セキュリティキャンプ&lt;/a&gt;でグループワークの活動や個人の活動を続けたところ、3月に&lt;a href="https://www.security-camp.or.jp/event/awardreport.html"&gt;セキュリティキャンプアワード&lt;/a&gt;で発表する機会をいただきました！！また、同時に&lt;a href="https://www.ipa.go.jp/jinzai/security-camp/2024/forum2025.html"&gt;セキュリティ・キャンプフォーラム&lt;/a&gt;が開催されます！キャンプ参加者の発表以外にもためになる講演やトークショーがあります。一般の方も申し込みで聴講可能なので、ぜひ機会があればご参加ください（ついでに当プロジェクトのフィードバックもお待ちしています！！）&lt;/p&gt;
&lt;h1 id="2命令を分かるために必要な要素とは"&gt;2.命令を「分かる」ために必要な要素とは？&lt;a class="td-heading-self-link" href="#2%e5%91%bd%e4%bb%a4%e3%82%92%e5%88%86%e3%81%8b%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e8%a6%81%e7%b4%a0%e3%81%a8%e3%81%af" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;CPUを作るにあたって、命令を「分かる」ために必要な要素を考えてみます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まず、「足し算をする」という命令と「引き算をする」という命令を見分けるには、足し算を命令1, 引き算を命令2としておけばよさそうです。&lt;br&gt;
（CPU（内のレジスタ）は0か1の二値しか保持できないので、命令001と命令010（２進数）にして見分けておきます。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;足し算引き算だけじゃなく、プログラムを少し勉強するとif文みたいなのが出てきます。「加算減算でない別種の命令」が必要という感じですね。&lt;br&gt;
（if文みたいなものを1-1, 足し算を（if文とは別種の計算として）2-1, 引き算を（足し算と似てる計算ということで）2-2として、2進数で001-001、010-001、010-010という風に書いておきます。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;命令を出すとなったら、出した命令の順番を覚えてお区必要がありそうです。順番・時系列を「カウント」しておくものを用意します。&lt;br&gt;
（１回目が足し算、３回目が引き算なら、01:010-001、11:010-010、みたいな感じ。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;足し算や引き算をしたら、結果を保存する必要があります。「メモリ」にデータを保存し、メモリが格納されている番地のようなもの（アドレス）が宛先として指定可能である、という授業を受けた人もいるかもしれません。また、命令をカウントするには命令そのものも保存しておく必要があります。&lt;br&gt;
（メモリは市販PCで8GBとか16GBとか言われるくらいなので、今回は（2^8 = 256 ≒ 命令256種類以下ならレジスタは8つあればよい ≒ レジスタは8192つもいらないはずなので）考慮しなくてよいほどめっちゃ大きくて命令は全部保存できるとしましょう。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CPUのレジスタで保存できる量はメモリより少ないもの、爆速で計算可能です。（主記憶と補助記憶、トランジスタとキャパシタ、SRAMとDRAMとかが関係していますね。）&lt;br&gt;
「１回目」に、「レジスタ３」に入っている3と、「レジスタ５」に入っている5を「足し」て、結果を「レジスタ７」に入れるとするなら、01:010-001-011-101-111、と表せますでしょうか。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;x=3, y=5にしておいてからx+y=8にしてるなら、3とか5とかの「値そのものを保存する場所」がないといけません。
「１回目」に、「レジスタ３」に入っている3に「5」を「足し」て、結果を「レジスタ６」に入れるとするなら、その命令は01:010-001-011-101-110、などと表せそうです。
ということは、値を保持する場所は2～3個必要で、値そのもの（を置く場所）は0～1個必要そうですね。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;0,1だけで命令を作ってるので、1bitでもズレたらヤバそうです。「命令全体は○○bit」と決めると、さっきの命令が010-001-011-101-111とか010-001-011-101-110なので「命令は15bit固定」と決めておく必要がありますね。（1bit左にずらして100-010-111-011-110とかになったら、違う命令に、、。）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらをまとめると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令を管理するものとして「カウントするもの」「メモリの容量」は用意しておく&lt;/li&gt;
&lt;li&gt;命令そのものに必要な要素を用意する
&lt;ul&gt;
&lt;li&gt;「全体の長さ」&lt;/li&gt;
&lt;li&gt;「命令を大きく分類」&lt;/li&gt;
&lt;li&gt;「似た命令をさらに分類」&lt;/li&gt;
&lt;li&gt;「値を持っておくレジスタ×2～3個」&lt;/li&gt;
&lt;li&gt;「値そのもの×0～1個」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらがあれば、命令を正しく理解できそうですね。 &lt;br&gt;
（見落としたもの・不要なものはないんですか？という意見もあるかもしれませんが、今のところはちゃんと必要十分になってます。今のところは、、。）&lt;/p&gt;
&lt;h1 id="3そもそも電気だけで命令をどう作っている"&gt;3.そもそも、電気だけで命令をどう作っている？&lt;a class="td-heading-self-link" href="#3%e3%81%9d%e3%82%82%e3%81%9d%e3%82%82%e9%9b%bb%e6%b0%97%e3%81%a0%e3%81%91%e3%81%a7%e5%91%bd%e4%bb%a4%e3%82%92%e3%81%a9%e3%81%86%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.ipa.go.jp/shiken/kubun/fe.html"&gt;基本情報技術者試験&lt;/a&gt;（←CBTなのでいつでも受けれるのでどうぞ！）を受ける方とか、音楽・CDとかに詳しい方であれば、標本化・量子化・符号化は聞いたことあるかもしれません。先の2.で01（２進数）を使ったのですが、そのbitに0か1を表示するときも同じで、閾値2.5V（FPGA「Tang nano 9K」はUSB接続だから5Vなので）より下だったら0、2.5Vより上だったら1といった表現ができます。&lt;a href="https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html"&gt;Tang nano 9Kの公式サイト&lt;/a&gt;より引用し（て少し手入れし）たものを見ると、&lt;/p&gt;</description></item><item><title>命令をふやす（その１）</title><link>https://shinrabansyo.github.io/blog/2026/03/01/01-04_%E5%91%BD%E4%BB%A4%E3%82%92%E3%81%B5%E3%82%84%E3%81%99%E3%81%9D%E3%81%AE%EF%BC%91/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://shinrabansyo.github.io/blog/2026/03/01/01-04_%E5%91%BD%E4%BB%A4%E3%82%92%E3%81%B5%E3%82%84%E3%81%99%E3%81%9D%E3%81%AE%EF%BC%91/</guid><description>&lt;p&gt;今回は &lt;strong&gt;加算以外もできるCPU（その１）&lt;/strong&gt; を作っていきたいと思います。&lt;/p&gt;
&lt;p&gt;今回は、CPUに必要な命令（の一部）を考えていきます。&lt;/p&gt;
&lt;p&gt;「CPUに送る・CPUが認識できる命令」について、&lt;br&gt;
&lt;strong&gt;1.命令の種類について&lt;/strong&gt;
&lt;strong&gt;2.CPUに必要な命令１：演算を行う命令&lt;/strong&gt;
&lt;strong&gt;3.命令を追加してみた！&lt;/strong&gt;
に分けて説明していきます。
筆者的には、最もCPUを作っているなと実感した部分です！&lt;/p&gt;
&lt;h1 id="1命令の種類について"&gt;1.命令の種類について&lt;a class="td-heading-self-link" href="#1%e5%91%bd%e4%bb%a4%e3%81%ae%e7%a8%ae%e9%a1%9e%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;・前回の記事では、命令を構成する要素と、そのbit数について紹介しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令を管理するものとして「カウントするもの（pc）」「メモリの容量（mem）」は用意しておく&lt;/li&gt;
&lt;li&gt;命令1つの長さ（instr）は48bit
&lt;ul&gt;
&lt;li&gt;命令の種類を5bitで大きく分類（opcode）&lt;/li&gt;
&lt;li&gt;さらに3bitをつかって命令を細かく分類（opcode_sub）&lt;/li&gt;
&lt;li&gt;値を持っておくレジスタ（rd, rs1, rs2）は2~3個、原則5bit/個&lt;/li&gt;
&lt;li&gt;値そのもの（imm）は0~1個、原則32bit/個&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、前回のプログラムでは「opcode」や「rs1」などの変数を充てていますが、詳しい意味については&lt;a href="https://github.com/shinrabansyo/spec/blob/main/spec.adoc"&gt;本プロジェクトのスペックシート&lt;/a&gt;をご確認ください！&lt;/p&gt;
&lt;p&gt;・さて、これまでの取り組みでは「命令を受け取り、処理ができるCPU」を作成しました。今回の記事からは数回は、「CPUへわたす命令」を考えていきます！！（プロジェクト開始時何も知らなかった筆者は、CPUは命令を考えていくところから始まると思っていたのですが、まさか3記事も作成できるくらい下準備があるとは思っていませんでした、、。）&lt;/p&gt;
&lt;p&gt;・まず、前回までの記事で用意した「足し算命令」について確認します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;add命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2つのレジスタの値を足して、結果を別のレジスタに格納する。&lt;/li&gt;
&lt;li&gt;例：&lt;code&gt;add r1, r2, r3&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;r2の値と、r3の値を足して、r1に格納する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;addi命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レジスタの値に即値を足して、結果を別のレジスタに格納する。&lt;/li&gt;
&lt;li&gt;例：&lt;code&gt;addi r1, r2, 3&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;r2の値に、値3を足して、r1に格納する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単に足し算だけでも、「指定したレジスタの値同士を足し算する」命令と、「指定したレジスタの値に数値そのものをパスして足し算する」命令の2種類の命令があります。&lt;br&gt;
もっと抽象的にいうと、「レジスタとレジスタの結果をレジスタに保存する」形式と、「レジスタと値から処理を行い、それをレジスタに保存する」形式の2形式があると説明できます。&lt;/p&gt;
&lt;p&gt;・結論からになりますが、（本プロジェクトでは）CPUにわたすことのできる命令には他に2形式あります。&lt;br&gt;
1つは「特に計算とかはせず、値をそのままどこかへ書き込む」形式です。メモリで計算した後、別のメモリやレジスタにデータを保存したり、映像出力など外部のデバイスに書き込むような操作を指します。先述した（mem）はこの命令を定義するために必要不可欠な要素です。&lt;br&gt;
もう一つは「条件によって処理が分岐する」形式です。CやPythonなどのソフトウェア言語を学んだ方であれば、if文のように分岐すると考えるとよいかもしれません。命令1が分岐命令の時、条件に合致していれば命令2を、していなければ命令3を処理する、のような操作を指します。先述した（pc）はこの命令を定義するために必要不可欠な要素になります。&lt;/p&gt;
&lt;p&gt;・以上の4形式の命令は取り上げた順に、「R（レジスタ）形式」、「I（イミディエイト）形式」、「S（ストア）形式」、「B（ブランチ）形式」と呼んでいます。これらも、先述したスペックシートで詳しく定義されていますので、ぜひご一読ください！&lt;/p&gt;
&lt;p&gt;・とはいっても、形式ごとに若干実装が異なるため、今回は始めに取り上げたR形式とI形式の命令形式を用いた「演算を行う命令」を紹介していきます！！&lt;/p&gt;
&lt;h1 id="2cpuに必要な命令１演算を行う命令"&gt;2.CPUに必要な命令１：演算を行う命令&lt;a class="td-heading-self-link" href="#2cpu%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e5%91%bd%e4%bb%a4%ef%bc%91%e6%bc%94%e7%ae%97%e3%82%92%e8%a1%8c%e3%81%86%e5%91%bd%e4%bb%a4" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;・足し算があれば、引き算もありますね。似たような感じで用意します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;sub命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2つのレジスタの値を引いて、結果を別のレジスタに格納する。&lt;/li&gt;
&lt;li&gt;例：&lt;code&gt;sub r1, r2, r3&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;r2の値から、r3の値を引いて、r1に格納する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;subi命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レジスタの値から即値を引いて、結果を別のレジスタに格納する。&lt;/li&gt;
&lt;li&gt;例：&lt;code&gt;subi r1, r2, 3&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;r2の値から、値3を引いて、r1に格納する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;・加算減算以外にも、論理演算は似た形式で用意できます。AND、OR、XORなどです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;and命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2つのレジスタの値で論理積を取り、結果を別のレジスタに格納する。&lt;/li&gt;
&lt;li&gt;例：&lt;code&gt;and r1, r2, r3&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;r2の値と、r3の値で論理積を取り、r1に格納する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;andi命令&lt;/p&gt;</description></item></channel></rss>