序文
これは非常によく使用される glibc ライブラリ関数でもあります。
ユーザービジネスコードであっても、多くのクラスライブラリのコードであっても、基本的に文字列のコピーが使用されます。
しかし、ここで具体的な実装を見てみましょう
実装は主にアセンブリを使用して実装されるため、理解するにはある程度の基礎が必要です
テストケース
単純に strcpy、strlen を使用するだけです
root@ubuntu:~/Desktop/linux/HelloWorld# cat Test03Strcpy.c
#include "stdio.h"
int main(int argc, char** argv) {
int x = 2;
int y = 3;
int z = x + y;
char* p1 = (char*) malloc(20);
char* p2 = (char*) malloc(20);
printf("p1 : 0x%x\n", p1);
printf("p2 : 0x%x\n", p2);
memset(p1, 'a', 12);
strcpy(p2, p1);
int p2Len = strlen(p2);
printf(" p1 = %s, p2 = %s, p2Len = %d\n ", p1, p2, p2Len);
}
strcpyの実装
最初のバイトは 8 バイトのアライメントに基づいており、アライメント後の残りのバイトが処理されます。
ここでラベル0のループは、文字列の終了文字に遭遇すると終了処理にジャンプします。
次に、8 バイト単位で、主に si -> ax -> di とデータをコピーするたびに 4 つのグループが循環され、si、di が反復的に更新されます。
中間の 2 つの jnc と jnz のロジック処理は、主に、現在の 8 バイトのバッチに文字列終端文字 '\0' があるかどうかを判断することです。
存在する場合はラベル3の処理へジャンプ
それ以外の場合は、通常の8バイトデータのターゲットメモリへのコピー処理を実行します。
現在処理中の 8 バイト [ax に格納] に文字列ターミネータ '\0' がある場合
次に、ラベル 3 の処理は、ソース メモリからターゲット メモリにバイトをコピーすることです。
次に、文字列終端文字「\t」に遭遇し、ラベル 4 にジャンプして、現在の関数を終了します。
以上