パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
機械語の威力
機械語の威力などといかめしいお題をつけてしまいましたが、実際のところBASIC−−>
機械語でどのくらい実行スピードがあがるのか、興味のあるところではないでしょうか。
というわけで、機械語の威力がどれほどか、試してみたいと思います。
実験プログラムは画面のスクロールです。下のような画面を上にスクロールしていきます。
同じ事をやるプログラムをBASICと機械語で組んで実験してみましょう。
ただし、マシンのスペックが高い場合、BASICでもかなり高速で、機械語と差がわからない
かもしれません。CPUクロックが100MHZ前後なら、かなり差がでると思いますが、
300MHZ以上ではわからないかもしれません。ちなみに、おじさんの実験環境は
Pentium75です。このスペックでは歴然とした差があります。10倍以上はスクロール
スピードが違うでしょう。
1HELLO! World I am Tsuyoshi Kasai 2HELLO! World I am Tsuyoshi Kasai 3HELLO! World I am Tsuyoshi Kasai 4HELLO! World I am Tsuyoshi Kasai 5HELLO! World I am Tsuyoshi Kasai 6HELLO! World I am Tsuyoshi Kasai 7HELLO! World I am Tsuyoshi Kasai 8HELLO! World I am Tsuyoshi Kasai 9HELLO! World I am Tsuyoshi Kasai 10HELLO! World I am Tsuyoshi Kasai 11HELLO! World I am Tsuyoshi Kasai 12HELLO! World I am Tsuyoshi Kasai 13HELLO! World I am Tsuyoshi Kasai 14HELLO! World I am Tsuyoshi Kasai 15HELLO! World I am Tsuyoshi Kasai 16HELLO! World I am Tsuyoshi Kasai 17HELLO! World I am Tsuyoshi Kasai 18HELLO! World I am Tsuyoshi Kasai 19HELLO! World I am Tsuyoshi Kasai 20HELLO! World I am Tsuyoshi Kasai 21HELLO! World I am Tsuyoshi Kasai scroll by QBASIC coded by Tsuyoshi Kassi Push any key to start |
(1) BASIC
セグメントレジスタ&HB800はVRAMのテキストエリア(DOS/V機)です。
PEEK,POKEでテキストエリアのデータをひたすら、移動させることによりスクロールさせています。
文字は1文字で2バイト(文字コード+属性)のエリアをとっているので、80桁モードでは、160番地づつ
データを移動するとちょうど1行移動することになります。(説明がわかりにくいかもしれませんが)
おじさんの環境でこれを実行すると、1行づつスクロールアップしていくのが、目で確かめられます。
SCROLB.BAS (QBASIC用)
CLS DEF SEG = &HB800 FOR i = 1 TO 21 COLOR i MOD 16 PRINT SPC(i); STR$(i); "HELLO! World I am Tsuyoshi Kasai" NEXT PRINT SPC(22); "scroll by QBASIC coded by Tsuyoshi Kassi" FOR i = 0 TO 20 FOR j = 80 TO 80 * 24 c = PEEK(j * 2): a = PEEK(j * 2 + 1) POKE j * 2 - 160, c: POKE j * 2 + 1 - 160, a NEXT j NEXT i |
(2) 機械語その1
スクロールの部分を機械語にしてみました。やってることはBASICと同じです。データを160番地づつ移動
させているだけです。実行すると、おじさんの環境でさえ一瞬のうちにスクロールが終了してしまいます。
画面の表示がおいつかなくて、スクロールしているのがわからないと思います。
機械語はいわゆるブロック転送という基本的なものですが、ここにかいたのはへぼです。もっと高速化できます。
SCROLM.BAS (QBASIC用)
DIM a%(20) CLS DEF SEG = VARSEG(a%(0)) FOR i = 0 TO 34 READ d$ POKE VARPTR(a%(0)) + i, VAL("&h" + d$) NEXT FOR i = 1 TO 21 COLOR i MOD 16 PRINT SPC(i); STR$(i); "HELLO! World I am Tsuyoshi Kasai" NEXT PRINT SPC(22); "scroll by QBASIC coded by Tsuyoshi Kassi" PRINT "Push any key to start": b$ = INPUT$(1) CALL absolute(VARPTR(a%(0))) DATA 1e: 'push ds DATA b8,0,b8: 'mov ax,b800 DATA 8e,d8: 'mov ds,ax DSを&HB800にセット DATA b3,15: 'mov bl,15 &H15=21回スクロールアップ DATA be,a0,0: 'L0008: mov si,00a0 DATA bf,0,0: 'mov di,0000 DATA b9,80,7: ' mov cx,780 DATA 8b,4: 'L0011: mov ax,[si] DATA 89,5: 'mov [di],ax DATA 83,c6,2: 'add si,+2 DATA 83,c7,2: 'add di,+2 DATA e2,f4: 'loop L0011 DATA fe,cb: 'dec bl DATA 75,e7: 'jnz L0008 DATA 1f: 'pop ds DATA cb: 'retf |
(3) 機械語その2
機械語その1が速すぎて、目でおえないのでキー入力があると機械語をコールするプログラムにしました。
機械語は1行スクロールするだけにしてあります。キー入力があると機械語をコールして1行スクロールアップ
します。すなわちスクロールのスピードは、キーのオートリピート率によることになります。キーのオートリピート
率が高速に設定されていれば、かなりはやくスクロールすると思います。
SCROLML.BAS (QBASIC用)
DIM a%(20) CLS DEF SEG = VARSEG(a%(0)) FOR i = 0 TO 30 READ d$ POKE VARPTR(a%(0)) + i, VAL("&h" + d$) NEXT FOR i = 1 TO 21 COLOR i MOD 16 PRINT SPC(i); STR$(i); "HELLO! World I am Tsuyoshi Kasai" NEXT PRINT SPC(22); "scroll by QBASIC coded by Tsuyoshi Kassi" PRINT "Push any key to start": b$ = INPUT$(1) FOR i = 0 TO 20 CALL absolute(VARPTR(a%(0))) b$ = INPUT$(1) NEXT PRINT "push space key" rest: b$ = INKEY$ IF b$ <> " " THEN GOTO rest DATA 1e: 'push ds DATA b8,0,b8: 'mov ax,b800 DATA 8e,d8: 'mov ds,ax DATA b3,15: 'mov bl,15 DATA be,a0,0: 'L0008: mov si,00a0 DATA bf,0,0: 'mov di,0000 DATA b9,80,7: ' mov cx,780 DATA 8b,4: 'L0011: mov ax,[si] DATA 89,5: 'mov [di],ax DATA 83,c6,2: 'add si,+2 DATA 83,c7,2: 'add di,+2 DATA e2,f4: 'loop L0011 'DATA fe,cb: 'dec bl 'DATA 75,e7: 'jnz L0008 DATA 1f: 'pop ds DATA cb: 'retf |
興味ある方は実験してみてください。
マシンスペックの高いパソコンでは、差のわかりにくい実験だったかもしれませんが、いかがだったでしょう?
機械語に惚れましたか。そういう方は「パソコン活用研究ラピュタへの道/アセンブラ」(準備中)をのぞいて
みてください。ここでとりあげたサンプルコードは近日中にダウンロードできるようにしたいと思います