Воробьёвы

(-:

№11. Quo Vadis... условные и безусловные переходы

НОВОСТИ ПРОЕКТА HI-TECH

Новость первая: авторов рассылки достали ваши бесконечные глупые вопросы. Но не посылать же вас на три буквы! Поэтому мы открыли eGroup - это такой список рассылки, в который вы можете кидать все ваши вопросы... Модерирует этот список DZ BELTSY - прошу любить и жаловать. Вот мыл группы: RTFM_Helpers@egroups.com. Туда и спрашивайте...

По всем вопросам, касамых работы группы мыльте модератору: bejenari@beltsy.md. И да пребудет с вами сила!!

Новость вторая: нас достали жалобы дZенствующего народа на счет хреновой "открываемости" нашего сайта. Поэтому мы решили сделать его зеркало в Рунете. Собственно, мы его уже сделали :) Его адрес вы узнаете через неделю - когда мы пофиксим некоторые баги (публичный сенькс to Qvestor777 за их поиск).

Новость третяя: "творческим коллективом" принят следующий принцип: обновление сайта должно происходить КАЖДЫЙ ДЕНЬ! Пока что мы этому принципу следуем...

НОВЫЕ ПОСТУПЛЕНИЯ

A. Открыт подраздел "Справочные системы", где вы уже можете найти:

- Справочная система по языку ассемблер.

- Справочная система по прерываниям и функциям BIOS&DOS TechHelp v.6.0.

- The Assembly Language database.

- The Encyclopaedic Reference for PC Interrupts 1.02.

ЭТО ОЧЕНЬ НУЖНЫЕ ВЕЩИ! Без них невозможно программировать!

B. Открыт подраздел "Документация", в который мы потихоньку заливаем имеющуюся у нас русскоязычную документацию:

- Введение в микропроцессор 80386 by И Н Э У М.

- Описание работы и системы команд контроллера НГМД i8272.

- Графический адаптер 8514/A фирмы IBM by Эд Макнирни.

- MS-DOS. Руководство разработчика.

- Мануал по Турбо Ассемблеру 3.0.

- Мануал по Турбо Отладчику 3.0.

- Программно-аппаратная реализация компьютера IBM PC by П. Нортон.

- Мануал по программированию EGA.

Старенькая, но все же - документация ;). Но вы не отчаивайтесь :). Скоро будет много новой :). Готовится раздел "Публикации", где будет куча актуальных статей и - спешу вас обрадовать... нет... не буду спешить вас радовать ;). Разберемся сначала с зеркалом...

С. И еще: тут многие DZ братья спрашивали, что делать, если их прога, написаная на древнем BP ругается на какую-то "runtime 200 error" при попытке запуска оной на крутых тачках... Отвечаю: фиксить нужно такие первобытные проги! В специальном разделе "Фиксы" - две... угадайте кто...

Вот ими и лечите ентот сифилис...

РАZБОРКА!

DZ Sergey Kondratenko писал:

"Захотелось черкануть пару строк по поводу оптимизации исходного кода (№8).

Общеизвестно, что

      XOR AX,AX
      INC AX

работает быстрее, чем

      MOV AX,0001.

Аналогично и с командами

      ADD AX,0001

и

      INC AX

(к тому же ADD AX,0001 не согласуется с провозглашенным принципом байтом меньше (№7).

Так что старайтесь по мере возможностей сразу использовать красивый оптимизированный код."

DZ Ivol решил проверить:

"А это точно? Почему? Я создал два вложенных цикла по ffff каждый, и в одном делал XOR AX,AX и INC AX, а в другом MOV AX,0001. Дык, первый вариант получается даже медленнее ~36 сек, против ~33 сек у mov ax,1 (у меня P2-400 под W2K) В чем дело? Как говорится в русской народной мудрости: "Стою на асфальте в лыжи обутый, то ли лыжи не едут, то ли я... дурак..."

Господа дZенствующие программеры!! Ищите истину!! Sergey, слово за вами ;).

Да пребудет с вами сила!!

DZ SASHOK ВДОГОНКУ К ПРОШЛОМУ НОМЕРУ

Кирпича на этот раз нет. А есть только мелкий песок.

