技術的には、メモリからメモリに移動することは可能です。
バイト、ワードなどを転送するかどうかに応じて、MOVS(文字列の移動)を使用し、 [E]SIと[E]DIを設定してみてください。
mov si, t_cur ; Load SI with address of 't_cur'
mov di, t_last ; Load DI with address of 't_last'
movsb ; Move byte from [SI] to [DI]
; Some dummy data
t_cur db 0x9a ; DB tells NASM that we want to declare a byte
t_last db 0x7f ; (See above)
ただし、これはMOVを2回実行するよりも効率的ではありませんが、1つの命令でコピーを実行することに注意してください。
MOVSの使用方法と機能は次のとおりです
。https ://www.felixcloutier.com/x86/movs:movsb:movsw:movsd:movsq
命令MOVSは、それ自体で使用されることはほとんどなく、ほとんどの場合、REPプレフィックスと組み合わせて使用されます。
最新のCPUにはrep movs
、AVXベクトルのロード/ストア命令を使用したループの速度に近い、かなり効率的な実装があります。
; - Assuming that 't_src' and 't_dst' are valid pointers
mov esi, t_src ; Load ESI with the address of 't_src'
mov edi, t_dst ; Load EDI with the address of 't_dst'
mov ecx, 48 ; Load [ER]CX with the count (let's say 48 dwords = blocks)
rep movsd ; Repeat copying until ECX == 0
論理的には、コピーは4バイトのdwordチャンクの48コピーで行われますが、実際の最新のCPU(高速文字列/ ERMSB)は、効率を上げるために16バイトまたは32バイトのチャンクを使用します。
このマニュアルでは、 REPの使用方法とその仕組みについて説明しています:
https ://www.felixcloutier.com/x86/rep:repe:repz:repne:repnz