「実践 コンピュータアーキテクチャ (改訂版)」のアセンブラPerlコードの修正点

投稿日:2022年1月24日
最終更新日:2022年10月9日

「実践 コンピュータアーキテクチャ (改訂版)」を買った

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

コンピュータアーキテクチャの基礎的な部分のおさらいになるし、とても勉強になる本なのだが、この本の図6.16「アセンブラのソースプログラム」に書いてあるPerlのコードを書き映して実行してみてもどうもうまく動かない。最終的にいくつか修正した部分があるので、このブログにメモしておく。

ただ私も今回Perlを初めてつかったので、勘違いしている可能性もあるのでご了承ください。ちなみに私はWindows10 PCを使っており、Perlはインストールが簡単なStrawberry Perlを使った。

 

実行環境

Windows10 64bit

Strawberry Perl 5.32.1.1

 

まずは本の正誤表を確認

まず、以下に公式な正誤表がのっており、ちょくちょく更新されているようなのでこちらを確認することをオススメする。私は最初、正誤表の存在に気づかずコーディングしてたので、かなり四苦八苦してしまった…笑

https://www.coronasha.co.jp/np/resrcs/seigo.html?goods_id=6741

私が持っているのは2020年4月30日発行の初版3刷なので、上記の内容をもとにコードを修正した。以下では2022年1月24日現在、正誤表にののっていない内容をメモしておく。

 

アセンブラPerlコードの修正点

始めに以下の処理&行を分割する処理だが、Perlのversionのせいなのかよくわからないがうまく動作せず。Perlには慣れてないが、そもそもこの書き方で何を置換したいのかイマイチわからず。

$line =~ s/^+//g;
@instruction = split (/+/, $line);

置換の分割をする方はErrorは出ないのだが、splitの方は以下のようにErrorが出た。

Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE / at 32assembler.pl line 11.

一応、いろいろとググッてみて

@instruction = split (/{+}/, $line);

のようにしたらErrorは出なくなったのだが、アセンブリ言語のプログラムを流してもうまく変換できない。コメントを見るに空白を消す意図の処理のようなので、最終的には\sで空白を指定するようにして

$line =~ s/^\s+//;
@instruction = split (/\s+/, $line);

という書き方に落ち着いた(ひょっとしたらプログラムの書き方によってはうまく処理できない可能性もあるかも?)。ちなみに2回目の処理も同じ書き方にした。

あと、これは多分誰でも気づくだろうとは思うが、lui命令の処理だけレジスタ番地の出力処理を呼び出すときにp_r21になっているが、これはp_r2iの誤り。

elsif ($op eq "lui") {p_b(6,3); p_r21($f2, "r0"); p_b(16, $f3); print("\n");}

 

アセンブリ言語のプログラムの修正点

あと、演習問題の問6.3でも一部書き方が規則に従っておらず、解答と合わない部分があったのでメモしておく。まず以下のandiの命令でr15を指定しているが、これはI型の命令のためレジスタは指定しないので「15」の誤り。一応r15のままでもエラーは出ずに表示はされるが、解答とは合わないので注意。

andi r11, r10, r15

もう一つはすぐ気づくとは思うが、最後のjrの命令はrと31の間にスペースが入っているが、ここはスペースはいらないので「r31」が正しい。

label3: jr r 31

まだ本は読んでいる途中なので、verilogの部分でも何か気づいたメモしておきたいと思う。


投稿者: wakky

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

コメントを残す

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

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