В параграфе "ЧТЕНИЕ ДАННЫХ ИЗ ПОРТА" команда у тебя изображена так:

   -i 3fd 7D

а я бы предпочел увидеть что-нибудь такое:

   -i 3fd
   7D

Впрочем, это так, мелкая придирка.

А еще все в том же многострадальном выпуске 10 ты слово "Ууупс!" употреБЛ*ешь. А знаешь, когда его принято употреблять? Ну вот, представь, сидишь ты за столом и попросила тебя соседка вина ей подлить, а ты бутылкой ее бокал задеваешь и на нее же и выворачиваешь. Вот это будет ууупс! А когда "DZEBUG загрузил вашу программу и готов к работе :)" - это вовсе не ууупс, а совсем даже наоборот.

Так сказать, "к вопросу о терминологии".

БЕЗУСЛОВНЫЕ И УСЛОВНЫЕ ПЕРЕХОДЫ

[1] "Переходы" бывают разные. Если вы пришли в гости, а вас просто послали к черту - то такой переход называется "безусловный". А нежели вам сказали: "если без пива - то иди к черту, а если с пивом - тогда проходи" - то это уже "условный" переход.

Соответствено для успешного перехода необходимо указать: ПРИ КАКОМ УСЛОВИИ выполнить переход, КУДА ПЕРЕЙТИ, ну и, наконец, сам пинок под зад нужно СДЕЛАТЬ, чтобы переход "гостя" в заданном направлении все-таки "состоялся".

Безусловный переход у нас "делает" мнемоническая команда JMP, после которой следует указать адрес, на который "компьютер" должен пойти на ;). В данном случае УСЛОВИЕМ у нас будет "при любых обстоятельствах": хоть пустой, хоть с пивом, хоть с водкой... все равно ПОШЕЛ ТЫ НА... (хозяин изволят хандрить-с)... В выпуске 7 п.4. вы уже использовали эту команду для создания "спецдефекта". Если кто еще не понял, что делает эта команда - к нему и отсылаю. Сделайте "спецдефект" и посмотрите на него под отладчиком... когда до вас дойдет, почему мы там не предусмотрели выхода (INT 20h) - можете переходить к п.2 текущего выпуска...

[2] Условный переход у нас организуется двумя командами. Первая - это своего рода "весы", сравнивающие массу двух грузов. Соответственно, возможны только три их положения: наклон влево (груз в левой чашке тяжелее), наклон вправо (груз в правой чашке тяжелее) и равновесие. Точную массу груза такими весами можно узнать только путем длительного сравнивания массы "груза" с заранее ведомой массой всяческих там гирек и прочих "эталонов"...

В качестве аптекарских весов у нас команда CMP, которой обязательно нужно указать ЧТО и С ЧЕМ она будет сравнивать.

Пишем, например,

    CMP AX,BX

В зависимости от значений регистров у нас возможны следующие состояния: "наклон влево" (AX > BX), "наклон вправо" (AX < BX) и "равновесие" (AX = BX). Таким образом УСЛОВИЕ у нас уже организовано :). Только оно не бинарное, а еще и "серединный вариант" есть. Это нормально. Это для того сделано, чтобы мы могли выражения типа "больше-или-равно", "меньше-или-равно" да и просто "равно" в своих программах использовать...

Итак, УСЛОВИЕ есть... а теперь решаем, что нам делать при том или ином условии...

Вот далеко не полный список возможных "прыг-скоков":

    JE - переход если равно.
    JNE - переход если не равно.
    JA - переход, если больше.
    JAE - переход, если больше или равно.
    JB - переход, если меньше.
    JBE - переход, если меньше или равно.

Естественно, что после мнемоники ("прыгнуть, если") должен стоять АДРЕС, куда нужно "прыгнуть" если условие соблюдено. Если же условие не соблюдено, то прыжок не происходит и выполняется нижеследующая строка программы...

Задание на медитирование: зрительно представьте себе "весы правосудия". И побросайте на их чашки разную шестнадцатеричную дрянь в различных "пропорциях" и "комбинациях". Просветлиться вы должны следующим образом: в какую бы сторону эти ваши "весы" не склонялись - вы все равно заставите систему работать так, как ЭТО вам угодно! "Весы" - они только констатируют факт. А вот "приговор" - выносят судьи. Гы... и пусть после этого только кто скажет, что программерам чужда гребаная "политическая жизнь" государства!!

