> call recall > recall: pop esi > sub esi,offset recall > > Если esi заменить на ebp то все работает, но в самом конце > проги вылетает ошибка. Почему?
Разницы НЕ ДОЛЖНО БЫТЬ.
Скорее всего, тут две ошибки :)
первая - та, что тебе не позволяет тебе корректно работать с esi. Очень маловероятно, но помни, что обращение вида:
mov [ebp],eax <==> mov SS:[ebp],eax
имеет адресацию через SS в отличии от:
mov [esi],eax <==> mov DS:[esi],eax
Хотя в win32 коде обычно селектора совпадают...
Ну а другая в том, что ebp это такой регистр, который активно используется для адресации к локльным переменным, переданным параметрам: лучше просто так его не трогать. Попробуй так:
push ebp
...
call recall
recall: pop esi
sub esi,offset recall
...
pop ebp
> call recall > recall: pop esi > sub esi,offset recall > > Если esi заменить на ebp то все работает, но в самом конце > проги вылетает ошибка. Почему?
Разницы НЕ ДОЛЖНО БЫТЬ.
Скорее всего, тут две ошибки :)
первая - та, что тебе не позволяет тебе корректно работать с esi. Очень маловероятно, но помни, что обращение вида:
mov [ebp],eax <==> mov SS:[ebp],eax
имеет адресацию через SS в отличии от:
mov [esi],eax <==> mov DS:[esi],eax
Хотя в win32 коде обычно селектора совпадают...
Ну а другая в том, что ebp это такой регистр, который активно используется для адресации к локльным переменным, переданным параметрам: лучше просто так его не трогать. Попробуй так:
push ebp
...
call recall
recall: pop esi
sub esi,offset recall
...
pop ebp