標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第100回]

●XTHL命令

ふだん余り使うことの無い命令です。
OPコードは”E3”です。
スタックトップの2バイトとHLの内容を交換します。

[第91回]で説明したXCHG命令のOPコードは”EB”でした。
OPコードは1ビット違っているだけです。
XCHGはHLとDEの値を交換する命令でしたが、XTHLはHLとメモリ(スタック)の値を交換する命令です。

XCHGは、わりとよく使う命令ですが、XTHLは滅多に使うことは無いと思います。
多分すべてのレジスタを使っていて、その上さらにレジスタを使う必要が出てきたときなどが想定されます。

たとえばHLレジスタに2つの値(dataA、dataB)を交互に入れて、何かの計算などをしたい場合を考えます。

LXI H,dataA
    :
(ここでdataAを使う処理をする)
    :
LXI H,dataB
    :
(ここでdataBを使う処理をする)

というように、それぞれ1回だけの処理なら、上のようにLXI H命令を使えばよいのですが、処理内容は異なるけれど、dataAとdataBを使う処理が何回も続く、ということになると、なんとかできないかなぁ、という気になってしまいます。
そんなときにXTHLを使うことができます(でもあとからプログラムを見たときに、何をやっているのか理解しづらいかもしれません)。
下のように書けると思います。

LXI H,dataB
PUSH H
LXI H,dataA
    :
(ここでdataAを使う処理をする)
    :
XTHL
    :
(ここでdataBを使う処理をする)
    :
XTHL
    :
(ここでdataAを使う処理をする)
    :

アセンブラで書くと、LXI命令の代わりにXTHLを使っているだけなので、どこにメリットがあるの?
と疑問に思うかもしれません。
最大のメリットはメモリの節約なのです。
LXI命令はマシン語では3バイトになりますがXTHLは1バイトで済みます。
(もちろんDEレジスタが空いておれば、XCHGを使うことになります。ここではDEレジスタが空いていない、という想定です)

昔はメモリが高価だったので、いかにして短いプログラムにするか、というのは切実な問題だったのです。
今はメモリも安くなりましたので、普通のプログラムならば、プログラムサイズを気にすることは余りないと思います。

もうひとつまったく別の理由があるかも知れません。
これはメリット、デメリットの問題ではなく、好み、というか、「美学」の問題と言えるかもしれません。
最初のプログラム例のように、
LXI H,dataA
LXI H,dataB
LXI H,dataA
と同じLXI命令を繰り返し書くのは、なんだかシロートくさくて面白くない、と感じるかもしれません。
XTHLを使うとなんだか「かっこいい」じゃありませんか。

でも本当のことを言うと、「かっこいい」プログラムというのは、あまりよくありません。
いいプログラムとは、わかりやすいプログラム、だと思います。
そういう意味では「どんくさい」プログラムのほうが、いいプログラムだと思います。

プログラムなんて、ようは、動けばいいのですよ。かっこつけて書く必要はありません。

もっとも、そう言ってしまうと、ミもフタもなくなってしまって、XTHLの出番などありません。
いつかは出番もあるでしょう、ということで、XTHL命令の回路の説明に戻ります。

●XTHL命令のタイミングチャートです



考え方はXCHGと同じです。
処理は3つのパートに分かれます。
期間W1ではLレジスタの値をWKLレジスタに、Hレジスタの値をWKHレジスタに入れます。
期間W2ではスタックトップの値をLレジスタに、スタックトップの1バイト前(SP+1)の値をHレジスタに入れます。
最後の期間W3ではWKLレジスタの値をスタック(SP+1)に、WKHレジスタの値をスタック(SP)に入れます。

s3−s0とregRD、d3−d0とregWRによってレジスタが選択され、値の読み出し、書き込みが行われます。
s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

●XTHL命令の回路図です



タイミングチャートのW1の部分は、STAX命令、LDAX命令([第66回])と同じです。
この部分は、STAX命令、LDAX命令の回路図([第66回])の「MVreg16」を利用します。
2008.10.21upload

前へ
次へ
ホームページトップへ戻る