Причина, по которой ваш стек поврежден, заключается в том, что вы храните значение eax
в b
.Затем сохранение значения ebx
в ячейке памяти b+4
и т. Д. Синтаксис встроенного ассемблера [b+4]
эквивалентен выражению C ++ &(b+4)
, если b
был указателем байта.
Это можно увидеть, если вы посмотрите b
и пошагово.Как только вы выполните mov [b],eax
, значение b
изменится.
Одним из способов решения проблемы является загрузка значения b
в регистр индекса и использование индексированной адресации:
mov edi,[b]
mov [edi],eax
mov [edi+4],ebx
mov [edi+8],ecx
mov [edi+12],edx
Вам вообще не нужно b
, чтобы удерживать указатель на a
.Вы можете загрузить индексный регистр напрямую с помощью инструкции lea
(загрузить эффективный адрес):
lea edi,a
mov [edi],eax
... etc ...
Если вы возитесь с встроенным ассемблером, неплохо было бы открыть окно регистров в отладчике иПосмотрите, как все меняется, когда вы пошаговые.
Вы также можете напрямую обратиться к памяти:
mov dword ptr a,eax
mov dword ptr a+4,ebx
... etc ...
Однако для такой прямой адресации требуется больше байтов кода, чем для индексированной адресации впредыдущий пример.
Я думаю, что выше, с инструкцией lea
(Load Effective Address) и прямой адресацией, которую я показал, отвечает на ваш последний вопрос.