(Моя сборка немного ржавый, любой, пожалуйста, поправьте меня, если я ошибаюсь):
esp
является текущий стек указатель, который является, где местные жители и параметры, как правило, живут. esp+8
получит доступ к элементу, размер которого равен 8 байтам от текущего адреса стека. [x]
обозначает разыменование, поэтому локальный тип указателя.
- Это значение копируется в регистр общего назначения
ecx
.
- Значение
ecx
затем интерпретируется как указатель и разыменовывается в edx
, указывая, что это тип указателя на указатель.
- Значение
edx
увеличивается (возможно, указывая на следующий элемент в массиве с элементами размером 1 байт).
- Значение
edx
копируется обратно в адрес, на который указывает ecx
.
edx
затем декрементируется.
- Значение стека со смещением 4 копируется в нижние 8 битов регистра
a
(это другой вид регистра и ax
).
- Это значение затем копируется в любое место, на которое указывает
edx
.
- Повторное использование того же значения с шага 7 и ANDed с 0xFF - это фактически то же самое, что и копирование в
al
(так как оба обрабатывают только младшие 8 бит значения).
- Наконец
retn
получает адрес возврата из стека и возобновляет выполнение с этого адреса.
В C, я думаю, что это хорошее приближение:
...
char* a = ... // local at offset +4
char** b = ... // local at offset +8
char* c = *b;
c++;
(*c)--;
*c = a; // lower 8-bits implicit if `sizeof(char) == 1` and 1 byte is 8 bits (non-octet systems do exist)
char* d = a & 0xFF;
return;
Я не совсем уверен, что здесь происходит, как это выглядит, как вы упускаете инструкции, которые пришли до того, что вы вывесили.
Что вы не понимаете? –
Зачем кому-то это делать? – simonzack