| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Изменение сегмента и указателя стека |
| Автор: Merlin27 4.11.2006, 21:53 | ||
| В продолжение темы о передаче управления др. программе.... Пишу значит
Вот возника проблемка: "mov [KSP],sp" не работает. В дебаггере после команды "mov ss,ax" указатель следующей команды перескакивает через "mov [KSP],sp". Кроме того после команды "mov ss,ax" засоряется часть самого стека по новому смещению, чтото около 20 верхних байт стека. Проясните что такого особенного в этом "mov ss,ax". И как мне нормально сохранить/восстановить SP. Возникла идея поставить после "mov ss,ax" NOP, но это както некрасиво |
| Автор: Merlin27 4.11.2006, 22:46 |
| Провел пару тестов... несмотря на непонятки вроде все работает правильно. Может эти чудеса со стеком связаны с работой самого дебаггера? |
| Автор: dumb 5.11.2006, 15:45 |
| после записи в ss происходит "потеря отладочного прерывания" (не помню уже, чем это объясняется). так что в твоем случае все работает правильно, и добавление nop'а действительно помогло бы "прошагать" по mov [ksp],sp... |
| Автор: Merlin27 5.11.2006, 16:59 |
| Проследил я за стеком в отладчике... Короче как я понял сам TD хранит там свои данные. Когда происходит push он отодвигает свои данные вверх, pop - наоборот... Видимо перехватывает команды замены сегмента стека и создается иллюзия что перскакивает следующую команду. Но на самом деле все нормально работает, следующая команда тоже выполняется вместе с предыдущей, правда только за одно нажатие F7 - вот и насторожило меня это |
| Автор: dumb 5.11.2006, 17:44 |
так и есть. и TD не одинок в этом. на этой "особенности" работал один из антиотладочных приемов времен ДОСа... |
| Автор: Dude03 5.11.2006, 18:15 |
| Вообще при установке сегментных регистров(cs, ss) стоит отменять прерывание(cli) и потом восстанавливать(sti). |