更新:修复了我的C代码示例。我正在将char *从char *复制到另一个char *中。我需要按值复制,然后将新char *的地址返回给调用者。
我正在尝试在程序集中创建以下C代码的等价物,但gdb / valgrind报告我正在尝试释放已经“释放”的内容。
C代码:
char* func( int x, char* name){
namestr = (char *) malloc( strlen(name) + 1 );
nameestr = strdup( namestr, strlen(name) +1 );
free( name ); //Just showing what I plan to do later.
return namestr;
}
int main( ){
char* name = (char *) malloc( 10 );
*name = "0123456789"
char* some_string = func( 10, name );
free( some_string );
}
汇编代码:
new_student:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
subl $20, %esp
movl 12(%ebp), %ecx
movl %ecx, %edi
movl %ecx, -12(%ebp)
;get length and allocate the appropriate space
.STR_ALLOCATE:
movl $0, %eax
movl $-1, %ecx
repnz scasb
notl %ecx
subl $1, %eax
addl $1, %eax
movl %ecx, -8(%ebp)
pushl %ecx
call allocate
add $4, %esp
movl %eax, -16(%ebp)
;copy the string byte by byte
.STR_CPY:
movl -8(%ebp), %ecx
movl %eax, %edi
movl 12(%ebp), %esi
rep movsb
movl -12(%ebp), %eax
.END:
popl %esi
popl %edi
leave
ret
任何人都能给我一些关于我做错的提示吗?
答案 0 :(得分:0)
在你的c代码中你写了
free(name)
这可能会导致您出现问题,因为您无法释放未由malloc,calloc或realloc分配的内存 并且在您试图释放的main中也看不到namestr,因为它位于func函数的堆栈中
答案 1 :(得分:0)
在汇编例程结束时,您将返回值加载到eax
:
movl -12(%ebp), %eax
但是,-12(%ebp)
包含传递给函数的指针,而不是已分配的指针。您应该在返回之前执行以下操作:
movl -16(%ebp), %eax
(或者只是不做任何事情 - 从eax
指令返回后似乎没有任何修改call allocate
。