Windows上でJWASM(フリーのMASM6互換アセンブラ)と98エミュを使ってのプログラム作成に関するエトセトラ。また、PC-98プログラミング関係の書籍紹介とか自作ソフトの進捗とかも。

クロック数に関する覚書

CPUの違いによって、最適なコードが異なるというお話です。

axレジスタを0クリアする場合

mov ax,0
xor ax,ax
の二つがよく使われるものだと聞きます。
プログラマーズbibleによると、286以降ではこれらに速度の違いはなく、286は2、386は2、486は1の様です。
ゼロフラグの変化が違う以外は同じように使えます。

しかし、V30プログラマーズリファレンスによると、xorを使った場合はV30で2クロック、8086では3クロックで済みます。
一方movでは共に4クロックかかります。

まあ、よほどのことがない限りは誤差ですけど、古い機種対応の場合はxorがよいようです。
命令のバイト数は、8bitのレジスタの場合は2で等しく、16bit以上ではmovの方が数値分だけ容量を食うみたいです。

シフトの場合

互換性を保つ場合はshl ax,1を書き連ねていくパターンと、
mov cl,3
shl ax,cl
というパターンがあります。
更に、186以降ではshl ax,3という書き方もあります。

1を書き連ねていく場合は、286、V30や8086では2クロックで、2バイトの命令です。
よって、n回シフトすると2nクロックで2nバイトかかります。
386と486では3クロックかかるので、3nクロックとなります。

clを挟む場合、V30などではmovだけで10クロック以上かかって、更にシフト自体で7クロック以上かかるのでまず勝負になりません。
しかし、286、386のmovは2クロック、486に至っては1クロックで済み、シフトは286で5クロック、386と486では3クロックなので、互換性を維持したプログラムの場合は新しい機種ではclを挟む方が早くなります。

186以降で使える即値指定の場合は、V30で7+nクロック、286で5、386で3、486では2となるので、8086のかなり古い機種を無視するのなら一番使いやすいと思われます。

※メモリをシフトする場合はより遅くなり、クロック数も変わってきます。

Menu

管理人/副管理人のみ編集できます