2017-06-11 11 views
12

つまり、この指示が必要な場合がありますか?REP LODS AL命令が存在するのはなぜですか?

インテルの取扱説明書から

が、これは命令が何をすべきかです:DSから

ロード(E)CXバイト:ALに[(E)SI]。

はNASMで、次の例を見てみましょう:

section .data 
    src: db 0, 1, 2, 3 

section .code 
    mov esi, src 
    mov ecx, 4 
    rep lodsb ; mov al, byte[esi + ecx -1]; ecx++ 

命令rep lodsbが実行されている間、私はalにロードされた値を制御することはできません。私ができることは、最後の値がalになるまで命令が終了するまで待っていることです。もちろん、ループなしで直接得ることができます。

REP LODS AX,REP LODS EAXおよびREP LODS RAXと同じ質問が残ります。

+1

である私の古代マイクロソフトMASM「プログラマーズ・ガイド」 'LODS'リピートプレフィックスを取らない命令のその家族の中で唯一のものであることを述べています。 –

+8

存在しないようにするには高価すぎるために存在します。唯一の20000トランジスタから16ビットのプロセッサを構築する必要がある場合、あなたは余裕がない。 –

+0

@WeatherVane、私はそれが私たちのために決定するMASMまでではないと思う、LOL –

答えて

9

メモリーから読み取ると、場合によっては副作用が生じることがあります。たとえば、メモリがハードウェアレジスタにマップされている場合に発生します。正確な副作用はハードウェアによって異なります。したがって、rep lodsbは、非常にまれなケースで、副作用が発生する必要がある場合に役立ちますが、読み込まれた値は必要ありません。

7

...いずれの場合もありますか?この指示が必要ですか?

あなたはそれ自体ではない必要かもしれないが、スペースの節約が重要である16ビットの世界でコーディング、私は(かつて長い上

rep lodsb 

好ましい以上のことをしましたバイト)

add si, cx 
mov al, [si-1] 

もちろんこれはすべて状況によって異なります。あなたの交換指示がループせずに取得すること

注意が実際にmov al, byte[esi + ecx -1]

+0

それを必要とすることは非常に難しいようです。是正願います。 –

+0

よろしく、コードゴルフ用の別のトリック! –

関連する問題