昭和時代に構想されていたコンピュータ社会

昭和時代に構想されていたコンピュータ社会は、世の中の様々な電子機器が中央情報公社のたった1台のコンピュータの出力として存在する(内部にコンピュータがないから)というもの。
コンピュータ社会はまさに中央情報公社のパソコンだったと言える(コンピュータ社会をデスクトップ画面に喩えたら、操る電子機器はプログラムのアイコン。そのアイコンは言うまでもなくデスクトップ画面上のもの。)。
中央情報公社の1台のコンピュータが世の中の様々な電子機器をそれぞれ違うプログラムで時分割方式で操っている。
1命令の実行時間が0.2マイクロ秒とすると、1000個の電子機器を200マイクロ秒で操れる。
個々の電子機器のプログラムも中央情報公社のコンピュータが内部に有しているので、データのネットワークは存在せず、個々の電子機器が電話回線のように階層状に繋がれているため通信のネットワークなら存在する。
なので出力は数値で指定。
世の中の個々の電子機器には、コンピュータからの出力をアナログ化する装置がある。

原子で成り立っている宇宙

この宇宙は、縦横垂直に原子が無数に並んでいることで成り立っている。

原子はこんな感じに並ぶ。
HHON
COBF
SCOO
COPS

Hは水素、Oは酸素、Nは窒素、Cは炭素、Bはホウ素、Fはフッ素、Sは硫黄、Pはリン。

原子が隣の原子と位置を入れ替える(パズドラのドロップように)ことで宇宙が動いているのである。
HHON
COBF
SCOO
COPS

HHON
COFB
SCOO
COPS

個々の原子は、それぞれ1つの原子核を持ち、その原子核は単数または複数の電子を纏っている。
その電子が他の原子核に乗り移ることで原子が隣の原子と位置を入れ替えるのである。

コンピュータの小数

固定小数点数

固定小数点数とは、コンピュータにて整数部のビット列と小数部のビット列とで表された数である。
ただし表せる数は分母が2の累乗のものに限る。3は分数の形では3/(2^0)と表せるので分母が2の累乗であり、0.75は分数で3/(2^2)と表せるので分母が2の累乗である。
名前の通り小数点が動かない。
整数部4ビットと小数部4ビットで表される場合、3.25は8ビットだと00110100(小数点付きだと0011.0100)と表される。

 

浮動小数点数

浮動小数点数とは、コンピュータにて指数部のビット列と仮数部のビット列とで表された数である。
指数部のビット列の数値を変えることで小数点が動く。
固定小数点数と同じく、表せる数は分母が2の累乗のものに限る。

浮動小数点数は、0.仮数×2^指数と表す。1.5(2進数で1.10)は、仮数を2進数の11にして指数を1にして表す。3(2進数で11.0)は、仮数を2進数の11にして指数を2進数の10にして表す。
10進数の0.1は、分母が2の累乗でないのでコンピュータでは近い値を当てる(丸める)。
C言語にて浮動小数点数の変数型にfloat(単精度)とdouble(倍精度)があり、どちらもビットの数が非常に多い。2の累乗でない数を正確に表すため。
floatよりもdoubleの方がビットの数が多い。
なのでfloatよりもdoubleの方が分母が2の累乗でない数を正確に表せる。

コンピュータでの減算

コンピュータは減算ができないので、A-BはA+(-B)に変換して計算する。
例えば7-2はコンピュータは7+(-2)として計算する。

コンピュータは、全ビットを反転して1を足す(2の補数にする)ことで正の数を負の数にする。
例えば、コンピュータは3(ビット列は00000011)をビット列を11111100にしてそれに1を加え11111101にすることで-3(ビット列は11111101)という2の補数にする。

よって、コンピュータは7-2を7(ビット列は00000111)+(-2)(ビット列は11111110)にして5(ビット列は00000101)と答えを求める。

オペレーティングシステムの正しい解釈

オペレーティングシステム(縮めてOS)は、仮想的ではなく物理的なコンピュータを操作させるもの。
物理的なコンピュータに取り付けられ、そのコンピュータのプログラムの読み取り・書き換え・実行などを行う。

OSにより使用者は実行するプログラムを選べ、そのプログラムは階層状に並んでいる。

8つの汎用レジスタを汎用レジスタとして扱ったアセンブリ言語プログラム

ahレジスタ、alレジスタ、bhレジスタ、blレジスタ、chレジスタ、clレジスタ、dhレジスタ、dlレジスタの8つの汎用レジスタがある。

それらは、"int 21h"という命令やloop命令の材料として用いられるため汎用レジスタでないと思われがち。

そんな8つの汎用レジスタを汎用レジスタとして用いたアセンブリ言語プログラムがこれ。

 

bits 16
org 0x100

;7つの変数(汎用レジスタ)にデータを格納
mov ah,'q'   ;変数ahに格納
mov al,'u'   ;変数alに格納
mov bh,'i'   ;変数bhに格納
mov bl,'c'   ;変数blに格納
mov ch,'k'   ;変数chに格納
mov cl,'l'   ;変数clに格納
mov dh,'y'   ;変数dhに格納
pusha   ;変数の値を全て保存

;iという文字を出力
mov dl,bh
mov dh,0
mov al,0
mov ah,02
int 21h

popa   ;変数の値を復元
mov dl,ch   ;dlに退避
pusha   ;変数の値を全て保存

;kという文字を出力
mov dh,0
mov al,0
mov ah,02
int 21h

popa   ;変数の値を復元
mov dl,ah   ;dlに退避
pusha   ;変数の値を全て保存

;qという文字を出力
mov dh,0
mov al,0
mov ah,02
int 21h

;プログラム終了シーケンス
mov ah,4Ch
int 21h

 

8つの汎用レジスタのうち、dlレジスタは退避用。

pusha命令とpopa命令が用いられている。

アセンブリ言語におけるプログラム終了シーケンス

このアセンブリ言語プログラム。

 

bits 16
org 0x100

mov ah,2
mov dl,'s'
int 21h

;プログラム終了シーケンス
mov ah,4Ch
mov al,0
int 21h

 

プログラム終了シーケンスにおいて、"int 21h"はah内の数値に応じた処理をする命令であり、ah内の数値が4Chなのでプログラム終了を行う。

一方でalには戻り値(0)が格納される。

なので、戻り値を考えなければ"mov al,0"は消せる。

本プログラムから"mov al,0"を取ったアセンブリ言語プログラムがこれ。

 

bits 16
org 0x100

mov ah,2
mov dl,'s'
int 21h

;プログラム終了シーケンス
mov ah,4Ch
int 21h

 

"mov al,0"がある時と同じく、画面にsという文字が出力された後にプログラムが終わるやつである。