我试图连接两个字符串,但是我不断遇到分段错误,有人可以帮助我解决我的代码有什么问题吗?谢谢!为了测试它,我只是创建了具有动态分配的内存的字符串,这是一个类练习,因此我必须从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
我试图连接两个字符串,但是我不断遇到分段错误,有人可以帮助我解决我的代码有什么问题吗?谢谢!为了测试它,我只是动态地创建为字符串...
最后,我从头重新编写了功能strConcat,现在可以使用了。