最近在寫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寄存器而沒有加以保護,因此,在返回到調用函數后,程序行為會出錯。