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


Программка для практики


Усовершенствуем из предыдущей главы, которая выводила в верхний левый угол "рожицу" прямым отображением в видеобуфер (1) CSEG segment (2) org 100h (3) Begin: (4) mov ax,0B800h (5) mov es,ax (6) mov di,0 (7) mov al,1 (8) mov ah,31 (9) mov cx,2000 (10) (11) Next_face:

(12) mov es:[di],ax (13) add di,2 (14) loop Next_face (15) (16) mov ah,10h (17) int 16h (18) int 20h (19) CSEG ends (20) end Begin

Уфф! Длинная получилась. Прежде чем читать описание программы, попробуйте сами разобраться, что в итоге получится. Поверьте, это принесет вам пользу. Все ведь очень просто!

Теперь описание программы.

Строки с (1) по (10) и с (15) по (20) вы уже знаете. Объясню только новое.

Строка (11) - это метка, как бы "голова" нашего цикла. Строка (14) - "хвост" цикла. Все, что находится в пределах строк (10) - (14), является циклом. Сам цикл будет повторяться 2000 раз, для чего мы и заносим в CX число 2000 (строка (9)).

В строке (12) записываем в видеобуфер (0B800:DI) число в AX (это символ (строка (7) и атрибут (строка (8)). Итак, первый символ занесли. Что делаем дальше?

Дальше увеличиваем регистр DI на 2 для того чтобы перейти к адресу следующего символа. Почему на 2? Дело в том, что в видеобуфере один символ занимает 2 байта: сам символ и его атрибут. Т.к. символ у нас в AL, а атрибут в AH, и мы загрузили уже эти два байта в строке (12), то и увеличиваем DI (смещение) на 2.

DI теперь указывает на адрес для следующего символа. Осталось уменьшить счетчик (CX) на 1 и повторить. Что мы, собственно, и делаем в строке (14).

Все! Обратите внимание на скорость вывода символов при запуске программы.

Еще раз напоминаю: пожалуйста, печатайте все программы сами! Так вы быстрее освоите Ассемблер!




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



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