Как исправить исключение ошибки при нарушении доступа?

# #c #exception #assembly #x86

Вопрос:

Я немного сбит с толку относительно того, что мне нужно исправить, чтобы обработать исключение ошибки, возникшее при 0x00AFF748 в ProjectTwo.exe: 0xC0000005: Нарушение доступа, выполняющее местоположение 0x00AFF748.

Я пытаюсь написать внешнюю программу на языке ассемблера, которая затем вызывается программой на C . Я не уверен, что перепутал код на ассемблере, и именно поэтому я продолжаю получать ошибку. Цель моей программы —

 int problem1_ ( ) { int numberArray [4] = {1, -3, 12, 15};  int result = 0, index = 0; int numElements = 4; while (index lt; numElements) { if ( index gt;= 1 amp;amp; numberArray[index] gt; 2 ) { result = result * numberArray[index] ; } else {  result = result - 5; } index  ; } return result; }    

Мой код на C :

 #includelt;iostreamgt; using namespace std;  extern "C" int problem1_();  int main() {  //Declare the variable and set it to returned result  //From calling the assembly program  int x = problem1_();   //Print the results  cout lt;lt; "The result is: "lt;lt; x lt;lt; endl;  return 0;  }  

Мой код на ассемблере:

 .model flat, c   .data numberArray DWORD 1, -3, 12, 15 numElements DWORD 5  .code problem1_ proc mov eax, 0 ;value of eax is 0 lea ebx, numberArray ;Load the array's memory address into register ebx' mov ecx, numElements ;ecx is count down counter cmp ecx, 0 ;If ecx not greater than 0, jump to quit jng FINISH  iterateThruArray: cmp[ebx], eax ;Compare value at current index to eax jl result1 jmp result2  result1: mul numberArray jmp FINISH  result2: sub eax, 5  jmp FINISH  FINISH:  pop ebp ; pop ebp from the stack  ret ; return to calling program   problem1_ endp end  

Комментарии:

1. Как вы устраняете нарушение доступа? Только не нарушайте доступ. Очень вероятная вероятность-это доступ к массиву за его пределами. Поэтому сначала отладьте свой код, чтобы убедиться, что вы этого не делаете.

2. Фактический AV, вероятно, вызван звонком pop ebp , который никогда не выполнялся push . Но здесь так много других проблем, что я едва знаю, с чего начать. Но @TheUndeadFish прав в том, что вы захотите запустить это через отладчик. По крайней мере, это может привести к лучшим вопросам.