汇编中的malloc和strdup(自我实现)

时间:2012-10-13 19:25:25

标签: c pointers assembly

更新:修复了我的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

任何人都能给我一些关于我做错的提示吗?

2 个答案:

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