パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

BASICからマシン語へ2
(VARSEG,VARPTRを使う)(QBasic)

VARSEG, VARPTRは変数の値が格納されているのセグメントアドレス(以下SEGと略す)、
オフセットアドレス(以下OFFと略す)を示す関数です。普段のプログラムではまず使うことが
ないと思いますが、今回はこれで、変数がどんな風に、メモリーに格納されているのか、
覗いてみることにします。BASICとマシン語をリンクしたプログラムを組むような場合、ここら
へんの知識が必要になってくると思います。

まずは、簡単にVARSEG,VARPTRの使い方から。
VARSEG(変数)    変数のSEGが得られます
VARPTR(変数)    変数のOFFが得られます

以下のプログラムは文字変数(x0$、x1$)、整数変数(x2%、x3%)、単精度実数(x4からx7)
の格納状態を表示するプログラムです。
このプログラムでは、変数の格納されている値の2Byte前からメモリーの中身を表示するように
しています。(Line21の行) なぜなら、手前2Byteに変数の型をしめすデータが入っている
ようなので。(QBasicの資料がないので、あくまで推測)
また、文字変数については、VARSEG,VARPTRで示されるアドレスに格納されているのは、
実際の文字列データではなく、String Discripterとよばれる、実際の文字列データの格納されて
いる番地を示すデータです。従って、サブルーチン(char:)に飛ばして、string discripterの番地
を再度読み込んでいます。(その下にキャラクタに直してメモリーのデータを表示)
プログラムの概要が分かったところで、その下の結果画面を見て下さい。

VARPT.BAS (QBasic用)

CLS
'DEFINT X
x0$ = "abcde"
x1$ = "12345"
x2% = 1: x3% = 2
x4 = 1: x5 = .25: x6 = .5: x7 = 2
a(0) = VARSEG(x0$): b(0) = VARPTR(x0$)
a(1) = VARSEG(x1$): b(1) = VARPTR(x1$)
a(2) = VARSEG(x2%): b(2) = VARPTR(x2%)
a(3) = VARSEG(x3%): b(3) = VARPTR(x3%)
a(4) = VARSEG(x4): b(4) = VARPTR(x4)
a(5) = VARSEG(x5): b(5) = VARPTR(x5)
a(6) = VARSEG(x6): b(6) = VARPTR(x6)
a(7) = VARSEG(x7): b(7) = VARPTR(x7)

PRINT "No.1 "; x0$; " NO.2 "; x1$; " NO.3 "; x2%; " NO.4 "; x3%; " NO.5 "; x4; " NO.6 "; x5; " NO.7 "; x6; " NO.8 "; x7

FOR i = 0 TO 7
PRINT "NO."; i + 1; " SEGadr: OFFadr "; HEX$(a(i)) + " " + HEX$(b(i))
DEF SEG = a(i)
FOR j = 0 TO 5
PRINT HEX$(PEEK(b(i) - 2 + j)) + " ";       'Line21
NEXT j
PRINT
IF i = 0 OR i = 1 THEN GOSUB char
NEXT i
END

char:
adr = PEEK(b(i) + 2) + PEEK(b(i) + 3) * 256   'String Discripterの番地
FOR k = 0 TO 5
PRINT HEX$(PEEK(adr + k)) + " ";
NEXT k
PRINT
FOR k = 0 TO 5
PRINT CHR$(PEEK(adr + k));
NEXT k
PRINT
RETURN


NO.1はabcdeという文字列です。データは 5 13 5 0 A0 7F と並んでいます。
最初の 5 13 はおそらく、文字変数の型であることを示すデータです。(推測)
次の 5  は このデータのサイズです。ここは5Byteであることを示しています。
その後の A0 7F はString Discripterです。 実際の文字データは&H7FA0(OFFです)
にあることを示しています。
それで、&H7FA0番地から読み込むと、61 62 63 64 65 というデータが入っています。
これをキャラクタに直したのが、 abcde です。これで、x0$の文字データの格納されている
状態がわかりました。
NO.2は同じことです。ご自分で確かめて下さい。

NO.3は整数変数の 1 です。  データは 1 13  1 0 と並んでいます(その後のデータは
おそらく関係ない)
最初の 1 13 は整数変数であることを示すデータです(推測)
次の 1 が 変数x2%のデータです。
おそらく、整数変数の格納サイズは2byteです。

NO.5以下は単精度実数変数です。ここからは、話がややこしくなります。整数と違い実数は
浮動小数点方式という方式でデータが、格納されます。
NO.5の変数 x4も 1 ですが、 NO.3の整数変数の 1 とは、違う方式で格納されています。
データをみてみると 3 11 0 0 80 3F となっています。
最初の 3 13 はおなじみの、単精度実数を示すデータでしょう。
そして 次の4Byteが仮数部、3F が指数部だと思われます。
浮動小数点について、詳しいことは
「パソコン活用研究ラピュタへの道/カセットインターフェイスによるデータ通信」にまとめ
ましたので、参考にして下さい。浮動小数点方式といっても、若干違いがあると思いますが、
基本は同じです。


TOP PAGE >Basic活用研究目次