Помню на старом форуме была тема с алгоритмом работы pop dword ptr [esp+4] на разных процах (если я ничего не путаю) Тему найти не смог ( Например: esp = 12FDB8 pop dword ptr [esp+4] пишет на моем Athlon 64 в адрес=12FDC0 Просьба - опубликуйте результаты выполнения команды для разных процессоров (как это работает на разных процах).
Код (Text): 004010BF >/$ 68 78563412 push 12345678 004010C4 |. 8F4424 04 pop dword ptr ss:[esp+4] верхушка стека после push: 0012FFC0 12345678 0012FFC4 7C816D4F RETURN to kernel32.7C816D4F 0012FFC8 00000000 верхушка стека после pop: 0012FFC4 7C816D4F RETURN to kernel32.7C816D4F 0012FFC8 12345678 0012FFCC 00000000
0006FFC0 12345678 0006FFC4 7C816FD7 RETURN to kernel32.7C816FD7 0006FFC8 7C910738 ntdll.7C910738 0006FFC4 7C816FD7 RETURN to kernel32.7C816FD7 0006FFC8 12345678 0006FFCC FFFFFFFF Athlon64
push/pop, pushad/popad начиная с 286-го сначала выполняют действие, а потом изменяют esp. До 286 было наоборот - сначала изменялся esp, потом выполнялось действие...
[IA-32 Intel® Architecture Software Developer's Manual. Volume 2B - Instruction Set Reference, N-Z] 25366720.pdf
Хм. У Зубкова написано про то, что esp изменяется после выполнения (правда, он говорит о push/pop esp, а не о адресации). Очередная опечатка у него?
Athlon XP 2000 Код (Text): push esp: a = esp esp -= 4 [esp] = a pop esp: a = [esp] esp += 4 ; для наглядности :) esp = a push [esp]: a = [esp] esp -= 4 [esp] = a pop [esp]: a = [esp] b = esp esp += 4 [b] = a
2Ustus Тогда уж скорее выполняет просто mov esp, [esp] без инкремента. Хотя врядли в процессоре обрабатывается эта ситуация. Думаю есть и инкремент регистра и последующая его перезапись...
Гоню... перепутал с popad - при его выполнении esp пропускается. А насчет остального - почему бы не покурить мануалы?
наконец-то доходит до меня что имелось в виду - esp после изменения не увеличиватся еще и на 4 понятно
dermatolog и все-все-все, никакой разницы в выполнении данной команды на современных платформах от Intel и AMD нет. Иначе это были бы уже не совместимые на уровне общих команд процессоры. Вот как выглядит их логика на C, никакой магии, всё четко и предельно просто: push dword ptr[esp+n]: Код (Text): unsigned char * esp; //... *(unsigned int*)&esp[-4] = *(unsigned int*)&esp[n]; esp -= 4; pop dword ptr[esp+n] Код (Text): unsigned char * esp; //... esp += 4; *(unsigned int*)&esp[n] = *(unsigned int*)&esp[-4];