アセンブリ-文字列
前の例では、すでに可変長文字列を使用しています。可変長文字列には、必要な数の文字を含めることができます。一般に、文字列の長さは2つの方法のいずれかで指定します-
- 文字列の長さを明示的に格納する
- 番兵の使用
ロケーションカウンターの現在の値を表す$ロケーションカウンターシンボルを使用して、文字列の長さを明示的に格納できます。次の例では-
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
$は、文字列変数msgの最後の文字の後のバイトを指します。したがって、$-msg文字列の長さを示します。書くこともできます
msg db 'Hello, world!',0xa ;our dear string
len equ 13 ;length of our dear string
または、文字列の長さを明示的に格納する代わりに、末尾に番兵文字を使用して文字列を格納し、文字列を区切ることもできます。センチネル文字は、文字列内に表示されない特殊文字である必要があります。
例-
message DB 'I am loving it!', 0
文字列命令
各文字列命令には、ソースオペランド、デスティネーションオペランド、またはその両方が必要な場合があります。32ビットセグメントの場合、文字列命令はESIレジスタとEDIレジスタを使用して、それぞれソースオペランドとデスティネーションオペランドを指します。
ただし、16ビットセグメントの場合、SIレジスタとDIレジスタは、それぞれ送信元と宛先を指すために使用されます。
文字列を処理するための5つの基本的な命令があります。彼らは-
MOVS −この命令は、1バイト、ワード、またはダブルワードのデータをメモリ位置から別の位置に移動します。
LODS−この命令はメモリからロードされます。オペランドが1バイトの場合はALレジスタにロードされ、オペランドが1ワードの場合はAXレジスタにロードされ、ダブルワードがEAXレジスタにロードされます。
STOS −この命令は、レジスタ(AL、AX、またはEAX)からメモリにデータを格納します。
CMPS−この命令は、メモリ内の2つのデータ項目を比較します。データは、バイトサイズ、ワード、またはダブルワードの場合があります。
SCAS −この命令は、レジスタ(AL、AX、またはEAX)の内容をメモリ内のアイテムの内容と比較します。
上記の各命令には、バイト、ワード、およびダブルワードのバージョンがあり、文字列命令は、繰り返しプレフィックスを使用して繰り返すことができます。
これらの命令は、ES:DIおよびDS:SIレジスタのペアを使用します。ここで、DIおよびSIレジスタには、メモリに格納されているバイトを参照する有効なオフセットアドレスが含まれています。SIは通常DS(データセグメント)に関連付けられ、DIは常にES(追加セグメント)に関連付けられます。
DS:SI(またはESI)およびES:DI(またはEDI)レジスタは、それぞれソースオペランドとデスティネーションオペランドを指します。ソースオペランドはDS:SI(またはESI)にあり、デスティネーションオペランドはメモリ内のES:DI(またはEDI)にあると想定されます。
16ビットアドレスの場合はSIおよびDIレジスタが使用され、32ビットアドレスの場合はESIおよびEDIレジスタが使用されます。
次の表に、さまざまなバージョンの文字列命令と、オペランドの想定スペースを示します。
基本的な説明 | でのオペランド | バイト操作 | ワード操作 | ダブルワード操作 |
---|---|---|---|---|
MOVS | ES:DI、DS:SI | MOVSB | MOVSW | MOVSD |
LODS | AX、DS:SI | LODSB | LODSW | LODSD |
STOS | ES:DI、AX | STOSB | STOSW | STOSD |
CMPS | DS:SI、ES:DI | CMPSB | CMPSW | CMPSD |
SCAS | ES:DI、AX | SCASB | SCASW | SCASD |
繰り返しプレフィックス
REPプレフィックスを文字列命令の前に設定すると(例:REP MOVSB)、CXレジスタに配置されたカウンタに基づいて命令が繰り返されます。REPは命令を実行し、CXを1減らし、CXがゼロかどうかをチェックします。CXがゼロになるまで命令処理を繰り返します。
方向フラグ(DF)は、操作の方向を決定します。
- CLD(Clear Direction Flag、DF = 0)を使用して、操作を左から右にします。
- STD(Set Direction Flag、DF = 1)を使用して、操作を右から左にします。
REPプレフィックスには次のバリエーションもあります。
REP:無条件の繰り返しです。CXがゼロになるまで操作を繰り返します。
REPEまたはREPZ:条件付きの繰り返しです。ゼロフラグが等しい/ゼロを示している間、操作を繰り返します。ZFが等しくない/ゼロを示したとき、またはCXがゼロのときに停止します。
REPNEまたはREPNZ:条件付きの繰り返しでもあります。ゼロフラグが等しくない/ゼロでないことを示している間、操作を繰り返します。ZFが等しい/ゼロを示すか、CXがゼロにデクリメントされると停止します。