情報工学実験II(再履修)
はじめに
出身学科も出身専攻も,完全に名称が無くなってしまいましたね. 過ごした時間に思いを馳せながら,マイクロプログラミングをしましょう(急展開).
アセンブラ
一覧
特徴
- Unicode対応
- マルチプラットフォームで動作(Windows,Linux,MacOS)
- エラー表示機能付き(期待に添える程のクオリティではない)
遊び方
まずはアセンブラとシミュレータをインストールして下さい.
アセンブラはcargo install
でもインストールできますが,特にLinuxをお使いの方はパッケージからのインストールが便利です.
シミュレータはWindowsユーザなら公式(?)に配布されているものを使いましょう.
それ以外の方は自前でビルドして下さい.
$ git clone https://github.com/Kenta11/micro1
$ cd micro1
$ gcc m1sim.c -o m1sim
MICRO-1のマイクロプログラムをアセンブルします.
$ curl -s http://www.ced.is.utsunomiya-u.ac.jp/lecture/2022/jikkenb/micro/chap5/MICROONE | iconv -f sjis -t utf8 | tr -d "\32" > MICROONE
$ rm1masm MICROONE -o MICROONE.o
続いて機械語プログラムをアセンブルします.
$ cat sqrt
; This program is distributed under MIT LICENSE.
; Copyright (c) 2022 Kenta Arai
; 平方根を求めるプログラム
; アルゴリズムは"バビロニア人の方法"である
TITLE SQRT
L 1, X0
L 3, ERROR
; X(n+1)を計算
HEAD: LEA 2, (1)
LC 0, 0
L 1, S
BSR CALCXN1
; |X(n+1) - X(n)| < ERROR の場合は計算を終了する
SUB 2, (1) ; X(n) - X(n+1)
BSR ABS ; |X(n+1) - X(n)|
SUB 2, (3) ; |X(n+1) - X(n)| - ERROR
BNM HEAD
; 解を保存し,プログラムを終了
ST 1, XN
HLT
S: DC 487 ; 入力
X0: DC 20 ; 初期値X(0)
ERROR: DC 5 ; エラー
XN: DS 1 ; 解X(n)
; X(n+1)を計算する関数
; 入力: {r0: 0, r1: S, r2: X(n)}
; 出力: {r1: X(n+1), r2: X(n)}
CALCXN1: DIV 0, (2) ; S/X(n)
ADD 1, (2) ; S/X(n) + X(n)
SA 1, -1 ; (S/X(n) + X(n)) / 2 = X(n+1)
RET
; 絶対値を計算する関数
; 入力: {r2: 整数}
; 出力: {r2: 絶対値}
ABS: CMP 2, 0
BNM ABS0
XOR 2, X"FFFF
ADD 2, 1
ABS0: RET
END
$ rm1asm sqrt -o sqrt.b
プログラムを実行してみましょう.
$ ./m1sim
*** MICRO-1 SIMULATOR (C-Ver. 1.0d) [Sep 23 2022] ***
>> load
LOAD
FILE NAME=?MICROONE.o
LOADING 'MICROONE.o'
LOADED TO CM
>> load
LOAD
FILE NAME=?sqrt.b
LOADING 'sqrt.b'
LOADED TO MM
>> trace
TRACE
T?device
TD?set
DEVICE ?pc
DEVICE ?ir
DEVICE ?flag
DEVICE ?r0
DEVICE ?r1
DEVICE ?r2
DEVICE ?r3
DEVICE ?lbus
DEVICE ?rbus
DEVICE ?abus
DEVICE ?sbus
DEVICE ?.
TD?.
T?go
CMAR=?101
MAX STEP=?300
CMAR PC IR ZNCOCT R0 R1 R2 R3 LBUS RBUS ABUS SBUS
102 0000 0000 000010 0000 0000 0000 0000 0000 0040 0040 0040
~中略~
CMAR PC IR ZNCOCT R0 R1 R2 R3 LBUS RBUS ABUS SBUS
0FD 000C EF00 000010 0007 0016 FFFD 0005 0000 0000 0000 0000
CPU HALTED !
259 STEPS USED
T?.
>> dump
DUMP
D?mm
START ADRS ?000C
END ADRS ?000F
000C:01E7
000D:0014
000E:0005
000F:0016
D?.
>> end
>> MICRO-1 TERMINATED
XN(アドレスが0x000Fの行)に487の大体の平方根22(0x0016)が格納されていますね. 大大大成功です.
おわりに
Rust製の言語処理系ライブラリ(logosとchumsky)で遊んでいたら,いつの間にかアセンブラを書いていた. 何を言っているのか わからねーと思うが(以下略)
MICRO-1が書かれた書籍は絶版だし,このまま授業も無くなってしまったら悲しいですね. アセンブラはGitHubに置いておけばしばらくは残ると思うので,歴史的なアレコレとして誰か活用して下さい.
P.S. サンプルプログラムのライセンスが不明なので,本家からダウンロードできなくなったらどうしよう…
おしまい