ロードとストア


ストリング操作による読みこみ

ストリング操作命令は MOVS だけではありません
今回は、メモリ間の転送ではなくレジスタを介したロードやストアを行いましょう

メモリからレジスタへデータをロードするには LODS 命令があります
LODS は、SIレジスタの指すオフセットアドレスからデータをレジスタにロードし
SIレジスタの内容をインクリメント(またはデクリメント)するという命令です

LODS は、明示オペランド形式であり、第一引数にソースオペランドのサイズを指定します
バイトが指定されれば、ポインタから1バイトのデータをALレジスタに格納し
ワードが指定されれば、ポインタから2バイトのデータをAXレジスタに格納します

オペランドなし形式では、バイトサイズのLODSBと、ワードサイズのLODSWになります
これらの命令は、次のような関係でもあります

LODSB = MOV AL , [SI]
INC(DEC) SI

この命令は、リピートプリフィックスを用いることはまずありません
通常は MOV によるロードでも十分です
-A 100
15F2:0100 MOV BYTE PTR[200] , 41
15F2:0105 MOV SI , 200
15F2:0108 CLD
15F2:0109 LODSB
15F2:010A

-G =100 10A

AX=0041  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0201  DI=0000
DS=15F2  ES=15F2  SS=15F2  CS=15F2  IP=010A   NV UP EI PL NZ NA PO NC
まず、メモリに 41 というバイト値をストアします
これを、ストリング操作命令 LODSB によって AX レジスタに読みこんでいます


効率的初期化

汎用レジスタの内容をメモリに連続的にストアするストリング操作もあります
これを用いることで、一定領域を初期化することができます

レジスタからメモリにストアするには STOS を用います
STOS は明示オペランド形式で、第一オペランドにストアするデータのサイズを指定します
バイトサイズであれば、ALレジスタの内容をDIレジスタの指すオフセットアドレスに
ワードサイズであれば、AXレジスタの内容をストアし、DIレジスタをインクリメント(またはデクリメント)します

オペランドなし形式では バイトサイズのSTOSBと、ワードサイズのSTOSWがあります
これらのストリング操作は、次のような関係でもあります

STOSB = MOV [DI] , AL
INC(DEC) DI

リピートプリフィックスと併用することで、連続してレジスタの内容をストアできます
そのため、特定領域の初期化はこの方法がもっとも有効です
-A 100
15F2:0100 MOV AX , 0
15F2:0103 MOV DI , 200
15F2:0106 MOV CX , 80
15F2:0109 CLD
15F2:010A REP STOSW
15F2:010C

-G =100 10C

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0300
DS=15F2  ES=15F2  SS=15F2  CS=15F2  IP=010C   NV UP EI PL NZ NA PO NC 

-D 200
15F2:0200  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0230  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0240  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0250  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0260  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0270  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-D 2F0 301
15F2:02F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
15F2:0300  4B 69                                             Ki
どうでしょうか、ワード単位でAXレジスタの内容を80回ストアしました
結果として、オフセットアドレス200〜299までが 0 で埋めつくされています



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