用asm x86-64 intel语法连接两个字符串

问题描述 投票:0回答:1

我试图连接两个字符串,但是我不断遇到分段错误,有人可以帮助我解决我的代码有什么问题吗?谢谢!为了测试它,我只是创建了具有动态分配的内存的字符串,这是一个类练习,因此我必须从fucntion得到的2个参数中释放内存。

我的代码:

    ;int32_t strCmp(char* a, char* b)
    strConcat:
        push rbp    ;stack frame 
        mov rbp, rsp
        push r12 ; stringA
        push r13 ; stringB
        push r14 ; puntero inicio ; stringA
        push r15 ; puntero inicio ; stringB   
        mov r12, rdi
        mov r13, rsi
        mov r14, r12
        mov r15, r13
        xor rcx, rcx ;clean rcx to do len(stringA)+leng(stringB)+1
        call strLen  ; len stringA
        add rcx, rax
        mov rdi, r13 
        call strLen  ;  len stringB
        add rcx, rax
        mov rdi, rcx
        inc rdi
        call malloc
        ; now rax has a pointer to new concatenated string space

        .cicloA:        ;loop to iterate over 1st string
            cmp byte [r12], 0
            jz .cicloB
            xor rdx, rdx
            mov dl, byte [r12]
            mov byte [rax], dl
            inc r12
            inc rax
            jmp .cicloA

        .cicloB:        ;loop to iterate over 2th string
            cmp byte [r13], 0
            jz .fin
            xor rdx, rdx
            mov dl, byte [r13]
            mov byte [rax], dl
            inc r13
            inc rax
            jmp .cicloB

        .fin:
            ;add /0
            mov byte [rax], 0
            ;release memory
            mov rdi, r14
            call free
            mov rdi, r15
            call free 
            pop r15
            pop r14
            pop r13
            pop r12
            pop rbp
            ret

我的strLen函数是

    ;uint32_t strLen(char* a)
    strLen:
        push rbp    ;armo el stack frame 
        mov rbp, rsp
        xor rax,rax
        .avanzar:       ;loop para ver si llegue al fin de un string 
            cmp byte [rdi], 0   
            je .fin
            inc rdi
            inc rax
            jmp .avanzar
        .fin:
            pop rbp 
            ret

Valgrind错误:

==18885== Invalid read of size 1
==18885==   at 0x400E4A: ??? (lib.asm:79)
==18885==   by 0x400C49: test_strConcat (main.c:79)
==18885==   by 0x400D28: main (main.c:109)
==18885== Address 0x2 is not stack'd, malloc'd or (recently) free'd

我试图连接两个字符串,但是我不断遇到分段错误,有人可以帮助我解决我的代码有什么问题吗?谢谢!为了测试它,我只是动态地创建为字符串...

string assembly x86-64 nasm strcat
1个回答
0
投票

最后,我从头重新编写了功能strConcat,现在可以使用了。

© www.soinside.com 2019 - 2024. All rights reserved.