Assembly-programming-assembly-strings

提供:Dev Guides
移動先:案内検索

アセンブリ-ストリング

前の例では、すでに可変長文字列を使用しています。 可変長文字列には、必要な数の文字を含めることができます。 一般的に、我々は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レジスタが使用されます。

次の表は、文字列命令のさまざまなバージョンと、オペランドの想定スペースを示しています。

Basic Instruction Operands at Byte Operation Word Operation Double word Operation
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(方向フラグをクリア、DF = 0)を使用して、操作を左から右にします。
  • 操作を右から左にするには、STD(方向フラグを設定、DF = 1)を使用します。

REPプレフィックスには、次のバリエーションもあります。

  • REP:無条件の繰り返しです。 CXがゼロになるまで操作を繰り返します。
  • REPEまたはREPZ:条件付き繰り返しです。 ゼロフラグが等しい/ゼロを示す間、操作を繰り返します。 ZFが等しくない/ゼロを示すか、CXがゼロになると停止します。
  • REPNEまたはREPNZ:条件付き繰り返しでもあります。 ゼロフラグが等しくない/ゼロを示す間、操作を繰り返します。 ZFが等しい/ゼロを示したとき、またはCXがゼロに減少したときに停止します。