sting.h头文件包含了所有的字符串操作函数
strcpy字符串拷贝函数
cld
指令用于设置方向标志位,确保字符串复制是从前向后进行。
lodsb
指令用于将src
指针指向的字符加载到AL
寄存器中,并将src
指针递增。
stosb
指令用于将AL
寄存器中的字符存储到dest
指针指向的位置,并将dest
指针递增。
testb %%al,%%al
指令用于将AL
寄存器中的字符与自身进行逻辑与操作,检查是否为零(字符串结束标志)。
jne 1b
指令用于跳转到标号1
处,即继续复制下一个字符,如果AL
寄存器中的字符不为零。
::\"S\" (src),\"D\" (dest)
表示输入输出约束,将src
和dest
分别绑定到S
和D
寄存
extern inline char * strcpy(char * dest,const char *src)
{
__asm__("cld\n""1:\tlodsb\n\t""stosb\n\t""testb %%al,%%al\n\t""jne 1b"::"S" (src),"D" (dest));
return dest;
}
strcnpy字符串拷贝指定长度函数
使用cld指令将方向标志位清零,确保字符串拷贝是从源字符串的低地址向高地址进行的。
使用decl指令将count减1,判断count是否大于等于0,如果小于0,则跳转到标号2处。
使用lodsb指令将源字符串中的一个字节加载到AL寄存器中。
使用stosb指令将AL寄存器中的字节存储到目标字符串中。
使用testb指令判断AL寄存器中的字节是否为0,如果不为0,则跳转到标号1处,继续拷贝下一个字节。
使用rep stosb指令将字符串结束的0字节存储到目标字符串中。
标号2处表示字符串拷贝结束。
static inline char * strncpy(char * dest,const char *src,int count)
{
__asm__("cld\n""1:\tdecl %2\n\t""js 2f\n\t""lodsb\n\t""stosb\n\t""testb %%al,%%al\n\t""jne 1b\n\t""rep\n\t""stosb\n""2:"::"S" (src),"D" (dest),"c" (count));
return dest;
}
strcat将源字符串拷贝到目的字符串后
使用cld指令将方向标志位清零,确保字符串连接是从源字符串的低地址向高地址进行的。
使用repne scasb指令在目标字符串中搜索字符串结束的0字节。
使用decl指令将目标字符串的指针减1,指向字符串结束的0字节的位置。
标号1处表示字符串连接的循环开始。
使用lodsb指令将源字符串中的一个字节加载到AL寄存器中。
使用stosb指令将AL寄存器中的字节存储到目标字符串中。
使用testb指令判断AL寄存器中的字节是否为0,如果不为0,则跳转到标号1处,继续连接下一个字节。
extern inline char * strcat(char * dest,const char * src)
{
__asm__("cld\n\t""repne\n\t""scasb\n\t""decl %1\n""1:\tlodsb\n\t""stosb\n\t""testb %%al,%%al\n\t""jne 1b"::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff));
return dest;
}
strncat将源字符串指定长度拷贝到目的字符串后
"cld":将方向标志位清零,确保字符串操作是向前进行的。
"repne scasb":从目标字符串的当前位置开始,逐个比较字符串中的字节,直到遇到字符串结束的0字节或者搜索完整个字符串。
"decl %1":将目标字符串指针dest的值减1,使其指向字符串结束的0字节的位置。
"movl %4,%3":将count的值移动到计数器寄存器ecx中,用于控制拼接的字符数量。
"1:":定义一个标号,用于后续的循环。
"decl %3":将计数器寄存器ecx的值减1。
"js 2f":如果计数器寄存器ecx的值为负,跳转到标号2处,结束循环。
"lodsb":将源字符串src中的一个字节加载到累加器al中。
"stosb":将累加器al中的字节存储到目标字符串dest中。
"testb %%al,%%al":将累加器al中的字节与自身进行逻辑与操作,设置相应的标志位。
"jne 1b":如果累加器al中的字节不为0,跳转到标号1处,继续循环。
"2:":定义一个标号,用于结束循环后的操作。
"xorl %2,%2":将累加器eax的值与自身进行异或操作,将其清零。
"stosb":将累加器al中的字节存储到目标字符串dest中。
static inline char * strncat(char * dest,const char * src,int count)
{
__asm__("cld\n\t""repne\n\t""scasb\n\t""decl %1\n\t""movl %4,%3\n""1:\tdecl %3\n\t""js 2f\n\t""lodsb\n\t""stosb\n\t""testb %%al,%%al\n\t""jne 1b\n""2:\txorl %2,%2\n\t""stosb"::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count));
return dest;
}