ポインタ


ポインタとして使う

MOVによるデータのロードやストアに、レジスタを使うことができました
しかし正確には、全てのレジスタを指定できるわけではありません
オフセットアドレスを指定するのに使うことができるレジスタは決まっています

オフセットアドレスを指定するためのレジスタは BX , BP , SI , DI の4つです
このうち、SI(ソース)とDI(ディスティネーション)はインデックスレジスタです
インデックスレジスタの目的は、まさにオフセットアドレスの格納です
オフセットアドレスの格納を目的とすること以外は、汎用レジスタと大差ありません

BPは、特殊レジスタの一種ですが、これも利用することができます
これらのレジスタを、[ ] で囲むことで、オフセットアドレスとして利用できます
-A 100
15F2:0100 MOV BX , 0200
15F2:0103 MOV WORD PTR [BX] , 1234
15F2:0107 MOV AX , [BX]
15F2:0109
このプログラムを実行した結果、以下のような情報が得られます
-D 200 201
15F2:0200  34 12                                             4.

-R AX
AX 1234
ちゃんと、ベースレジスタに格納したオフセットアドレスにストアされています
このように、レジスタをオフセットアドレスとして利用し
メモリにアクセスすることをポインタとして使うと呼びます

ポインタとして使う場合、レジスタと即値を用いて相対的にアドレスを指定できます

[R + VALUE]

R にはレジスタ名を、VALUE には即値を指定します
こうすると、RをベースとしてVALUEを加算したオフセットアドレスを表すことができます
-A 100
15F2:0100 MOV BX , 0200
15F2:0103 MOV WORD PTR [BX] , 4443
15F2:0107 MOV WORD PTR [BX + 2] , 4241
15F2:010C
[BX + 2] というアドレス指定は、BXの内容に2を加算した値がオフセットアドレスになります
この場合、BXは 200h なので実際は 202h が対象となります

このとき、右辺に使われる相対的な値をディスプレースメントといいます
上の表の「BX + 2」の即値はディスプレースメントであると呼べます
ポインタと指定しようできるレジスタとディスプレースメントを組み合わせて
より高度に、相対的にオフセットアドレスを指定することができます

ただし、ベース + 即値 + ディスプレースメント という組み合わせで BP は使えません
SIなどを用いる必要があります



前のページへ戻る次のページへ