Access violation reading location 0x00000004.

最近在写x86汇编出现了这个问题,折腾了好久,不过最后完美解决了。

原因出在下面这段代码

.MODEL FLAT, C

.CODE
testcommon PROC

     push ebp
     mov ebp, esp

     mov eax, [ebp+8]    ;基址
     mov esi, [ebp+12]    ;长度

     mov ecx, 0            ;    循环变量
begin:
     cmp ecx,  esi
     je done
     mov dword ptr [eax+ecx*4], 4
     add ecx, 1
     jmp begin

done:
    mov esp, ebp
    pop ebp
    ret

testcommon ENDP
END

在返回到main函数中时总是出现错误信息

 Access violation reading location 0x00000004.

  经过一步步的定位,以及查找资料,发现程序没有遵守被调用着规范。

 

 

也就是说被调用程序负责保护EBX, EDX, ESI寄存器,而在上面那段程序中,直接使用ESI寄存器而没有加以保护,因此,在返回到调用函数后,程序行为会出错。

posted @ 2018-10-26 00:37  北小白  阅读(2045)  评论(0编辑  收藏  举报