【Python】「実践 コンピュータアーキテクチャ (改訂版)」のアセンブラをPythonで書く

投稿日:2022年1月31日
最終更新日:2022年1月31日

「実践 コンピュータアーキテクチャ (改訂版)」のアセンブラをPythonで実装してみる

先日こちらの記事でも書いたが、最近FPGAで自作CPUをつくることに興味を持ったので、以下の本を買ってみた。VerilogでFPGAに基本的なプロセッサを実装し、プログラムを動かすという内容。

本の中でアセンブリ言語が定義され、アセンブラのコードがPerlで書いてある。Perlでも実装したのだが、今Pythonを勉強中なので、Pythonでアセンブラを実装してみた。メモとしてこの記事にコードをのせておく。

アセンブリ言語は色々あると思うけど、基本的には定義した命令セットをバイナリの機械語に変換する流れは変わらないと思うので、他のアセンブリ言語にも応用は効くんじゃないかな~と思う。

 

実行環境

Windows10 64bit

Python 3.7.3

 

Pythonのコード

早速だが以下にPythonのコードを載せておく。実はちゃんとしたPythonのコードを書くのは初めてなので怪しい部分や冗長な部分もあるが、今後少しずつ整理していこうかなと思う。Gistに張ってるので、ちょくちょくアップデートしたい(とか言ってやらないパターンが多いが…笑)。

命令セットは本の内容そのままなのでここでは載せないが、if (op == ‘add’):以降の部分でニューモニックに応じて機械語に変換している。

使い方は、Pythonでコードを実行するときにアセンブリ言語で書いたプログラムファイルを引数として以下のように実行することで、機械語に変換したファイル「machine_code.txt」が出力される。

python 32bit_assembler.py assembly_program.txt

実行例を挙げておくと、例えば入力テキストファイルに以下を書いておいたとする。

        addi r1, r0, 1
        addi r2, r0, 2
        addi r3, r0, 3
        addi r4, r0, 4
        addi r5, r0, 5
        addi r6, r0, 6
label1: add r7, r4, r6
        lui r8, 12
        beq r7, r8, label1

この状態で変換を実行したら、machine_code.txtに以下のように機械語が出力される。

00000100000000010000000000000001
00000100000000100000000000000010
00000100000000110000000000000011
00000100000001000000000000000100
00000100000001010000000000000101
00000100000001100000000000000110
00000000100001100011100000000000
00001100000010000000000000001100
10000000111010001111111111111101

テキスト処理とか2進数の扱いとかの雰囲気がつかめたので、Pythonの勉強としては結構良い題材だった気がする。今後も何かコードを書いたらメモしていきたい。

ちなみに、今後は本に書いてあるプロセッサをVerilogでFPGAに実装して、適当なプログラムをこちらのアセンブラで機械語に変換してROMに書き込み、演算をさせる予定。本ではIntelのFPGAボードでやっているが、私はXilinxのボードでやるつもりなので、そのあたりの過程もブログに書きたいな~と思う。


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください