当前位置: 代码迷 >> 汇编语言 >> memcpy的general protection错误
  详细解决方案

memcpy的general protection错误

热度:3925   发布时间:2013-02-26 00:00:00.0
memcpy的general protection异常
Assembly code
memcpy:    push    ebp    mov    ebp, esp    push    esi    push    edi    push    ecx    mov    edi, [ebp + 8]        mov    esi, [ebp + 12]        mov    ecx, [ebp + 16]    .1:    cmp    ecx, 0            jz    .2            mov    al, [ds:esi]            inc    esi                                    mov    byte [es:edi], al        inc    edi                dec    ecx            jmp    .1        .2:    mov    eax, [ebp + 8]        pop    ecx    pop    edi    pop    esi    mov    esp, ebp    pop    ebp    ret            


我在C语言中调用
C/C++ code
memcpy((void *)child_base,(void *)(text_base),text_size);

执行的时候出现了GF:general protection异常
这个一般是什么原因造成的呢?

请高手指点一下

------解决方案--------------------------------------------------------
帮你顶。。。

------解决方案--------------------------------------------------------
为什么总不愿意调试呢?
你的memcpy实现为裸函数吗?
那么memcpy((void *)child_base,(void *)(text_base),text_size);
中的memcpy调用约定又是什么?
传进的各个指针都是有效地么?

如果你调试了,不难得出结论。
------解决方案--------------------------------------------------------
1. 既然结尾ret,而不是ret 12,说明是cdecl调用约定(或者你自定义的某种方式),那么你在调用了memcpy之后是否做了栈平衡?

2. cmp ecx, 0
jz .2
可以用一句jecxz .2替代。

------解决方案--------------------------------------------------------
探讨
什么是调用约定啊?

------解决方案--------------------------------------------------------
用C语言写一个memcpy的hello world然后内联一个int 3
然后用od打开你编译好的程序,就会顺利找到memcpy,然后F7跟进去应该是个jmp跳转,再跟应该就能找到系统自带的memcpy了,对照着看,对照着写。
------解决方案--------------------------------------------------------
还有一点:
楼主的memcpy没有处理源地址和目标地址部分重叠的问题。
  相关解决方案