Программирование на Ассемблере под DOS

На основе двух предыдущих процедур


На основе двух предыдущих процедур мы напишем третью "курсорную" :), которая будет сдвигать курсор на одну позицию вправо. ;-[CURSOR_RIGHT, V1]------------------------------------- ;Перемещает курсор на одну позицию вправо ;На входе: пофиг ;На выходе: нихрена ;Прерывания: ан нэту ;Процедуры: CURSOR_READ, CURSOR_SET ;-------------------------------------------------------- CURSOR_RIGHT proc push DX call CURSOR_READ inc DL call CURSOR_SET pop DX ret CURSOR_RIGHT endp
А здесь очень простая идеология :)). Из двух процедур мы собрали третью :)). Вызвали CURSOR_READ, получили в DX текущие координаты курсора. Ту координату, что столбец (DL, младшая часть DX), увеличили на единицу. А потом вызвали процедуру CURSOR_SET, которая у нас устанавливает координаты курсора. Новые координаты в нее передаются опять таки через тот же DX. Улавливаете?
  Естественно, мы запросто можем отказаться от процедур CURSOR_SET и CURSOR_READ и решить данную задачу внутри одной процедуры... В общем, свой выбор вы сделаете сами. Страшна Сцилла оптимизации по быстродействию, еще страшнее - Харибда оптимизации по размеру, но тварь самая страшная - это Программер, который оптимизирует свой код по собственной "удобноваримости"... (Хм... интересно, что бы сказали по этому поводу программеры Мелкософта...)
  Обратите также внимание, на push/pop DX внутри процедуры. Мы просто сдвигаем курсор вправо. ПРОСТО СДВИГАЕМ на одну позицию. То, что в DX нам надо? Сто лет оно нам не надо... херим... А остальные регистры - еще процедурами CURSOR_SET и CURSOR_READ неоднократно "похерены". В каком смысле "похерены"?? А в таком, что состояние регистров ПОСЛЕ вызова CURSOR_RIGHT в точности такое же, как и было ДО. Хотя сами помните, что всю четверку регистров мы еще как юзали...
  Вот теперь можно сделать паузу и (это мериканцы пускай свой пластмассовый твикс кушают) ПОМЕДИТИРОВАТЬ...

Содержание раздела