パソコン活用研究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
|
興味ある方は実験してみてください。
マシンスペックの高いパソコンでは、差のわかりにくい実験だったかもしれませんが、いかがだったでしょう?
機械語に惚れましたか。そういう方は「パソコン活用研究ラピュタへの道/アセンブラ」(準備中)をのぞいて
みてください。ここでとりあげたサンプルコードは近日中にダウンロードできるようにしたいと思います