パソコン活用研究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

                                               

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


TOP PAGE >Basic活用研究目次