ストリング命令(ブロック転送命令)

命令 説明
movsb move string byte

SIレジスタのさす1バイトのメモリの内容をDIレジスタのさすメモリに転送し, SIおよびDIレジスタをインクリメントまたはデクリメントする. つまりC言語で文字列をコピーするときによくやる “*s++ = *t++” が一撃でできる命令. さらに,repプレフィックス(リピートプレフィックス)を使うことで, このmovsb命令を,CXレジスタで指定した回数だけ繰り返すように指定することができる. つまり,C言語の文字列コピー手続き “while (i--) *s++ = *t++;”が “rep movsb”だけでできちゃうという優れもの.

コード例
mov SI, 0000H
mov DI, 1000H
mov CX, 0100H
cld
rep movsb





cld/std:ディレクション フラグ(DF)のクリア・セット

命令 説明
cld clear direction flag.
ストリング命令はSI,DIをインクリメントする.
std set direction flag.
ストリング命令がSI,DIをデクリメントするようになる.

フラグレジスタのDF(ディレクションフラグ)ビットをクリア・セットする命令. DFはクリアされているときは,ストリング命令でSIおよびDIレジスタがインクリメントされるようになり, セットされているときはデクリメントされるようになる.

movswはワード単位で転記をおこなう. movswが使えるときは,movswを使ったほうが2倍の速さでコピーができる(ほんと?)

ストリング命令
命令 動作
movs{b,w}
lods{b,w} SIで指定するメモリからAレジスタにデータをロードする. ロード先が固定長のAレジスタなので, REP命令との組み合わせはあまり意味がなく,通常単発で使用する.
stos{b,w} DIで指定するメモリにAレジスタの内容をストアする. こちらはREPプレフィックスを指定することに意味がある. つまりメモリ領域をAレジスタに指定した値で塗りつぶすというような用途に役立つ.
cmps{b,w} REPZプレフィックスと組み合わせて, SIで指定されたブロックとDIで指定されたブロックを比較し差異が見つかったところで停止する. C言語のstrcmp()作るのに使えますね.
scas{b,w} REPNZプレフィックスと組み合わせて, DIで指定されたブロックと,Aレジスタの内容を比較し, 同じデータが見つかったところで停止する. Aレジスタに番兵をおいてリニアサーチするのに便利かも.

REP:リピートプレフィックス

Prefix 機能
REP
REPZ ストリング命令を1回実行するたびに,CXレジスタをデクリメントし, CXレジスタが0でなく,フラグレジスタが0の間繰り返す.
REPNZ ストリング命令を1回実行するたびに,CXレジスタをデクリメントし,CXレジスタが0でなく,フラグレジスタが1である場合,繰り返す.

MS-DOSの文字列終端は“$

MS-DOSでは文字列の終端は“$”(0x00ではなく$)なので,要注意.


はたいたかし
May 5, 2006.
トップ > 開発ツール > 8086