我正在搜索连接两个字符串(由C传递)将结果放在第三个字符串中。我做到了,但知道我想在琴弦之间放一个空格但是......它可能...... 这是C的部分
#include <stdio.h>
#include <string.h>
void concatena(char *stringa, char *stringa2, char *dest);
int main(void)
{
char stringa[17] = { "stringa numero 1" };
char stringa2[17] = { "stringa numero 2" };
char dest[34] = { "" };
concatena(stringa, stringa2, dest);
printf("%s", dest);
getchar();
}
调用masm32的部分:
.586
.model flat
.code
_concatena proc
;pre
push ebp
mov ebp,esp
push ebx
push edi
push esi
;clean
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi
mov eax, dword ptr[ebp+8] ;source=stringa
mov ebx, dword ptr[ebp+12] ;target=stringa2
mov ecx, dword ptr[ebp+16] ;buffer=dest
inizio:
mov dl,byte ptr[eax+esi*1]
cmp dl,0
je space ;first string finished
mov byte ptr[ecx+esi*1], dl
inc esi
jmp inizio
space:
inc esi
mov byte ptr[ecx+esi*1],32
;if i put a 'inc esi' here the result is the same
jmp fine1
fine1:
mov dl, byte ptr[ebx+edi*1]
cmp dl, 0
je fine2 ;second string finished
mov byte ptr[ecx+esi*1], dl
inc edi
inc esi
jmp fine1
fine2:
;post
pop esi
pop edi
pop ebx
pop ebp
ret
;chiusura della procedura
_concatena endp
end
当我在输出中运行它时,我看到:
你怎么能看到concatena()放在目标数组中只有第一个字符串... 非常感谢您的每一个答案!
答案 0 :(得分:0)
在C中,strcat
等价物在第二个字符串之前自动预占空格看起来像这样:
void strcatspace(char *dest, char *src)
{
char *insert_point = &dest[strlen(dest)];
*insert_point++ = ' ';
while(*src) *insert_point++ = *src++;
}
Haven没有经过测试,但这是一般的想法。将此函数转换为汇编以实现预期结果,可能使用编译器生成的指令作为起点。
答案 1 :(得分:0)
更多proft将是以下代码:
#include <string.h>
void strcat_space(char* dest, char* src){
strcat(dest, " ");
strcat(dest, src);
}
享受
如果你想将结果传递给thisrd字符串,只需:
#include <string.h>
int main(){
char str1[] = "abcd";
char str2[] = "efgh";
char dest[1000];
strcat_space(strcpy(dest, str1), str2);
/*
// or you can also do
strcat(dest, str1);
strcat_space(dest, str2);
*/
return 0;
}
答案 2 :(得分:0)
有很多方法可以实现,但一般来说,我希望尽可能简化。在这种情况下,程序框架并不是必需的,但是因为您已将它包含在您的示例中,所以我也做了同样的事情。
push ebp
mov ebp, esp
push esi
push edi
; So second iteration of MoveStr will drop into Done
push Done
mov edi, dword ptr [ebp+16] ; Grab pointer to destination buffer
mov esi, dword ptr [ebp+8] ; Pointer to string 1
call MoveStr
or al, ' '
stosb
mov esi, dword ptr [ebp+12]
MoveStr:
lodsb
or al, al
jnz L1
ret
L1: stosb
jmp MoveStr
Done:
pop edi
pop esi
leave
ret
答案 3 :(得分:-1)
我找到了解决它的方法! 有人在这里回答/评论说将第一个字符串放入&#39; dest&#39; &#39; esi&#39;(指数)指向&#34;线的末端&#34;或类似的东西... 所以解决方案非常简单,我减少了它,并在增加它之后......! 写它来解释更简单,我只更改了标签&#39; space&#39;那样:
space:
dec esi ;decrease
inc esi ;increase
mov byte ptr[ecx+esi*1],20h
inc esi
jmp fine1
谢谢大家!