標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第66回]
●STAX命令とLDAX命令
今回はSTAX命令とLDAX命令について説明します。
ニーモニックが良く似た命令にSTAとLDAがあります。[第64回]で説明しました。
STAはAレジスタの値を、命令コードに続く2バイトで示すメモリアドレスに書き込む命令で、LDAはSTAとは逆に、命令コードに続く2バイトで示すメモリアドレスの値をAレジスタに書き込む命令でした。
STAやLDAが命令コードに続く2バイトの値をメモリアドレスとするのに対して、STAXとLDAXはBCレジスタまたはDEレジスタの値が示すメモリアドレスとAレジスタとの間でデータの受け渡しをします。
すでに説明した命令で、STAやLDA以外に、STAX、LDAXにもっと良く似た命令があります。
MOV命令のうち、片方がAレジスタで片方がメモリである命令、MOV A,M と、MOV M,A は、HLレジスタの値が示すメモリアドレスとAレジスタの間でデータのやり取りをしました。
HLレジスタの値の代わりにBCレジスタの値をメモリアドレスとするのが、STAX BとLDAX Bで、DEレジスタの値をメモリアドレスとするのが、STAX D、LDAX Dです。
命令コードは次の通りです。
命令コード(2進数) 命令コード(16進数) ニーモニック
00000010 02 STAX B
00010010 12 STAX D
00001010 0A LDAX B
00011010 1A LDAX D
STAX B、STAX Dは、Aレジスタの値をBC、DEが示すメモリアドレスに書き込む命令で、LDAX B、LDAX Dは、BC、DEが示すメモリアドレスの値をAレジスタに書き込みます。
MOV命令では、メモリとAレジスタとの間だけではなくて、MOV B,Mとか、MOV M,Eとかというように、メモリとAレジスタ以外のレジスタとの間でもデータのやり取りができました。
しかしSTAX、LDAXはAレジスタとBC、DEが示すメモリアドレスとの間でのデータのやり取りができるだけで、その他のレジスタとメモリとの間でのデータのやり取りをすることはできません。
前回説明したSTA、LDAと同様、このSTAX、LDAXもニーモニックの命名の仕方にちぐはぐなものを感じます。
HLレジスタの代わりにBCレジスタやDEレジスタを使うだけで、MOV A,M やMOV M,Aと全く同じ動作をするというのに、どうしてこのようなおおげさなニーモニックにしてしまったのでしょう?
たださえマシン語は難しい感じがするのに、これではなおさら覚えるのが一苦労で、ますます敬遠したくなってしまいます。
その点、Z80のニーモニックはあっさりと全部LDで片付けてしまいます。
●インテルニーモニックとザイログニーモニック
8080ニーモニックとZ80ニーモニックを比較してみましょう(昔は8080ニーモニックをインテルニーモニック、Z80ニーモニックをザイログニーモニックなどと呼んでいました)。
8080ニーモニック Z80ニーモニック
MOV A,M LD A,(HL)
MOV M,A LD (HL),A
LDAX B LD A,(BC)
LDAX D LD A,(DE)
STAX B LD (BC),A
STAX D LD (DE),A
LDA 1234 LD A,(1234)
STA 1234 LD (1234),A
Z80ニーモニックの方は、命令の意味が一目瞭然、です。
こうして比べてみると、圧倒的にZ80に軍配があがりそうなものなのですが…。
かく言う私自身も8080ニーモニックを不統一だなどと批判してきましたけれど…。
こうして両者を並べて比較してみると。
うーん。
歳をとったせいなのでしょうか、昔からずっと何も感じないで使ってきたニーモニックなのですけれど、今はなぜか感慨深い、何かを感じてしまいます。
今までと視点を変えて、別の角度から両者を比べてみると、Z80ニーモニックの方が、より記号言語的で無味乾燥な感じがするのに比べて、8080ニーモニックは、より人間くささを感じます。
結局ZilogはIntelをしのぐことはできず、世はIntelとMicrosoftの天下の様相を呈していますが、それにもかかわらず、この8080ニーモニックと、それに続くものとして世にあらわれたZ80ニーモニックの違いは、その後のCPUの進歩によって、私たちが失ってしまったものを、なぜか暗示しているかのように思えます。
技術の進歩によって、私たちが得るものと、逆に失ってしまうものとは、果たしていずれが重いのでしょうか?
●STAX命令、LDAX命令のタイミングチャートです
T4〜T7の期間の動作は前回説明したSTA、LDAとよく似ています。
STA、LDAは、2バイトの値をメモリから読み込んで、ワークレジスタWKL、WKHに格納しましたが、STAX、LDAXでは、レジスタBCまたはレジスタDEの値をワークレジスタに格納します。
なぜBC、DEレジスタの値を一旦ワークレジスタに移すかというと、HLレジスタやWKレジスタと違って、BCレジスタ、DEレジスタはその値を直接外部アドレスバスに出力するような回路にはなっていないからです。
こうしてBCレジスタ、またはDEレジスタの値をWKレジスタに移してから、その値を外部アドレスバスに出力します。
このあとのT8、T9の動作はSTA、LDAと全く同じです。
STAXの場合にはAレジスタの値をメモリに書き込みます。
LDAXの場合にはメモリの値をAレジスタに書き込みます。
●STAX命令、LDAX命令の回路図です
図の右上からすこし下へ行ったところで、MVreg16という信号をアクティブにしています。
T4〜T7の部分は他の命令にも共通しているものがありますから、命令回路から独立させて、他の命令回路でも利用できるようにしました。それがMVreg16です。
JMP命令やSTA、LDA命令のときのPCtoReg16に似ていますが、PCtoReg16はPC(プログラムカウンタ)が示すメモリアドレスの値をレジスタに格納するのに対し、MVreg16は、16ビットの値をレジスタ間で転送します。
MVreg16の回路は、上の回路図の下方にあります。
タイミングチャートの説明を書いていて気がつきました。
T8、T9の期間の回路は、STAとSTAX、LDAとLDAXとで全く同じでした。
基板を作る前に気がついていたら、どちらか片方だけにできたのですが、今からそれをしても手間がかかるだけですから、今回はこのままにしておくことにします。
2008.9.13upload
前へ
次へ
ホームページトップへ戻る