マイクロ・プロセッサでの、テクニック

竹岡尚三

last update: 2010/MAR/28
初出: 2010/JAN/02

ユーザ・モード命令(ユーザランド)で、セマフォを作るなど。

1.セマフォ命令/テスト・アンド・セット命令

一般に、同期/排他制御の基本操作としてセマフォ(semaphore)がある。
それを、一命令で実現しているものがセマフォ命令である。
一般に、セマフォ命令は、テスト・アンド・セット(test & set)命令と同値で ある。
テスト・アンド・セット命令は、あるメモリの中の古い値をテストしながら、 新しい値を書き込む命令である。テスト結果は、条件判断命令などで判定す る。
テスト結果が、すでに使用中であれば、そのセマフォが開放される まで、待つべきである。
テストと新しい値のセットが、不可分(アトミック)に行われることが、セマフォ命令では 重要である。
CPUに備わっているテスト・アンド・セット命令は、操作中に割り込まれる ことが無いので、不可分操作を行うのに、いちいち、CPUを割り込み禁止状態にしな くても良い。
なおかつ、SMPやマルチコア対応のテスト・アンド・セット命令は、SMPなど でも不可分性が有効であり、ユーザランドで同期/排他制御の可能なSMPソフト ウェアを作成することができる。

さて、1970年代に設計されて、ポピュラーだった、8bit CPU(マイクロ・プロセッサ)の ほとんどには、表立っては、 テスト・アンド・セット命令やセマフォ命令は備わってない。
そういうCPUで、テスト・アンド・セットを不可分にできるか?
ここでは、その方法を紹介する。


2. 符号付き比較命令が無い機械での符号付き比較

(この項は、UNIXマガジン 1991年12月に掲載した、私の文章の一部と類似)

機械語命令における符号付きというのは、2の補数表示というのが、通常。
ここでも2の補数表示の整数の比較について述べる。

6800や6809は、符号付き比較命令を持っている。
Z80や8080には、符号付き比較命令が無い。 そういう機械で、符号付き比較を行う方法。

3.シフト

最近、二進数の性質を知らない人が多い様子。なので、常識を書いてみたり。

同じ数を足すと、左シフト。
ADD A (ADD A,A)
は左シフト。
二進数の左シフトは、二倍と同じ意味。
最下位ビットには0が入る
Z80のシフト命令は、任意のレジスタをシフトできるが、2バイト長であり、実際 にはあまり役に立つ場面が少ない。


当然ながら、右シフトは、二分の一と同じ意味。

8080には、右シフト命令は無い。が、右ローテイト命令(RAR, RRA)はある。
右ローテイトして、最上位ビットを0にすれば、(論理)右シフトになる。
RAR
ANI 7FH

ただし、右シフトには、算術(arithmetic)シフトと論理(logical)シフトがある。
論理シフトは、最上位ビットに0が入る。(単純)

算術シフトは、最上位ビットがもとのまま残る。
最上位ビットは符号ビットであり、シフトしても、符号はそのまま残すべき。 それで1/2の除算と同じになる。
最上位ビットを保存するのは、8080では、結構面倒くさい。 いい方法は思いつかないので、その場で書くべし (キャリーフラグを使うと良さそうだよ)。



たけおか(竹岡尚三)のホームページ