Вопрос № 21971: Помогите пожалуста перевести с Паскаля в Assembler программку о восьми ферзях... Я не могу там оформить рекурсию......Вопрос № 21983: Привет!
Хочу написать свой эмулятор проца, дайте плзз ссылки на доки!! Заранее спасибо!!...
Вопрос № 21.971
Помогите пожалуста перевести с Паскаля в Assembler программку о восьми ферзях... Я не могу там оформить рекурсию...
Приложение:
Отправлен: 09.06.2005, 14:09
Вопрос задал: Пизний Владимир Владимирович (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Ayl
Здравствуйте, Пизный Владимир Владимирович!
Что ты не можешь оформить? Где твои ассемблерные наработки?
Рекурсия оформляется очень просто (см. Приложение)
В кратце - все дело в стеке. Если его правильно использовать, то рекурсия получится сама-собой. Естесственно, в теле подпрограммы не должно быть никаких переменных - все переменные определяются в стеке. С регистрами тоже нужно аккуратно работать, чтобы не затереть нужные данные.
А так все просто. Каждый вызов процедуры выделяет в стеке место для своей работы (фрейм стека). При возврате из процедуры фрейм возвращается. Т.к. данные из стека берутся в обратном порядке, то в результате выполнения рекурсивных вызовов ты сначала спустишься до самого нижнего уровня, а потом поднимешься обратно. Результат надо возвращать через регистры.
Приложение:
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 09.06.2005, 16:32
Отвечает: DSota
Здравствуйте, Пизный Владимир Владимирович! Если хотите использовать MASM то там есть хорошая команда (local) для создания переменной в стеке:
Backtracking proc local i:word;резервирует место для переменной local y:word ... mov i,ax;пример использования ... ret Backtracking endp
Если же пользуетесь старым ассемблером, или хотите все сделать руками, то есть команда процессора 286 (enter-leave) для резервирования и освобождения места в стеке:
Backtracking proc
y equ word ptr [bp-2] i equ word ptr [bp-4];-6, -8, ... и так далее для нужных переменных enter 0,2;резервируем в стеке 2 слова для неопределенных заранее переменных (у и i) ... mov y,ax;пользуем так-же, как и в предыдущем примере ... call Backtracking;при этом будут свои i и y ... leave;освободим, все, что выделено предыдущим enter ret Backtracking endp
В программе нужно, чтобы размер стека прев
ышал - максимальное_возможное_число_рекурсий*(2 или 4 + размер_памяти,_выделенный_локальным_переменным)... И кстати - сама Паскалевская программа рабочая? Там рекурсий получаеться больше, чем возможных значений index...
--------- Открыть глаза навстречу солнцу.
Ответ отправил: DSota (статус: Практикант)
Отправлен: 09.06.2005, 17:38
Вопрос № 21.983
Привет!
Хочу написать свой эмулятор проца, дайте плзз ссылки на доки!! Заранее спасибо!!
Отправлен: 09.06.2005, 18:13
Вопрос задал: valix (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: DSota
Здравствуйте, valix!
На http://support.intel.com/support/processors/index.htm - есть все функции и тонкости их процессоров. Единственный минус - они на английском.
--------- Открыть глаза навстречу солнцу.
Ответ отправил: DSota (статус: Практикант)
Отправлен: 10.06.2005, 08:03