内存分配C + x86程序集的问题

时间:2016-11-03 18:41:15

标签: c assembly memory-management x86

所以我有这个C片段:

char* uint_to_binary(unsigned int var, char* buffer);
//...
int main(int argc, char *argv[])
{   
    unsigned int var;
    scanf("%d", &var);
    buffer = uint_to_binary(var, buffer);
}

uint_to_binary是x86汇编函数:

    global uint_to_binary

    section .text

uint_to_binary:
    push    ebp         
    mov     ebp, esp    
    push    ebx         

%define var   [ebp+8]
%define buffer [ebp+12]

    mov     eax, buffer         
    test    eax, eax                    
    jz      fin                 

    mov     edx, var   
    mov     byte [eax], "0"

组装功能当然更长,但我在最后的指令中将其剪掉了,

mov byte [eax], "0"

,我遇到了分段错误。这可以通过将内存分配给缓冲区指针参数来解决,如下所示:

char* buffer = malloc(sizeof(char));

在主程序中。这对我来说没有多大意义,因为后来在汇编程序中我覆盖了内存位置缓冲区+ 1,缓冲区+ 2等,这些内存位置没有被mallocated,没有分段错误,而不能覆盖不存在分段错误mallocated buffer + 0没有得到段错误。

Moreso,在同一个程序中,我将not-mallocated void *指针作为参数传递给另一个汇编函数,其中我还使用mosvb指令覆盖这些内存位置,并且不会发生分段错误:

void* copy_memory_block(void* target, void* source, unsigned int length);
//...
int main(int argc, char *argv[])
{
    void *target, *source;
    unsigned int length = 5;
    target = copy_memory_block(target,source,length);
}

在汇编函数中,我只是在寄存器EDI和ESI上存储指针target和source,并用rep movsb指令覆盖它们。这不会产生分段错误。那么,如果我没有为char指针mallocate一个字节,那么第一个段错误会发生什么呢?

0 个答案:

没有答案