esp
- регистр указателя стека. На x86, когда вы call
функция, стек используется для передачи параметров и адреса возврата.
Когда вы выполняете mov esp, eax
, вы устанавливаете указатель стека равным тому, что возвращается из ReadInt
(что, как я полагаю, по его названию является предоставленным пользователем значением), которое вы задали как 0
.
Код исключения 0xC0000005
является нарушением доступа , поскольку инструкция call WriteString
пыталась поместить адрес возврата из вашего вызывающего кода в местоположение 0x00000000
, которое является нулевым указателем.
Решение: чтобы сохранить возвращаемое значение от вызова до ReadInt
, используйте регистр, отличный от esp
.
Кроме того, если вы не знаете, что не используете назначенный регистр указателя кадра (ebp
) по прямому назначению, вы также не должны использовать его как регистр общего назначения.