1. ホーム

場所 0x00000004 の読み取りでアクセス違反が発生しました。

2022-02-10 05:02:58

最近、x86のアセンブリを書くときにこの問題があって、時間がかかりましたが、最終的には完璧に解決しました。

原因は以下のコードでした。

.MODEL FLAT, C

.CODE
testcommon PROC

     push ebp
     mov ebp, esp

     mov eax, [ebp+8] ;base address
     mov esi, [ebp+12] ;length

     mov ecx, 0 ; loop variable
begin:
     cmp ecx, esi
     je done
     mov dword ptr [eax+ecx*4], 4
     add ecx, 1
     jmp begin

done:
    mov esp, ebp
    pop ebp
    testcommon

testcommon ENDP
END

メイン関数に戻ると必ずエラーメッセージが表示される

 Access violation reading location 0x00000004.


  一歩一歩情報を探していくうちに、プログラムが呼び出されている仕様に準拠していないことが判明する。

つまり、呼び出されたプログラムはEBX, EDX, ESIレジスタを保護する責任がありますが、上記のプログラムではESIレジスタを保護せずに直接使用するため、呼び出し元の関数に戻った後の動作がおかしくなります。

取得元:https://www.cnblogs.com/buaawang/p/9853768.html