Ассемблер Это просто! Учимся программировать


Программа из прошлой главы


В принципе, ничего сложно в ней не было. Единственное, на что я хотел обратить ваше внимание, это на перевод шестнадцатеричных чисел в десятичные.

Совет такой: необходимо запомнить (или запомнится само со временем) некоторые часто используемые шестнадцатеричные числа и десятичные:

20h - 32 100h - 256 1Bh- 27 21h - 33

и пр...

(1) call Wait_key ;ждем клавишу... (2) cmp al,27 ;это ESC? (3) je Quit_prog ;если да - то на метку Quit_prog (quit - выход; prog (program) - программа) (4) cmp al,0 ;код клавиши расширенный? (F1-F12 и т.п.) (5) je Begin ;да - повторим запрос... (6) call Out_char ;вызываем процедуру вывода нажатой клавиши на экран (7) jmp Begin ;ждем дальше.... (8) Quit_prog: ;метка, на которую придет программа в случае нажатия ESC (9) mov al,32 ;помещаем в AL <пробел> (10) call Out_char ;вызываем процедуру вывода символа в AL (в данном случае - пробела). Здесь мы как бы "обманываем" процедуру Out_char, которая нужна для вывода нажатого символа на экран. Мы симулируем нажатие клавиши пробел и вызываем процедуру. Подумайте над этим... (11) int 20h ;выходим... (12) ... (13) ; --- Out_char --- ;процедура (комментарий) (14) Out_char proc ;начало (15) push cx ;сохраним все регистры, которые будут изменены подпрограммой... (16) push ax ;...сделаем это для того, чтобы в последствии не было путаницы (17) push es ;сохраним сегментный регистр (18) push ax ;сохраним AX, т.к. в нем код нажатой клавиши... (19) mov ax,0B800h ;установим ES на сегмент видеобуфера (20) mov es,ax (21) mov di,0 ;DI - первый символ первой строки (22) mov cx,2000 ;выводим 2000 символов (80 символов в строке * 25 строк) (23) pop ax ;восстановим код клавиши (см. строку 18)... (24) mov ah,31 ;цвет символа (25) Next_sym: ;метка для цикла (26) mov es:[di],ax ;заносим код клавиши и ее цвет (цвет всегда 31) (27) inc di ;увеличиваем указатель на 2 (первый байт - символ, второй байт - цвет) (28) inc di (29) loop Next_sym ;обработка следующего символа (30) pop es ;восстановим сохраненные регистры и выровним стек (31) pop ax (32) pop cx (33) ret ;вернемся из процедуры (34) Out_char endp

...

В строке (12) опущена процедура ожидания клавиши от пользователя в целях экономии места. Я думаю, что вы без труда разберетесь...

Программа делает следующее:

  • ждет от пользователя клавиши;
  • если это расширенный ASCII (F1-F12, стрелки), то игнорирует ее;
  • если это не расширенный ASCII (A-Z, 0-9 и т.п.) - заполнить экран данным символом;
  • если нажимаем ESC (27 или 1Bh), то заполнить экран пробелами (mov al,32) и выйти.

Ничего сложного...




Начало  Назад  Вперед



Книжный магазин