命令 | 説明 |
---|---|
movsb |
move string byte |
SIレジスタのさす1バイトのメモリの内容をDIレジスタのさすメモリに転送し,
SIおよびDIレジスタをインクリメントまたはデクリメントする.
つまりC言語で文字列をコピーするときによくやる
“rep
プレフィックス(リピートプレフィックス)を使うことで,
このmovsb命令を,CXレジスタで指定した回数だけ繰り返すように指定することができる.
つまり,C言語の文字列コピー手続き
“while (i--) *s++ = *t++;
”が
“rep movsb
”だけでできちゃうという優れもの.
コード例 |
---|
mov SI, 0000H
|
命令 | 説明 |
---|---|
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言語の |
scas{b,w} |
REPNZプレフィックスと組み合わせて, DIで指定されたブロックと,Aレジスタの内容を比較し, 同じデータが見つかったところで停止する. Aレジスタに番兵をおいてリニアサーチするのに便利かも. |
Prefix | 機能 |
---|---|
REP |
|
REPZ |
ストリング命令を1回実行するたびに,CXレジスタをデクリメントし, CXレジスタが0でなく,フラグレジスタが0の間繰り返す. |
REPNZ |
ストリング命令を1回実行するたびに,CXレジスタをデクリメントし,CXレジスタが0でなく,フラグレジスタが1である場合,繰り返す. |
$
”
MS-DOSでは文字列の終端は“$
”(0x00
ではなく$
)なので,要注意.