首页
社区
课程
招聘
[原创]分享一个字符串相加的C函数
发表于: 2015-10-18 10:31 14544

[原创]分享一个字符串相加的C函数

2015-10-18 10:31
14544
要把两个字符串连起来,在java里面非常简单,就一个加号搞定,可是我用同样的方法在vc里面做,它说不行,于是我就去查c库函数,虽然是找到了一个,但是用起来还是莫名其妙的报错,vs2010在编译的时候说那个函数不安全.
既然找不到那也就不用找了,直接上汇编,于是就写了这样一个函数出来,顺便拿来大家指教一下
void _stdcall addstr(char*str1,char*str2){
        _asm{               
                                mov edi,[ebp+8]
test_str1:               
                        mov al,byte ptr es:[edi]
                        test al,al
                        jz addstart
                        inc edi
                        jmp test_str1
               
addstart:        mov esi,[ebp+12]
round:                mov al, byte ptr ds:[esi]
                        mov byte ptr es:[edi], al                       
                        inc esi
                        inc edi
                        test al,al
                        jnz round

               

        }

}
函数功能:
      将第二个字符串添加到第一个字符串的尾部
    要求第一个字符串所在处有足够大的缓冲区

[课程]Android-CTF解题方法汇总!

收藏
免费 3
支持
分享
最新回复 (11)
雪    币: 351
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
strcat?
2015-10-18 10:53
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
C是指针, 指针相加有何意义?
没考虑溢出
2015-10-18 10:56
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我不是说明需要自己分配一个足够的缓冲区吗,不是指针相加,而是把两个字符串连起来,生成一个新字符串
2015-10-18 11:33
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对,就是那个,我要在dll里面用那函数,而且还要把那个dll注入到一个游戏进程,结果只要用那个函数,游戏百分百崩溃
2015-10-18 11:35
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
strcat易发生溢出啊,可以用strncat。
另外,LZ你不知道汇编有专门的串操作指令吗?谁敢用你这代码也是堪忧啊。
2015-10-18 12:05
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
当然知道,但是你不知道字符串的长度,所以每个字符都要取出来看看是不是零,才知道有没有到字符串的末尾,所以不能用串操作符
2015-10-18 14:39
0
雪    币: 435
活跃值: (1207)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
8
你先求长度,然后rep movsb
可以看看vc编译器strcpy的反汇编
2015-10-18 15:19
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
长度也需要遍历才能出来吧,既然都要遍历,何必多用一个rep movsb
?
2015-10-18 18:34
0
雪    币: 1556
活跃值: (848)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
10
鼓励一下......另说,c++的string也挺方便的:)
2015-10-18 21:53
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
虽然同样是遍历,但是内置的指令应该比你的循环要高效,这个跟CPU的设计有关。
我写的一个strcat,你参考一下。
void __stdcall StringCat(char* pStrOrigin, char* pStrAppend){
	_asm{    
		;计算附加串长度,存放到ebx
			mov edi, pStrAppend
			xor eax,eax
			or ecx, -1
			repne scasb
			not	ecx
			mov	ebx, ecx
			
			;还原附加串地址,并保存到esi(串指令的源串地址)
			sub	edi, ecx
			mov	esi, edi
			
			;将目标指针移动到原始串末尾
	
			mov edi, pStrOrigin
			or ecx, -1
			repne scasb
			dec edi
			
			;对齐字节拷贝;4字节对齐
			mov ecx, ebx
			shr ecx, 2		
			rep movsd
			
			;剩余单字节拷贝
			mov ecx, ebx
			and ecx, 3		
			rep movsb
	}
}
2015-10-18 23:28
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
还好,多谢指教,
2015-10-19 10:53
0
游客
登录 | 注册 方可回帖
返回
//