この質問では、ターゲットメモリについて言及していないため、回答がやや困難になります。また、16ビット、32ビット、64ビットのいずれであるかはわかりません。便宜上、Cスタイルの0で終了する文字列であると仮定します。
とにかく、これは一般的な手順のようです:
- 最初の文字列の長さを取得します(asm strlenの記述方法については、http://www.int80h.org/strlen/を参照してください) 。
- ptrをターゲットメモリに設定します
rep(e/ne) movsb
ecxのサイズを使用して、最初の文字列を宛先メモリにコピーします。
これは、「movsd」を使用してCPUを最適化できます。最初shr ecx, 2
に長さに対してを実行して、4バイトのバッチで取得し、残りをmovsbで実行します。私はこれがこのように行われるのを見ました:
mov edi, dest
mov esi, string_address
mov ecx, string_length
mov eax, ecx
shr ecx, 2
repne movsd
mov cl, al
and cl, 3
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here
- 2番目の文字列の長さを取得します(必要に応じて、ediをスタックまたは別のレジスタにバックアップしてください。次の文字列をコピーするために必要なアドレスが含まれています)
- 2番目の文字列を宛先メモリにコピーします(私が言ったように、正しいアドレスは最初の文字列操作の後にediにあるはずです)
- 安全のため、その後ろに新しい0を追加します。
2番目の文字列を最初の文字列の最後にコピーする場合、必要なコピー操作は1つ少なくなりますが、他の重要な要素を上書きせずに2番目の文字列をコピーするのに十分なスペースがあることを確認する必要があります。