Smitis написал(а):!push esi
!push edi
Smitis написал(а):А почему 8 прибавляется?
ранее стек увеличен 2 раза по 4 байта а аргументы в стеке p.p_s=esp+4,p.p_c=esp+8 ,esp вершина это адрес возврата из процедуры
вообщем смысл такой и можно сразу написать s=esp+12,c это esp+16
потому как на самом деле может быть s=esp+4+8
ps:аргументы в стек грузятся начиная с последнего аргумента и указатель стека на эту ячейку 4 байта сдвигается,и +адрес возврата в самый верх=esp(+0)
таким образом память стека можно использовать под сохранение прежних значений регистров а также типа локальных переменных,главное при выходе из процедуры привести в исходное состояние чтобы выход был правильный
!pop edi вытолкнуть значение из стека,в данном случае вернуть прежнее значение регистра edi что было при входе в процедуру
!pop esi также как edi и соответственно меняется указатель esp на свою память стека[esp],скобки это работа с ячейкой памяти стека(загрузить ,получить значение)а без скобок это указатель и это по сути с любым регистром так без скобок это либо его значение загруженное а асли он в скобках то значит это указатель на память иот туда с адреса берётся числовое
значение
Pps; так fasm интерпритирует машинные команды, и если стоит PTR edi допустим но без скобок то определение PTR говорит типа что это тоже указатель=[значение ячейки памяти по адресу]
а стек это типа реализация с своим участком памяти в системе ну или отдельно физически может быть но смысл такой первый вошёл в него последний ушёл.....
ppps:проц обслуживает типа десятка переменных ну и типа стек с своей памятью и это для всего что на компе вот поэтому как бы и важно сохранить эти переменные типа регистров
в исходное состояние что перед вызовом своей задачи но опять же не все регистры такие,допустим типа eax это не касается условно он как аккумулятор получил отдал.и т.д.
Отредактировано Sergeihik (10.10.2023 17:59:28)