【发布时间】:2020-08-11 17:05:59
【问题描述】:
我试图连接两个字符串,但我不断收到分段错误,有人可以帮助我解决我的代码可能有什么问题吗?谢谢! 为了测试它,我只是用动态分配的内存创建字符串,这是一个课堂练习,所以我必须从我的函数获得的 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
【问题讨论】:
-
lib.asm 中的第 79 行是哪一行代码?
-
嗨! 77 .avanzar: ;循环检查是否是字符串的结尾 78 cmp byte [rdi], 0 79 je .fin 80 inc rdi 81 inc rax 82 jmp .avanzar 提前致谢
-
如果你要调用
strLen,只需使用这两个长度和指针来调用memcpy,而不是一次循环一个字节,再次搜索终止0strLen已经找到了!或者至少简化您的循环以使用已知长度而不是搜索0。
标签: string assembly x86-64 nasm strcat