26 strcpyのデバッグ

序文

これは非常によく使用される 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 にジャンプして、現在の関数を終了します。 

以上

おすすめ

転載: blog.csdn.net/u011039332/article/details/128050829