ストリング命令とリピートプレフィクス

配列のような多バイトに渡るデータを高速に処理するために、ストリング命令が用意されています。ほとんどの場合、ストリング命令はリピートプレフィクスとともに使用し、ある条件が成立するまで繰り返し実行します。

ストリング命令とリピートプレフィクスには、それぞれいくつかの種類がありますが、一定の組み合せ以外は意味を持ちません。この節では、ストリング命令とリピートプレフィクスを組にして説明します。

なお、ストリング命令はリピートプレフィクスを伴わずに単独で使用することも可能です。この場合、後に述べる SI/DI レジスタの更新は行われますが、繰り返しや C

X レジスタの更新は行われません。

リピートプレフィクスは、ストリング命令以外の命令と組み合わせることはできません。

ストリング命令の種類

はじめに、ストリング命令(とリピートプレフィクスの有意味な組)を列記します。

    REP MOVS       転送(配列の複写)
    LODS           ロード(AX/AL へ値をロードし、SI を更新する)
    REP STOS       ストア(AX/AL 値を連続してストアする)
    REPE SCAS     比較(AX/AL 値と一致しないところを探す)
    REPNE SCAS    比較(AX/AL 値と一致するところを探す)
    REPE CMPS     比較(2 つの配列で値の一致しないところを探す)
    REPNE CMPS    比較(2 つの配列で値の一致するところを探す)
    REP INS       I/O ポート連続入力(80186 以上のみ)
    REP OUTS     I/O ポート連続出力(80186 以上のみ)
共通の使用法

ストリング命令には、いくつか共通の使い方があります。次に、ストリング命令の使用に先だって値をセットしなければならないレジスタとフラグを示します。

CX

繰り返し数をセットします。CX レジスタは繰り返しのたびにデクリメントされ、0 になると繰り返しが終了します。

ただし、SCAS 命令、CMPS 命令においては、条件さえ成立すれば CX レジスタが 0 になる前に繰り返しを終了します。

DS:SI

ソース配列のアドレスをセットします。セグメントオーバーライドを用いれば、使用するセグメントレジスタを DS から変更することが可能です。

ソース配列には、MOVS 命令の転送元、LODS 命令のロード元、CMPS 命令の片方の配列、OUTS 命令のデータ元があります。

ES:DI

デスティネーション配列のアドレスをセットします。使用するセグメントレジスタは ES から変更することはできません。先にあげたソース配列以外の対象は、すべてデスティネーション配列です。

DF(フラグレジスタ FLAGS に含まれるディレクションフラグ)

DF が 0 ならば、繰り返しのたびに SI/DI は値を増し、DF が 1 ならば値を減らします。通常、MS-DOS におけるプログラム開始時には、DF は 0 になっています。

ストリング命令の構文

各ストリング命令には、それぞれ 3 種類の構文があります。MOVS 命令を例にして、これらの構文を説明します。

構文    [REP] MOVSB
    [REP] MOVSW
    [REP] MOVS    [ES:]<目的>,[:]<ソース>

ストリング命令には、一度に処理するバイト数によって、BYTE(8 ビット)タイプと WORD(16 ビット)タイプがありますが、1 行目では BYTE タイプを、2 行目では WORD タイプを指定しています。

3 行目は最も汎用的な構文であり、1、2 行目の構文を包含します。この構文では<目的>と<ソース>にダミーのメモリオペランドを指定し、そのタイプによって一度に処理するバイト数を決定します。また、<SR>にセグメントレジスタを指定すれば、使用するセグメントレジスタを DS から変更することができます。

なお、この場合の<目的>と<ソース>はダミーオペランドであり、そのタイプだけが意味を持ちます。これらは実際の SI や DI の値をセットするものではありません。

次に、上記の例の 3 行目の構文に相当する構文を、すべてのストリング命令について示します。

構文    [REP] MOVS    [ES:]<目的>,[:]<ソース>
     LODS          [:]<ソース>
    [REP] STOS         [ES:]<目的>
    [REPE|REPNE] SCAS    [ES:]<目的>
    [REPE|REPNE] CMPS    [:]<ソース>,[ES:]<目的>
    [REP] INS          [ES:]<目的>,DX
    [REP] OUTS          DX,[:]<ソース>
例    REP MOVSB
    REPNE SCASW
    REP MOVS     ES:DEST, SRC
    LODS          SRC
    REP STOS     ES:DEST
    REPE SCAS    ES:DEST
    REPE CMPS    SRC, ES:DEST
    REP INS      ES:DEST, DX
    REP OUTS      DX, SRC

[目次]