在连接字符串之间放置空格

时间:2017-06-13 16:18:41

标签: assembly x86 masm string-concatenation

我正在搜索连接两个字符串(由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

当我在输出中运行它时,我看到:

output

你怎么能看到concatena()放在目标数组中只有第一个字符串... 非常感谢您的每一个答案!

4 个答案:

答案 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

谢谢大家!