Блин, а о чем это я?? Ах да... переходы...

[3] Продолжим программировать, что ли? Напишем что-нибудь красивое неизменно тупое? С использованием условных и безусловных переходов?

Поехали!! Слабаем мы сейчас что-то наподобие графического редактора :)). Не верите??

У-у-у... Сложная задачка! Если въедете что да как - значит молодцы!! Значит разобрались-таки с дzебагом!! Значит подключились-таки к программерскому эгрегору и более-менее привели в порядок свои мозги :)... А это сложная штука, я вам скажу - мозги в порядок приводить! Особенно когда когда есть куча инструментов, которые "порядок в коде" сами как-бы наводят :).

Думаете вы по этой рассылке программировать учитесь?? По-настоящему программировать мы еще не начали! Все, чем мы пока занимаемся - это приводим в порядок свои мозги и тренируемся на кнопки клавиатуры нажимать :)). А вот ско-о-оро НАЧНЕМ... тогда "прощай, здоровье" настоящее будет!!

Итак, сначала рассмотрим прерывания, которые в нашем "графическом редакторе" будут использоваться. Их три штуки и все BIOS'овские...

Как-то:

     mov AH,00   ;функция 0 прерывания 10h устанавливает "режим видео"
     mov AL,04   ;"на входе" (в регистре AL) - номер режима .
     int 10h     ;если AL=4, то устанавливается цветной 320х200 графический режим.

Подробности об этом прерывании ищите в "справочных системах". У нас на сайте их аж четыре штуки... ;). О "номерах" других режимов - см. там же...

Я ж и говорю - без справочников в низкоуровневом программировании ну ни шагу ступить нельзя!!

     mov CX,64h   ;CX и DX - координаты точки
     mov DX,64h  
     mov AH,0Ch   ;функция 0Ch (в регистр AH ее!) прерывания 10h рисует точку.
     mov AL,1Bh   ;в AL - "код цвета" этой точки.
     int 10h  

Опять-таки - подробности о координатах и "кодах" цвета ищите сами!! Благо, знаете, где искать...

     mov AH,00    ;функция 0 прерывания 16h
     int 16h      ;"читать код нажатой клавиши"

Эта функция считывает код сканирования и код символа из буфера клавиатуры (есть такой). Если в буфере нихрена нету - она ждет, пока там че-нить появится... То есть ЖДЕТ, чтоб вы нажали на какую-нибудь клавишу, код которой будет занесен в регистр AX... причем в AL - "символ", а вот в AH - так называемый "код сканирования"...

Про коды вы пока голову не забивайте. Достаточно знать, что после нажатия Up в AH "попадет" значение 48h, Down - 50h, Left - 4Bh, Right - 4Dh.

Как работает последний кусок кода - обязательно проверьте под отладчиком :). Это полезно :)

[4] И лезем, лезем в наш горяче любимый DZEBUG, дабы набить там драгоценные строчки машинного мнемонического никому-кроме-вас-непонятного кода!!

     -a
     :0100 MOV AH,00        ;устанавливаем графический режим
     :0102 MOV AL,04
     :0104 INT 10
     :0106 MOV CX,0064      ;координаты Первой Точки
     :0109 MOV DX,0064
     :010C MOV AH,0C        ;рисуем точку!
     :010E MOV AL,1B
     :0110 INT 10
     :0112 MOV AH,00        ;ждем нажатия на клавишу
     :0114 INT 16
     :0116 CMP AH,4B        ;а не нажат ли у нас Left?
     :0119 JE 012A               ;если да - то "прыг"! если нет - то следующая строчка
     :011B CMP AH,4D        ;а не нажат ли у нас Right?
     :011E JE 012D               
     :0120 CMP AH,48        ;а не нажат ли у нас Up?
     :0123 JE 0130
     :0125 CMP AH,50        ;а не нажат ли у нас Down?
     :0128 JE 0133
     :012A DEC CX           ;задаем новые координаты, в зависимости
     :012B JMP 010C         ;от нажатой клавиши - и скок в начало!
     :012D INC CX
     :012E JMP 010C
     :0130 DEC DX
     :0131 JMP 010C
     :0133 INC DX
     :0134 JMP 010C

