网站开发 用户角色,自己电脑做网站主机,asp网站500错误iis7,3维网站制作技术sting.h头文件包含了所有的字符串操作函数 strcpy字符串拷贝函数 cld 指令用于设置方向标志位#xff0c;确保字符串复制是从前向后进行。 lodsb 指令用于将 src 指针指向的字符加载到 AL 寄存器中#xff0c;并将 src 指针递增。 stosb 指令用于将 AL 寄存器中的字符存储到 …
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\n1:\tlodsb\n\tstosb\n\ttestb %%al,%%al\n\tjne 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\n1:\tdecl %2\n\tjs 2f\n\tlodsb\n\tstosb\n\ttestb %%al,%%al\n\tjne 1b\n\trep\n\tstosb\n2:::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\trepne\n\tscasb\n\tdecl %1\n1:\tlodsb\n\tstosb\n\ttestb %%al,%%al\n\tjne 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\trepne\n\tscasb\n\tdecl %1\n\tmovl %4,%3\n1:\tdecl %3\n\tjs 2f\n\tlodsb\n\tstosb\n\ttestb %%al,%%al\n\tjne 1b\n2:\txorl %2,%2\n\tstosb::S (src),D (dest),a (0),c (0xffffffff),g (count));
return dest;
}