最近在写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寄存器而没有加以保护,因此,在返回到调用函数后,程序行为会出错。