Если вы все ввели правильно - должно заработать! Полюбуйтесь на плоды своей медитации... красиво?

[5] А щас я это все дело прокомментирую:

Адреса 100...200. Устанавливаем графический режим. Указываем функцию (100), указываем номер режима (102) и вызываем прерывание (104).

Адреса 106...109. Инициализируем координаты Первой Точки. Координаты последующих точек будут определяться "динамически" - в зависимости от нажатой клавиши.

Адреса 10С...110. Рисуем точку. Первый раз - в координатах, инициализированных командами по адресам 106 и 109. Все последующие разы - по кординатам, "инкрементированным" или "декрементированным" (во словеса!) по адресам: 12A, 12D, 130 и 133.

Адреса 112...114. Ждем нажатия на клавишу!

Адреса 116...128. "Щемим" нужные нам клавиши. "Взвешиваем". На каждую из курсорных клавиш по адресам 12A...134 приготовлены "обработчики". Если найдена "нужная клавиша", то делаем прыг на "обработчик" этой клавиши!

Адреса 12A...134. В этом блоке определяется, что делать с координатами следующей точки... после чего - прыжок на "рисуем точку" :).

Правда, здорово получилось?

[6] Как говорил Петя Нортон (настоящая фамилия Норкин - см. Правильную историю компьютера), "Совершенствовать программу можно бесконечно. Вопрос здравого смысла - КОГДА целесообразно остановиться".

Мой здравый смысл говорит, что надо мне побыструхе закончить энтот номер и бежать домой :). В последнее время я предпочитаю проводить ночи вовсе не за компьютером...

А вы - думайте: как сократить размер этой программы (может, что лишнее там), как сделать номальный выход... и вообще... побольше думайте... Над "рисовалкой" еще работать и работать! Заготовку получили? Дополняйте и оптимизируйте!

И да пребудет с вами сила!!

ОБЗОР ДZЕНСКИХ САЙТОВ - АССЕМБЛЕР.РУ

Настоятельно рекомендуем вам сделать скриншот с его заглавной страницы и разместить его на рабочем столе. Дело в том, что согласно закону Подобия любая проекция ASSEMBLER.RU на материальный мир наследует часть присущей ему позитивной энергии. Его автор лжет, когда говорит, что это "сайт о программировании на ассемблере для Windows, не только для Windows, и не только на ассемблере, и не только о программировании"...

Это вовсе не сайт. Это - Магический Предмет!

Аргументирую:

- Размещение на рабочем столе скриншота assembler.ru навеки избавляет вас от выполнения компьютером "недопустимых операций".

- Установка assembler.ru как "стартовой страницы" не только разгоняет процессор, но и волшебным образом увеличивает пропускную способность любого dial-up соединения.

- Добавление assembler.ru в "Избранное" действует аналогично трем спареным источникам бесперебойного питания.

- Сохранение страничек assembler.ru на жестком диске в несколько раз уменьшает степень его фрагментации (при прошивке тега STYLE в MBR вы вообще забудете, что такое фрагментация).

- Шестнадцатикратное повторение мантры "handmade forever" приводит к прямому подключению к специальному низкоуровневому оракулу, который он-лайн ответит на все ваши вопросы...

Истинно говорю я вам: это самый лучший "ассемблерный" сайт Рунета.

ДZенствующие братья!! Сходите на этот сайт и выскажете нам свое мнение об этом ресурсе! Давайте делать раздел "Ссылки" вместе! Написав ваш комментарий к этому ресурсу вы тем самым увековечите свое имя на соответствующей странице нашего сайта!

И да отделяться хорошие зерна от гнилых плевел!! Аминь...

Мылить передпочтительно по ЭТОЙ ссылке... иначе письмо может затеряться...

АНОНС!

В следующем номере разберемся с сегментом данных. По идее это будет последний номер, где мы DZEBUG мучаем. Ученье скоро кончится - начнется бой!! А в бою, оно намного легче будет :). Так вроде Суворов своих солдат грузил??