Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Изменение сегмента и указателя стека


Автор: Merlin27 4.11.2006, 21:53
В продолжение темы о передаче управления др. программе....

Пишу значит

Код

mov ax,2000h
mov ss,ax
mov [KSP],sp ; сохраняю указатель стека
mov sp,0FFFEh


Вот возника проблемка: "mov [KSP],sp" не работает. В дебаггере после команды  "mov ss,ax" указатель следующей команды перескакивает через "mov [KSP],sp". 
Кроме того после команды "mov ss,ax"  засоряется часть самого стека по новому смещению, чтото около 20 верхних байт стека.

Проясните что такого особенного в этом  "mov ss,ax". И как мне нормально сохранить/восстановить SP. Возникла идея поставить после "mov ss,ax" NOP, но это както некрасиво smile 

Автор: Merlin27 4.11.2006, 22:46
Провел пару тестов... несмотря на непонятки вроде все работает правильно. Может эти чудеса со стеком связаны с работой самого дебаггера?

Автор: dumb 5.11.2006, 15:45
после записи в ss происходит "потеря отладочного прерывания" (не помню уже, чем это объясняется). так что в твоем случае все работает правильно, и добавление nop'а действительно помогло бы "прошагать" по mov [ksp],sp... smile

Автор: Merlin27 5.11.2006, 16:59
Проследил я за стеком в отладчике... Короче как я понял сам TD хранит там свои данные. Когда происходит push он отодвигает свои данные вверх, pop - наоборот... Видимо перехватывает команды замены сегмента стека и создается иллюзия что перскакивает следующую команду. Но на самом деле все нормально работает, следующая команда тоже выполняется вместе с предыдущей, правда только за одно нажатие F7 - вот и насторожило меня это smile. Просто не сталкивался до этого с такими особенностями TD.

Автор: dumb 5.11.2006, 17:44
Цитата(Merlin27 @  5.11.2006,  16:59 Найти цитируемый пост)
Короче как я понял сам TD хранит там свои данные

так и есть. и TD не одинок в этом. на этой "особенности" работал один из антиотладочных приемов времен ДОСа...

Автор: Dude03 5.11.2006, 18:15
Вообще при установке сегментных регистров(cs, ss) стоит отменять прерывание(cli) и потом восстанавливать(sti). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)