情報工学実験II(再履修)

はじめに

 出身学科も出身専攻も,完全に名称が無くなってしまいましたね. 過ごした時間に思いを馳せながら,マイクロプログラミングをしましょう(急展開).

アセンブラ

一覧

  • 機械語アセンブラ: rm1asm
  • マイクロアセンブラ: rm1masm

特徴

  • 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. サンプルプログラムのライセンスが不明なので,本家からダウンロードできなくなったらどうしよう…

おしまい