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

Следующая процедура также основана на


Следующая процедура также основана на одном-единственном прерывании. Все, что она делает - это возвращает текущие координаты курсора. ;-[CURSOR_READ, V1]------------------- ;Возвращает координаты курсора ;На входе: пофиг ;На выходе: DH - строка, DL - столбец ;Прерывания: INT 10h, AH=03h ;Процедуры: ан нэту ;------------------------------------------ CURSOR_READ proc push AX push BX push CX mov AH,3 xor BH,BH int 10h pop CX pop BX pop AX ret CURSOR_READ endp
  Прежде всего обратите внимание на цепочку push'ей и pop'ов (далее - просто "поп"), на очередность записи в стек (AX, BX, CX) и извлечения (CX, BX, AX - обратное то есть). Все регистры, которые мы собираемся изменять внутри процедуры, должны обязательно сохраняться в ее начале и восстанавливаться в ее конце. В важности соблюдения этого правила вы еще не раз убедитесь на своем горьком опыте. Те, кто медитировал над заданием из главы 1.10 #4, уже знают, о чем тут идет речь (а кто не пытался - самое время!).
  Давайте посмотрим на нашу процедуру с точки зрения пушей и поп. AH мы изменяли для указания функции прерывания, которую мы хотим использовать. BH обнуляли для указания видеостраницы (пока будем только одну-единственную, нулевую, юзать). "А CX зачем" - спросите. - "Вроде мы его не трогали...". И точно, мы - не трогали. А посмотрите в описании, что в этот регистр нам засунуло прерывание в "результате" своего выполнения... Посмотрели? Оно вам надо?? То, что нам надо - координаты - засунуты в DX (DH, DL), поэтому их значения мы не сохраняем. Если бы нам нужно было получить информацию о типе курсора - мы бы запушили DX, а CX бы оставили в покое...
  Что? Без пива не разобраться?
  Так в чем, черт подери, дело? Разбирайтесь под пиво!!
  Вот вам еще одна аналогичная процедура, которая не определяет, а УСТАНАВЛИВАЕТ курсор в заданные коодинаты...
;-[CURSOR_SET, V1]--------------------------------------- ;Устанавливает курсор в заданные координаты ;На входе: DH - строка, DL - столбец ;На выходе: нихрена ;Прерывания: INT 10h, AH=02h ;Процедуры: ан нэту ;-------------------------------------------------------- CURSOR_SET proc push AX push BX push CX mov AH,2 xor BH,BH int 10h pop CX pop BX pop AX ret CURSOR_SET endp
  Если кто чего не понимает - смотрите комментарии к предыдущей процедуре (+ описание прерываний и команд! это обязательно!). Если кто не понял и предыдущую - снова отсылаю к главе 1.10

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