7401

Программирование игры крестики-нолики на ассемблере

Курсовая

Информатика, кибернетика и программирование

Введение Впервые крестики-нолики могли появиться в Индии более 2000 лет назад, но потом тот, кто их чуть было не изобрел, понял, что за доску 8х8 он может стрясти намного больше зерна, чем за 3х3, и поэтому он изобрел шахматы. Второй раз эту игру из...

Русский

2013-01-23

451.5 KB

98 чел.

Введение

Впервые крестики-нолики могли появиться в Индии более 2000 лет назад, но потом тот, кто их чуть было не изобрел, понял, что за доску 8х8 он может стрясти намного больше зерна, чем за 3х3, и поэтому он изобрел шахматы. Второй раз эту игру изобретали в Римской империи, но когда их изобретателю оставался последний штрих, какие-то варвары коварно захватили Рим и предотвратили распространение игры. Когда игра была окончательно изобретена, доподлинно неизвестно. Предположительно, ее случайно изобрел, решая трехуровневую систему уравнений, французский математик. В средние века игра была очень популярна, известны даже случаи открытия крестиконолических кафе, имеющих высокий рейтинг посещаемости. В связи с тем, что люди, заигравшиеся в крестики-нолики, стали пропускать пытки, допросы и сожжения на костре, церковь игру запретила. Но в нее все равно играли все, хоть и тайно. Так, например, один из итальянских художников зафиксировал тот момент, когда Папа Римский играл темной ночью под одеялом в крестики-нолики сам с собой. Кстати, потом римейк этой картины нарисовал Казимир Малевич. В эпоху Возрождения игра была признанна законной, и с тех пор является одним из самых популярных способов побездельничать в школе, на работе и где угодно.


1 Обзор аналогов и предметной области

  1.  Изучение предметной области

Предметом данной работы является известная игра «крестики-нолики». Правила игры (Классический вариант): Игроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 своих фигур по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики.

Классические «крестики-нолики» на поле 3x3 не представляют никакого практического интереса. общеизвестен алгоритм, который при правильной игре гарантирует ничью любой стороне, а при ошибке противника позволяет выиграть. Таким образом, игра находится в состоянии «ничейной смерти».

Перебор всех возможных ходов:

За крестики:

Сделать первый ход в центральное поле.

Противник может ответить ходом либо в угол, либо на сторону поля.

Если противник ответил ходом в угловое поле — сходить в ответ в соседний угол.

Противник будет вынужден пойти в противоположный угол, чтобы на следующем ходу не проиграть.

Дальнейшие ходы делаются так, чтобы блокировать построение тройки противником. — Ничья.

Если противник ответил ходом на сторону — он проиграл. Следует ответить ходом в один из двух несоседних углов.

Противник будет вынужден пойти в противоположный угол, чтобы на следующем ходу не проиграть.

Сходить в угол, соседний с предыдущим, так, чтобы крестики образовали треугольник — получится «вилка», позволяющая следующим ходом построить тройку двумя способами.

Как бы ни ответил противник, следующим ходом строится одна из троек. — Выигрыш.

Или:

Сделать первый ход в угол.

Противник может ответить либо ходом на сторону, либо ходом в угол, либо ходом в центр.

Если противник ответил ходом в угол, он вновь проигрывает. Следует ответить ходом в любой из оставшихся углов.

Противник будет вынужден блокировать угрозу, следующим ходом нужно занять последний угол, что дает вилку. — Выигрыш.

Если противник ответил ходом в центр, то нужно занять угол противоположный первому углу. Противник может ответить либо ходом на сторону, либо ходом в угол.

Если противник ответил ходом в угол, он проиграл — следует немедленно занять другой угол, блокируя тройку противника и образуя свою вилку. — Выигрыш.

Если противник ответил ходом на сторону, то следующие ходы строятся так, чтобы блокировать тройки соперника — Ничья.

За нолики:

Если противник сходил первым ходом в центр, ответить ходом в любой из углов, затем каждым следующим ходом блокировать возможность построения противником очередной тройки, при возможности выбора предпочитая ходы в углы. — Ничья.

Если противник сходит первым ходом не в центр, ответить ходом в центр. Если ответным ходом противник займёт два противоположных угла, ответить ходом на сторону. Затем каждым следующим ходом блокировать возможность построения противником очередной тройки, при возможности выбора предпочитая ходы в углы. — Ничья.

Данный алгоритм предполагает оптимальную игру противника. Естественно, если противник допускает ошибку, позволяющую следующим ходом построить тройку, её следует построить, но при правильной игре такое невозможно. Таким образом, нолики могут гарантированно обеспечить себе только ничью.

Полное дерево игровых ситуаций для игры крестики-нолики(поле 3 на 3):

  1.  Обзор аналогов

Игра Крестики-нолики имеет классический вариант исполнения: поле 3 на 3. В качестве аналогов можно рассматривать подобную игру в увеличенном формате: поле 9 на 9, 10 на 10, 50 на 50, 100 на 100 и т.д.,  вплоть до поля бесконечность на бесконечность. Подобным образом осуществляется стратегия другого варианта игры:

в данной версии требуется сначало с помощью поочередной постановки вертикальных и горизонтальных черт добиться появления квадратных областей, в которых игрок, собравший последние, вставляет свою фигуру, крестик или нолик. Побеждает тот, кто заполнит как можно больше клеток своими фигурами.

Также крестики-нолики используются в экономике. Существует метод графического анализа крестики-нолики Томаса Джонса                          Дорси:  инвесторы склонны забывать о том, что основной силой, влияющей на цены акций, является закон спроса и предложения. Графики `крестики-нолики` - проверенный временем, испытанный метод отслеживания колебаний между спросом и предложением, позволяющий своевременно распознавать многообещающие тренды, так чтобы можно было использовать преимущества этого метода анализа. Графики `крестики-нолики` предназначены не только для брокеров. Они являются простым и понятным представлением старейшего и наиболее совершенного, полностью проверенного метода технического анализа, исследующего поведение цен.

  1.  Выводы

В процессе исследований была описана предметная область, основные правила и теория игры «крестики-нолики». Рассмотрены аналоги данной игры. Очевидно, что «крестики-нолики» не только интересная, но и полезная игра. Так каак создано много игр на стандартном поле, особый интерес представляет игра на достаточно болььшом поле, обладающая, безусловно, большей сложностью.

2 Математическая модель и методы исследования

2.1 Выбор математической модели

Разрабатываемое программное обеспечение направлено на создание компьютерной версии игры «крестики-нолики». Данная игра имеет особое значение в области теории графов. Таким образом, особый смысл имеет  построение графа, демонстрирующего принцип игры.

2.2 Математическая модель игры «крестики-нолики»

При разработке данного программного обеспечения, была поставлена задача – написать игру «Крестики-нолики».

  1.  В качестве начальной комбинации возьмем линию, где осталось не заполненным нашими символами только одно поле.
  2.  Получаем следующего кандидата в победную комбинацию, путем объединения двух победных комбинаций. По ресурсам очень трудоемкая операция. Из двух комбинаций длинной n и m получается 2^n*2^m новых комбинаций. Большинство из них изоморфны предыдущим комбинациям или их невозможно разместить на игровом поле. Но чтобы это проверить их надо сформировать.
  3.  Проверяем, изоморфна ли полученная комбинация уже полученным победным комбинациям. Симметричность комбинаций, когда комбинация состоит из очень похожих элементов, сильно усложняет определение изоморфизма.
  4.  Проверяем, можно ли полученную комбинацию разместить на игровом поле. Самая трудоемкая операция. Суть ее в поиске подграфа в графе. Скорость работы очень сильно зависит от порядка рассмотрения линий составляющих победную комбинацию.
    1.  Сначала проверяем, не содержатся ли в комбинации, графы, которые невозможно разместить на рабочем поле. Например:

  

  1.  На второй стадии пытаемся разместить комбинацию на пустом игровом поле. Пример комбинации и ее размещение на игровом поле:

2.3 Методы реализации

Язык программирования наиболее полно учитывающий особенности "родного" микропроцессора и содержащий мнемонические обозначения машинных команд называется Ассемблером. Программа, написанная на Ассемблере называется исходной программой. Дальнейшая работа будет проводиться на версии, называемой Турбо Ассемблер.

Разработка программы на Ассемблере состоит из следующих этапов:

  •  1) Составление алгоритма в виде блок-схемы или структурного описания,
  •  2) Ввод в ЭВМ текста исходной программы PROG.ASM с помощью редактора текстов. Имя PROG может быть произвольным, а расширение ASM - обязательно,
  •  3) Перевод (трансляция или ассемблирование) исходной программы в машинные коды с помощью транслятора TASM.EXE. На этом этапе получается промежуточный продукт PROG.OBJ (объектный код). Выявленные при этом синтаксические и орфографические ошибки исправляются повтором пп.2 и 3,
  •  4) Преобразование с помощью программы TLINK.EXE объектного кода PROG.OBJ в выполнимый код PROG.EXE или PROG.COM.
  •  5) Выполнение программы и ее отладка начиная с п.1, если встретились логические ошибки.

Текст  программы на Ассемблере содержит следующие операции:

  •  а) команды или инструкции,
  •  б) директивы или псевдооператоры,
  •  в) операторы,
  •  г) предопределенные имена.

Основные операторы, используемые в программе:

Команда PUSH. выполняется в четыре этапа:

  •  Адрес в SP уменьшается на 1: (SP) <-- (SP) - 1.
  •  По этому адресу помещается старший байт 87: ((SP)) <-- (AH).
  •  Содержимое SP снова уменьшается на 1: (SP) <-- (SP) - 1.
  •  По полученному адресу загружается младший байт 4c: ((SP)) <-- (AL). 

Операнд пересылки MOV:

mov Операнд1, Операнд2 – Копирует содержимое Операнда2 в Операнд1.

Команды работы со стеком организованы в соответствии с принципом LIFO (по-следним пришел – первым ушел) :

push операнд ; запись операнда в стек

pop операнд ; чтение операнда из стека

В программе используются следующие процедуры:  

Процедура рисования крестика:

VIVOD_CROSS PROC

 Процедура рисования нолика:

VIVOD_ZERO PROC

 Процедура рисования фона в виде коричневого квадрата:

Black_KV PROC

 Процедура контроля координат поставленной фигуры:

KOORD PROC

 Процедура проверки вертиткали на получение пяти фигур подряд:

Vertical PROC

 Процедура проверки диагонали на получение пяти фигур подряд:

Nakl PROC

 

2.4 Вывод:

Описана математическая модель игры, Рассмотрены методы реализации описанных математических моделей, а также общая структура программы.

 

3 Практические результаты и их обсуждение

3.1 Описание программы

В соответствии с описанной математической моделью было разработано программное обеспечение, позволяющее двум игрокам играть в игру «крестики-нолики».

Взаимодействие пользователя с программой осуществляется с помощью стандартного полноэкранного приложения.

Программное средство реализовано в среде Assembler на языке программирования                             Turbo Assembler.

К основным функциям программного обеспечения относятся:

- вывод игрового поля.

- установка на игровом поле фишек в виде крестиков и ноликов.

-вычисление победного хода и выдача сообщения о выигрыше.

3.2 Описание логической структуры

При запуске программы на экране появляется информация о разработчике и горячие клавиши, а также предложение нажать любую клавишу для продолжения. При нажатии на любую клавишу происходит построение игрового поля на коричневом фоне. Пользователь иммет возможность устанавливать поочередно на игровом поле крестики и нолики. При построении по вертикали, горизонтали или диагонали ряда из пяти одинаковых фигур, последняя выигрывает.  

3.3 Описание подсистем программного обеспечения

Программа состоит из трех компонентов: подсистема взаимодействия с пользователем, подсистема просчета координат для выявления выигрышной ситуации и подсистема графического отображения.

3.3.1 Подсистема взаимодействия с пользователем

Назначение подсистемы взаимодействия с пользователем: обеспечение своевременного оповещания пользователя о сложившейся на игровом поле ситуации и о требующихся от него действиях в дружелюбной форме.

Для создания интерфейса использовалась среда программирования Turbo Assembler.  В интерфейсе нашли  применение  следующие компоненты:

  1.  Экран приветствия: отображает черный фон, на котором высвечивается информация о разработчике, список горячих клавиш, а также предложение нажать любую клавишу для продолжения  и перехода в игровой режим.
  2.  Игровой информер: выдает в верхнем левом углу информацию о чекущем ходе и выигрыше, в случае последнего.

Функции, входящие в подсистему взаимодействия с пользователем:

Экран приветствия:

  •  TEXT_WELCOME_1 DB 'WELCOME TO CROSS-ZERO GAME!',10,13,'$'  

Выводит текст: “WELCOME TO CROSS-ZERO GAME!”

  •   TEXT_WELCOME_2 DB 'A - move left',10,13,'W - move up',10,13,'S - move down',10,13,'$'

Выводит текст: “A - move left”

    “W - move up”

    “'W - move up”

  •   TEXT_WELCOME_3 DB 'D - move right',10,13,'Q - exit programm ',10,13,'$'

Выводит текст: “D - move right

    “Q - exit programm”

  •   TEXT_WELCOME_4 DB 'Authors: KANTIMIROV D.A. AND SEREDNEV A.A. KNASTU 2010',10,13,'PRESS ANY KEY TO START$'

Выводит информацию о разработчике.

Игровой экран :

  •   TEXT_1_PLAYER DB 'move of the cross ',13,'$'

Выводит текст: “move of the cross ”

  •   TEXT_2_PLAYER DB 'move of the zero ',13,'$'

Выводит текст: “move of the zero ”

  •   TEXT_3 DB 'CROSS WINS                  $',10
    •   TEXT_4 DB 'ZERO WINS                   $',10
    •   TEXT_5 DB 'FRIENDSHIP WINS             $',10

Выводит информацию о победителе: крестики, нолики, ничья.

MOV DX, OFFSET [TEXT] –передает текст в регистр DX, что позволяет вывести этот текст на экран.

3.3.2 подсистема просчета координат для выявления выигрышной ситуации

Подсистема просчета координат для выявления выигрышной ситуации используется для контроля за координатами проставляемых фигур с целью избежания случаев постановки нескольких фигур в одну клетку, а также с целью проверки поставленных фигур для выявления победной комбинации – пяти идущих подряд одинаковых фигур, крестиков или ноликов.

Процедуры, входящие в подсистему просчета координат для выявления выигрышной ситуации:

  •  KOORD PROC - Процедура контроля координат поставленной фигуры
  •  Vertical PROC - Процедура проверки вертиткали на получение пяти фигур подряд.
  •  Nakl PROC - Процедура проверки диагонали на получение пяти фигур подряд.

3.3.3 Подсистема реализации графических объектов

Основная функция подсистемы реализации графических объектов – обеспечить интересное и красочное интерактивное игровое приложение благодаря прорисовке игрового поля и игровых фигур:

  1.  Игровое поле, состоящее из фона в виде коричневого квадрата, а также белых вертикальных и горизонтальных полос, образующих игровые клетки.
  2.  Управляемый  клавишами курсор в виде квадрата
  3.  Синие фишки в виде крестика
  4.  Желтые фишки в виде нолика.

Процедуры, входящие  в реализацию графических объектов:

  •  Black_KV PROC – процедура прорисовки фона (коричневого квадрата)
  •  VIVOD_ZERO PROC – процедура прорисовки ноликов.
  •  VIVOD_CROSS PROC – процедура прорисовки крестиков.
  •  MOVE_KURSOR PROC – процедура движения курсора
  •  RIC_KURSOR PROC – процедура прорисовки курсора
  •  POLE PROC – процедура прорисовки игрового поля (вертикальные и горизонтальные линии).
  •  GAME_CLEAR_SCR PROC – процедура очистки экрана

3.4 Руководство оператора

При запуске программы появляется полномасштабный экран приветствия с информацией о разработчике и о горячих клавишах:

А – переход на клетку влево

D – переход на клетку  вправо

W – переход на клетку вверх

S – переход на клетку вних

Q – выход из программы

Для продолжения работы программы от оператора требуется нажатие любой клавиши, после чего программа переходит к игровому экрану.

На экране прорисовывается фон в виде коричневого квадрата, на котором проставляются клетки. С помощью горячих клавиш операторы имеют возможность поочередно передвигать курсор в новую клетку, и посредством клавиши SPACE устанавливать поочередно свою фигуру, крестик или нолик, в выбранную клетку. После построения ряда по вертикали, горизонтали или диагонали из пяти идущих подряд одинаковых фигур, определяется и выводится на экран победитель. После нажатия оператором горячей клавиши Q приложение закрывается.

3.5 Руководство программиста

Программа воссоздает игру «крестики-нолики» на поле 50*50.

Управление осуществляется  с помощью горячих клавиш.

Приложение запускается с помощью соответствующего exe-файла. Название exe-файла не фиксировано и задается программистом.

Компиляция и компоновка производится при помощи tasm.exe и tlink.exe.

3.6 Требования к программному и аппаратному окружению

Минимальные требования к аппаратному обеспечению:

персональный компьютер на базе i386;

минимальный объем ОЗУ – 16 Мб;

графический адаптер –VGA;

программное обеспечение – операционная система DOS;

Испытание производилось на компьютере со следующей конфигурацией:

  •  процессор Intel Pentium 4 с тактовой частотой 3000Mhz;
  •  оперативная память 1024 Мб;
  •  клавиатура, мышь
  •  Видеокарта Asus GeForce 6600 с 256 Мб. видеопамяти;


Заключение

В данной курсовой работе рассмотрена реализация на языке Assembler игры «крестики-нолики». В игре выполняются все её правила.

В ходе выполнения курсовой работы было разработано и протестировано программное обеспечение. Поставленная задача выполнена полностью в установленные сроки.

Список использованных источников

  1.  Юров, В.И. Assembler. Учебник для вузов 2-е изд. / В.И. Юров - СПб.: Питер, 2004. - 637 c.
  2.  Юров, В.И. Assembler. Практикум. / В.И. Юров - СПб.: Питер, 2006. - 399 c.
  3.  Хусаинов, А.А. Принципы Организация ЭВМ и систем: Учеб. пособие. / А.А. Хусаинов, Н.Н. Михайлова - Комсомольск-на-Амуре: ГОУВПО «Комсомольский-на-Амуре государственный технический университет», 2002. – 89 с.
  4.  Пильщиков, В.Н. Программирование на языке ассемблера IBM PC / Пильщиков В.Н. – М.: Наука, 2001. - 464с.
  5.  Зубков, С. В. Assembler для DOS, Windows и UNIX / С.В. Зубков – СПб.: Питер, 2006 – 608 с.


ПРИЛОЖЕНИЕ А

(обязательное)

Текст программы

DATA SEGMENT

TEXT_WELCOME_1 DB 'WELCOME TO CROSS-ZERO GAME!',10,13,'$'

TEXT_WELCOME_2 DB 'A - move left',10,13,'W - move up',10,13,'S - move down',10,13,'$'

TEXT_WELCOME_3 DB 'D - move right',10,13,'Q - exit programm ',10,13,'$'

TEXT_WELCOME_4 DB 'Authors: ............',10,13,'PRESS ANY KEY TO START$'

TEXT_1_PLAYER DB 'move of the cross ',13,'$'

TEXT_2_PLAYER DB 'move of the zero ',13,'$'

TEXT_3 DB 'CROSS WINS                  $',10

TEXT_4 DB 'ZERO WINS                   $',10

TEXT_5 DB 'FRIENDSHIP WINS             $',10

 rejimGr DW ? ; старый граф. режим

; коорд. предидущего курсора

 KOORD_X_OL dw 41

KOORD_Y_OL dw 41

 ; коорд. нынешнего курсора

KOORD_X_N dw 41

KOORD_Y_N dw 41

; величины контролирующие положение вокруг клетки

 XL dw 0

XP dw 0

YL dw 0

 YP dw 0

Chetchik dw 0;счетчик при прорисовке курсора

FLAG dw  0

COLOR db 0

HOD dw 0 ; подсчитывает количество ходов для объявления нечьей

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA

MAIN PROC FAR

 MOV AX, DATA

 MOV DS, AX

 CALL SAVE_REJIM ; сохранить старый графический режим

 CALL GRAPH_INIT ; установить новый графический режим

 ;вывод приветствия

 MOV DX, OFFSET TEXT_WELCOME_1

 MOV AH, 9

 INT 21H

 MOV DX, OFFSET TEXT_WELCOME_2

 MOV AH, 9

 INT 21H

 MOV DX, OFFSET TEXT_WELCOME_3

 MOV AH, 9

 INT 21H

 MOV DX, OFFSET TEXT_WELCOME_4

 MOV AH, 9

 INT 21H

 MOV AH, 7

 INT 21H

 CALL GRAPH_INIT; установить новый графический режим

 CALL GAME_CLEAR_SCR; очистить экран

 CALL POLE; Вывод сетки

metMAIN:

 ; ход крестиков

 inc HOD

 MOV DX, OFFSET TEXT_1_PLAYER

 MOV AH, 9

 INT 21H

 CALL MOVE_KURSOR ; движение курсора

 CALL VIVOD_CROSS ; вывод крестика

 CALL KOORD ; захват зоны вертикали и горизонтали

 mov COLOR,9 ; загрузка цвета крестика

 CALL Vertical ; проверка на прекращение игры по вертикали и горизонтали

 CALL KOORD2 ; захват зоны первой диагонали

 CALL Nakl ; проверка на прекращение игры по первой диагонали

 CALL KOORD3 ; захват зоны второй диагонали

 CALL Nakl2 ; проверка на прекращение игры по второй диагонали

 cmp FLAG,1

 je metEMDPROGR

 ; ход ноликов

 inc HOD

 MOV DX, OFFSET TEXT_2_PLAYER

 MOV AH, 9

 INT 21H

 CALL MOVE_KURSOR

 CALL VIVOD_ZERO

 CALL KOORD

 mov COLOR,10

 CALL Vertical

 CALL KOORD2 ; захват зоны первой диагонали 

 CALL Nakl ; проверка на прекращение игры по первой диагонали

 CALL KOORD3 ; захват зоны второй диагонали

 CALL Nakl2 ; проверка на прекращение игры по второй диагонали

 cmp FLAG,1

 je metEMDPROGR

 cmp HOD,2500 ; проверка на заполненность всего поля

 je NECHIA

 loop metMAIN

metEMDPROGR:

 ; вывод победителя

 cmp COLOR,9

 je CROSSW

 MOV DX, OFFSET TEXT_4

 MOV AH, 9

 INT 21H

 MOV AH, 7

 INT 21H

 loop D

CROSSW: MOV DX, OFFSET TEXT_3

 MOV AH, 9

 INT 21H

 MOV AH, 7

 INT 21H

 loop D

NECHIA: MOV DX, OFFSET TEXT_5

 MOV AH, 9

 INT 21H

 MOV AH, 7

 INT 21H

 ;завершение работы

D: CALL GAME_CLEAR_SCR; очистить экран

 CALL OLD_GRAPF

 mov AX,4c00h

 int 21h

ret

MAIN ENDP

; очистка экрана

GAME_CLEAR_SCR PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

; прокрутка страницы

 MOV AH, 6

 MOV AL, 0

 MOV BH, 0

 MOV CH, 0

 MOV CL, 0

 MOV DH, 255

 MOV DL, 255

 INT 10H

; установка курсора на начало

 MOV AH, 2

 MOV BH, 0

 MOV DH, 0

 MOV DL, 0

 INT 10H

POP DX

 POP CX

 POP BX

 POP AX

 RET

 GAME_CLEAR_SCR ENDP

; установка графического режима

GRAPH_INIT PROC

 MOV AH, 0

 MOV AL, 12H

 INT 10H

 RET

GRAPH_INIT ENDP

SAVE_REJIM PROC

mov ah,0

int 10h

mov rejimGr,ax

 ret

SAVE_REJIM ENDP

; вызов старого графического режима

OLD_GRAPF PROC

PUSH AX

mov ax,rejimGr

mov ah,0

int 10h

POP AX

ret

OLD_GRAPF ENDP

; вывод сетки поля

POLE PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

;закраска фона поля

 mov cx,40

 mov dx,40

 mov al,6

 mov ah,0ch

 mov bh,0

met11:

int 10h

inc dx

cmp dx,440

jbe met11

mov dx,40

add cx,1

 cmp cx,440

jbe met11

;прорисовка линий

 mov cx,40

 mov dx,40

 mov al,15

; вертикальные линии

met1:

mov ah,0ch

 mov bh,0

int 10h

inc dx

cmp dx,440

jbe met1

mov dx,40

add cx,8

cmp cx,440

jbe met1

; горизонтальные линии

mov cx,0

mov dx,0

 mov cx,40

mov dx,40

met2:

mov ah,0ch

mov bh,0

int 10h

inc cx

cmp cx,440

jbe met2

mov cx,40

add dx,8

cmp dx,440

jbe met2

;mov ax,0

;int 16h

 

 POP DX

 POP CX

 POP BX

 POP AX

 RET

POLE ENDP

; Прорисовка курсора

RIC_KURSOR PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 ; затирание старого курсора

 mov cx,KOORD_X_OL

 mov dx,KOORD_Y_OL

 sub cx,1

 sub dx,1

 mov al,15

 mov ah,0ch

 mov bh,0

 mov Chetchik,0

 

metResh1: int 10h

  inc cx

  inc Chetchik

  cmp Chetchik,8

  jl metResh1

 

 mov Chetchik,0

metResh2: int 10h

  inc dx

  inc Chetchik

  cmp Chetchik,8

  jl metResh2

  mov Chetchik,0

  

metResh3: int 10h

  sub cx,1

  inc Chetchik

  cmp Chetchik,8

  jl metResh3

  mov Chetchik,0

metResh4: int 10h

  sub dx,1

  inc Chetchik

  cmp Chetchik,8

  jl metResh4

 ; рисование нового курсора

 mov cx,KOORD_X_N

 mov dx,KOORD_Y_N

 mov Chetchik,0

 sub cx,1

 sub dx,1

 mov al,12;красный цвет

 

metResh11: int 10h

  inc cx

  inc Chetchik

  cmp Chetchik,8

  jl metResh11

 

 mov Chetchik,0

metResh21: int 10h

  inc dx

  inc Chetchik

  cmp Chetchik,8

  jl metResh21

  mov Chetchik,0

 

metResh31: int 10h

  sub cx,1

  inc Chetchik

  cmp Chetchik,8

  jl metResh31

  mov Chetchik,0

metResh41: int 10h

  sub dx,1

  inc Chetchik

  cmp Chetchik,8

  jl metResh41

;завершение рисования

 POP DX

 POP       CX

 POP BX

 POP AX

 RET

RIC_KURSOR ENDP

 

; реакция на нажатие клаваши A

VIVOD_A PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 cmp KOORD_X_OL,41

 je exitP

 mov ax, KOORD_X_OL

 sub ax,8

 mov KOORD_X_N,ax

 call RIC_KURSOR

 mov ax, KOORD_X_N

 mov KOORD_X_OL,ax

exitP:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_A ENDP

; реакция на нажатие клавиши W

VIVOD_W PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 cmp KOORD_Y_OL,41

 je exitP1

 mov ax, KOORD_Y_OL

 sub ax,8

 mov KOORD_Y_N,ax

 call RIC_KURSOR

 mov ax, KOORD_Y_N

 mov KOORD_Y_OL,ax

 

 exitP1:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_W ENDP

; реакция на нажатие клавиши D

VIVOD_D PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 

 cmp KOORD_X_OL,433

 je exitP2

 mov ax, KOORD_X_OL

 

 add ax,8

 mov KOORD_X_N,ax

 call RIC_KURSOR

 mov ax, KOORD_X_N

 mov KOORD_X_OL,ax

 

 exitP2:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_D ENDP

; реакция на нажатие клавиши S

VIVOD_S PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 cmp KOORD_Y_OL,433

 je exitP3

 mov ax, KOORD_Y_OL

 add ax,8

 mov KOORD_Y_N,ax

 call RIC_KURSOR

 mov ax, KOORD_Y_N

 mov KOORD_Y_OL,ax

 exitP3:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_S ENDP

; Процедура движения курсора

MOVE_KURSOR PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 call RIC_KURSOR; вывод начального курсора

metK1:

 mov ax,0

 mov ah,07

 int 21h

 cmp al,' '

 je endK

 cmp al,'a'

 je rica

 cmp al,'w'

 je ricw

 cmp al,'s'

 je rics

 cmp al,'d'

 je ricd

 cmp al,'q'

 je reakq

 ; пользователь вводит заново клавиши пока пробел не введёт

 loop metK1

rica: call VIVOD_A

 loop metK1

ricw: call VIVOD_W

 loop metK1

rics: call VIVOD_S

 loop metK1

ricd: call VIVOD_D

 loop metK1

; если пользователь выходит из программы

reakq: MOV DX, OFFSET TEXT_5

 MOV AH, 9

 INT 21H

 MOV AH, 7

 INT 21H

 CALL GAME_CLEAR_SCR; очистить экран

 CALL OLD_GRAPF

 mov AX,4c00h

 int 21h

 ret

 ret

endK:

 mov al,0

 mov ah,0dh

 mov bh,0

 mov cx,KOORD_X_OL

 mov dx,KOORD_Y_OL ; проверка на занятость квадрата крестиком или ноликом

 int 10h

 cmp al,9

 je metK1

 cmp al,10

 je metK1

 

 POP DX

 POP CX

 POP BX

 POP AX

 RET

MOVE_KURSOR ENDP

; Процедура рисования крестика

VIVOD_CROSS PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 CALL Black_KV

 ; рисование креста

 mov cx, KOORD_X_OL

 mov dx, KOORD_Y_OL

 mov al,9

 mov ah,0Ch

 mov bh,0

 mov Chetchik,0

metKrest1:

 int 10h

 inc cx

 inc dx

 inc Chetchik

 cmp Chetchik,7

 jl metKrest1

 mov cx, KOORD_X_OL

 sub dx,1

 mov Chetchik,0

metKrest2:

 int 10h

 inc cx

 sub dx,1

 inc Chetchik

 cmp Chetchik,7

 jl metKrest2

 mov cx, KOORD_X_OL

 mov dx, KOORD_Y_OL

 mov Chetchik,0

 inc cx

 

metKrest3:

 int 10h

 inc cx

 inc dx

 inc Chetchik

 cmp Chetchik,6

 jl metKrest3

 mov cx, KOORD_X_OL

 inc cx

 mov Chetchik,0

 

metKrest4:

 int 10h

 inc cx

 sub dx,1

 inc Chetchik

 cmp Chetchik,6

 jl metKrest4

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_CROSS ENDP

 

; Процедура рисования нолика

VIVOD_ZERO PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 CALL Black_KV

 ;рисование нолика

 mov cx, KOORD_X_OL

 mov dx, KOORD_Y_OL

 mov al,10

 mov ah,0Ch

 mov bh,0

 mov Chetchik,0

metZero1:

 int 10h

 inc cx

 inc Chetchik

 cmp Chetchik,7

 jl metZero1

 mov cx, KOORD_X_OL

 inc dx

 mov Chetchik,0

metZero2:

 int 10h

 inc cx

 inc Chetchik

 cmp Chetchik,7

 jl metZero2

 mov cx, KOORD_X_OL

 mov dx, KOORD_Y_OL

 mov Chetchik,0

 add dx,5

metZero3:

 int 10h

 inc cx

 inc Chetchik

 cmp Chetchik,7

 jl metZero3

 mov cx, KOORD_X_OL

 inc dx

 mov Chetchik,0

metZero4:

 int 10h

 inc cx

 inc Chetchik

 cmp Chetchik,7

 jl metZero4

 mov dx, KOORD_Y_OL

 add dx,2

 mov Chetchik,0

metZero5:

 mov cx, KOORD_X_OL

 int 10h

 inc cx

 int 10h

 add cx,4

 int 10h

 inc cx

 int 10h

 inc Chetchik

 inc dx

 cmp Chetchik, 3

 jl metZero5

 POP DX

 POP CX

 POP BX

 POP AX

 RET

VIVOD_ZERO ENDP

; рисование коричневого квадрата

Black_KV PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov al,6 ; рисование коричневого квадрата

 mov ah,0ch

 mov bh,0

 mov Chetchik,0

 mov dx, KOORD_Y_OL

metBlack1:

 mov cx, KOORD_X_OL

 int 10h ;

 inc cx

 int 10h ;

 inc cx

 int 10h ;

 inc cx

 int 10h ;

 inc cx

 int 10h ;

 inc cx

 int 10h ;

 inc cx

 int 10h ;

 inc dx

 inc Chetchik

 cmp Chetchik,7

 jl metBlack1

 POP DX

 POP CX

 POP BX

 POP AX

 RET

Black_KV ENDP

; Контроль положения фигуры на мониторе

KOORD PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

;  первая величина

 mov ax,0

 mov ax,KOORD_X_OL

 mov Chetchik,0

metXP:

 

 inc Chetchik

 cmp ax,433

 je next1

 cmp Chetchik,5

 je next1

 add ax,8

loop metXP

next1:

 mov XP,ax

; вторая величина

 

mov ax,0

 mov ax,KOORD_X_OL

mov Chetchik,0

metXL:

 inc Chetchik

 cmp ax,41

 je next2

 cmp Chetchik,5

 je next2

 sub ax,8

loop metXL

next2:

 mov XL,ax

; третья величина

 

mov ax,0

 mov ax,KOORD_Y_OL

mov Chetchik,0

metYP:

inc Chetchik

cmp ax,433

je next3

cmp Chetchik,5

je next3

add ax,8

loop metYP

next3:

 mov YP,ax

; четвёртая величина

 

mov ax,0

 mov ax,KOORD_Y_OL

mov Chetchik,0

metYL:

inc Chetchik

cmp ax,41

je next4

cmp Chetchik,5

je next4

sub ax,8

loop metYL

next4:

mov YL,ax

    POP DX

 POP CX

 POP BX

 POP AX

 RET

KOORD ENDP

; проверка вертикали и горизонтали

 

Vertical PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov dx,YL

 mov cx,KOORD_X_OL

 mov ah,0dh

 mov bx,0

 mov Chetchik,0

 ; по вертикали

 

nachVP1: mov al,0

 int 10h

 cmp al,COLOR

 je metGor1

 mov Chetchik,-1

metGor1:

 inc Chetchik

 cmp Chetchik,5

 je END1

 add dx,8

 cmp dx,YP

 jbe nachVP1

 ; по горизонтали

 

 mov dx,0

 mov cx,0

 mov Chetchik,0

 mov cx, XL

 mov dx, KOORD_Y_OL

nachVP2: mov al,0

 int 10h

 cmp al, COLOR

 je metGor2

 mov Chetchik,-1

metGor2:

 inc Chetchik

 cmp Chetchik,5

 je END1

 add cx,8

 cmp cx,XP

 jbe nachVP2

 POP DX

 POP CX

 POP BX

 POP AX

 RET

END1:

mov FLAG,1

 POP DX

 POP CX

 POP BX

 POP AX

RET

Vertical ENDP

; пповерка перой диагонали

 

Nakl PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov ah,0dh

 mov bx,0

 mov Chetchik,0

 mov cx,0

 mov dx,0

 mov cx,XL

 mov dx,YL

 

 add XP,5

 add XL,5

 

nachNakl1: mov al, 0

 int 10h

 cmp al,COLOR

 je metNakl1

 mov Chetchik,-1

metNakl1: inc Chetchik

 cmp Chetchik,5

 

 je END_NAKL

 add cx,9

 add dx,8

 cmp cx,XP

 jg Prov2

 cmp dx,YP

 jg Prov2

 loop nachNakl1

Prov2:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

END_NAKL:

 

 mov FLAG,1

 POP DX

 POP CX

 POP BX

 POP AX

 

RET

Nakl ENDP

; захват зоны первой диагонали

KOORD2 PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov ax,0

 mov bx,0

 mov ax,KOORD_X_OL

 mov bx,KOORD_Y_OL

 mov Chetchik,0

mL:  inc Chetchik

 cmp ax,41

 je M1

 cmp bx,41

 je M1

 cmp Chetchik,5

 je M1

 sub ax,8

 sub bx,8

 loop mL

 

M1:     mov YL,bx

 mov XL,ax

 

 mov Chetchik,0

 mov ax,0

 mov bx,0

 mov ax,KOORD_X_OL

 mov bx,KOORD_Y_OL

mP:     inc Chetchik

 cmp ax,433

 je M2

 cmp bx,433

 je M2

 cmp Chetchik,5

 je M2

 add ax,8

 add bx,8

 loop mP

M2:  mov YP,bx

 mov XP,ax

 

 POP DX

 POP CX

 POP BX

 POP AX

 RET

KOORD2 ENDP

; захват зоны второй диагонали

KOORD3 PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov ax,0

 mov bx,0

 mov ax,KOORD_X_OL

 mov bx,KOORD_Y_OL

 mov Chetchik,0

mLL:    inc Chetchik

 cmp ax,433

 je MM1

 cmp bx,41

 je MM1

 cmp Chetchik,5

 je MM1

 add ax,8

 sub bx,8

 loop mLL

MM1: mov YL,bx

 mov XP,ax

 mov Chetchik,0

 mov ax,0

 mov bx,0

 mov ax,KOORD_X_OL

 mov bx,KOORD_Y_OL

mPP: inc Chetchik

 cmp ax,41

 je MM2

 cmp bx,433

 je MM2

 cmp Chetchik,5

 je MM2

 sub ax,8

 add bx,8

 loop mPP

MM2: mov YP, bx

 mov XL, ax

 POP DX

 POP CX

 POP BX

 POP AX

 RET

KOORD3 ENDP

; проверка второй диагонали

Nakl2 PROC

 PUSH AX

 PUSH BX

 PUSH CX

 PUSH DX

 mov ah,0dh

 mov bx,0

 mov Chetchik,0

 mov cx,0

 mov dx,0

 mov cx,XP

 mov dx,YL

nachNakll2:

 mov al,0

 int 10h

 cmp al,COLOR

 je metNakll1

 mov Chetchik,-1

metNakll1:

 inc Chetchik

 cmp Chetchik,5

 je END_NAKLL

 sub cx,7

 add dx,8

 cmp cx,XL

 jle Provv2

 cmp dx,YP

 jg Provv2

 loop nachNakll2

 

 

Provv2:

 POP DX

 POP CX

 POP BX

 POP AX

 RET

END_NAKLL:

 

 mov FLAG,1

 POP DX

 POP CX

 POP BX

 POP AX

RET

Nakl2 ENDP

CODE ENDS

END MAIN

ПРИЛОЖЕНИЕ B

 СИСТЕМЫ СЧИСЛЕНИЯ

Любое неотрицательное число в позиционной системе счисления (СС) может быть представлено в виде:

                    
D = Cn-1*bn-1 + Cn-2*bn-2 + ... + C1*b1 + C0*b0 + C-1*b-1 + C-2*b-2 +..,      

где D - десятичный эквивалент числа, Ci - значение i-го разряда, b - основание системы счисления,b в степени i - вес i-го разряда и n число разрядов целой части числа. В вычислительной технике ниболее распространены: двоичная (BIN), десятичная (DEC), шестнадцатиричная (HEX) и непозиционная двоично-десятичная (BCD) системы счисления. В BCD системе вес каждого разряда равен степени 10, как в десятичной системе, а каждая цифра i-го разряда кодируется 4-мя двоичными цифрами. Восьмиричная СС (OCT) применяется реже. Первые 16 чисел представлены в таблице 1.

Двоичное число 10010011 = 1 * 2^7 + 1 * 2^4 + 1 * 2^1 + 1 * 2^0 = 147 (DEC). Для перевода числа из двоичной системы в 16 - ную, его необходимо разбить начиная справа на группы по 4 двоичных цифры и каждую группу представить 16 - ной цифрой из таблицы. Для обратного перевода каждая HEX цифра заменяется четверкой двоичных, незначащие нули слева отб- расываются. Двоично-десятичное число можно записывать и десятичными цифрами, например 1997, и двоичными - 0001 1001 1001 0111. Каждое десятичное число можно представить в виде BCD, например 19(DEC) = 19(BCD), но их двоичные представления не равны: 19(DEC) = 10011(BIN), а 19(BCD) = 1 1001(BIN). Не каждая запись из нулей и единиц имеет двоично-десятичный эквивалент. Например, 11001001(BIN)  = ?(BCD) = C9(HEX) = 201(DEC), т.к. десятичной цифры 12 = 1100 не существует!

 

МАШИННОЕ ПРЕДСТАВЛЕНИЕ ИНФОРМАЦИИ

Микропроцессоры обрабатывают упорядоченные двоичные наборы. Минимальной единицей информации является один бит.

     

Далее следуют - тетрада (4 бита), байт ( byte 8 бит), двойное слово (DoubleWord 16 бит) или длинное (LongWord 16 бит) и учетверенное слова. Младший бит обычно занимает крайнюю правую позицию.

 

ЧИСЛА С ФИКСИРОВАННОЙ ТОЧКОЙ

 

Такие числа могут быть как целыми, так и дробными. Точка мысленно фиксируется рядом с любым разрядом. Если она располагается справа от младшего бита, то число целое, если слева от старшего - число дробное. Далее будут рассматриваться только целые числа с фиксированной точкой, для нецелых чисел чаще применяется показательная форма, о которой пойдет речь дальше.

Естественным представлением целого неотрицательного числа является двоичная система счисления. Кодирование отрицательных чисел производится тремя наиболее употребительными способами, в каждом из которых крайний левый бит - знаковый. Отрицательному числу соответствует единичный бит, а положительному - нулевой. Каждый способ оценивается по скорости и затратам на выполнение сложения и изменения знака числа, т.к. вычитание есть сложение с измененным знаком одного операнда.

  •  1.Прямой код. Изменение знака производится просто, путем инверсии бита знака. Пусть 00001001 = 9, тогда 10001001 = -9. Если при сложении двух чисел в этом коде знаки совпадают, то трудностей нет. Если знаки различаются необходимо найти наибольшее число, вычесть из него меньшее, а результату присвоить знак наибольшего слагаемого.
  •  2.Обратный код, инверсный или дополнительный "до 1". Изменение знака производится просто - инверсией всех бит: 00001001 = 9, а 11110110 = -9. Сложение также выполняется просто, т.к. знаковые биты можно складывать. При переносе единицы из левого (старшего) бита, она должна складываться с правым (младшим). Например: 7 + (-5) = 2.

  00000111 = 7

  11111010 =-5 (инверсия 00000101 = 5)

1 00000001

         1

  00000010 = 2

Сложение в обратном коде происходит быстрее, т.к. не требуется принятие решения, как в предыдущем случае. Однако суммирование бита переноса требует дополнительных действий. Другим недостатком этого кода является представление нуля двумя способами, т.к. инверсия 0...00 равна 1. ..11 и сумма двух разных по знаку, но равных по значению чисел дает 1...11.Например: (00001001 = 9) + (11110110 = -9) = 11111111. Кстати, из этого примера понятно почему код называется дополнительным "до 1". Этих недостатков лишен ---

  •  3.Дополнительный или дополнительный "до 2" код. Число с противоположным знаком находится инверсией исходного и добавлением к результату единицы. Например, найти код числа -9.

  00001001 = 9                 11110111 =-9

  11110110 - инверсия          00001000 - инверсия

         1                            1

  11110111 =-9                 00001001 = 9

Проблемы двух нулей нет. +0 = 00000000, -0 = 11111111 + 1 = 00000000 (перенос из старшего бита не учитывается).Сложение производится по обычным для неотрицательных чисел правилам.

  00001001 = 9

  11110111 =-9

1 00000000

Из этого примера видно, что в каждом разряде двух равных по модулю чисел складываются две единицы, что и определило название способа. Этот метод применяется наиболее часто, и когда говорят о дополнительном коде, то имеется в виду дополнительный "до 2-х" код.

 

ДИАПАЗОН ЦЕЛЫХ ЧИСЕЛ С ФИКСИРОВАННОЙ ТОЧКОЙ

 

Беззнаковые числа: 0 <= D <= 2^n - 1. n - число разрядов

  Байт: 0     -   255   (DEC)  Слово: 0     - 65535

        00..0 - 11..1   (BIN)         00..0 - 11..1

        0     -    FF   (HEX)         0     - FFFF

Числа со знаком:-2^(n-1) <= D <= +2^(n-1)-1. n - число

  разрядов.

  Байт: -128  -  +127   (DEC)  Слово: -32768-+32767

        10..0 - 01..1   (BIN)         10..0 - 01..1

        80    -    7F   (HEX)         8000  - 7FFF

 

ЧИСЛА С ПЛАВАЮЩЕЙ ТОЧКОЙ (ВЕЩЕСТВЕННЫЕ)

 

Вещественные числа хранятся и используются в ЭВМ в показательной форме, т.е. в виде двух составляющих: мантиссы и порядка. Различия в способах такого представления чисел заключаются в количестве байтов отводимых под порядок и мантиссу и небольших отличиях в форме их хранения. Например в четырехбайтовом формате под мантиссу отводится 3 байта и один байт для хранения порядка (КВ - короткий вещественный формат).

D = ±M * 2^(E-127)

Последовательность расположения байтов

в различных ЭВМ может быть разной. D - десятичный эквивалент числа  , M - нормализованная мантисса, Е - смещенный порядок, SM - бит знака мантиссы.

 

ДИАПАЗОН ПРЕДСТАВЛЕНИЯ ВЕЩЕСТВЕННЫХ ЧИСЕЛ

 

У нормализованной мантиссы первая значащая цифра (единица) мысленно находится слева от запятой, а справа располагаются 23 разряда - 1,xx..xx. Поэтому Mmax = 1,111..11 = 1 +1/2 +1/4+ 1/8 +...= 2, а Mmin= 1,000..00 = 1 для положительных чисел (SM=0) и -1 и -2 для отрицательных, (SM=1). Порядок числа Emax = 11111110 = 254, а Emin = 00000001 = 1. Теперь нетрудно определить диапазон представления положительных чисел от +Dmax = Mmax * 2^(254-127) = 3,4 * 10^38 до +Dmin = Mmin * 2^(1-127) = 1,17 * 10^(-38). Точность определяется числом достоверных десятичных цифр. При 23 двоичных разрядах мантиссы 2^23 примерно равно 10^7, т.е. достоверными являются только 6-7 значащих десятичных знаков, а не 38. Необходимо отметить, что значения порядка 11111111 и 00000000 по международному стандарту IEEE 754 и 854 предназначены для кодирования денормализованных чисел, отрицательной и положительной бесконечностей, неопределенности и, так называемых Не-чисел.

ДВОИЧНО-ДЕСЯТИЧНЫЙ КОД

 

Двоично-десятичный код (ДДК) или Binary Coded Decimal (BCD) может быть упакованным, когда в одном байте хранятся две десятичные цифры, либо неупакованным - по одной цифре в байте.Упакованное число 1996 представляется в виде двух байтов: 0001 1001 и 1001 0110. Для знака числа отводится дополнительный байт, например в формате (ДД) девять байтов отводится для размещения 18-ти цифр, а в старшем бите десятого байта находится знак числа.

 

ПРИЛОЖЕНИЕ С

СТРУКТУРНАЯ СХЕМА МИКРОПРОЦЕССОРА

Огромное количество микропроцессоров (МП) не позволяет рассмотреть их особенности, поэтому выбор пал на родоначальника семейства 80x86 : МП К1810ВМ86/88 (8086/8088). Такой выбор оправдан, во-первых преобладающим парком ЭВМ с этим МП, во-вторых тем, что все МП этого семейства при включении начинают работу в реальном режиме МП 8086, и в-третьих - программной совместимостью их ассемблеров снизу вверх. На рис 1. приведена структурная схема МП8086 и внешний вид типового микропроцессора.

Устройство управления декодирует байты программы и управляет работой операционного устройства и шинного интерфейса. Операционное устройство МП состоит из 4-х шестнадцатиразрядных регистров общего назначения: РОН (AX,BX,CX,DX), из 4-х регистров указателей (адресных регистров SP,BP,SI, DI) и арифметико-логического устройства (АЛУ) с регистром признаков операций (флагов F).

РОН служат для хранения промежуточных результатов операций, т.е. операндов. Помимо общих, каждый из этих регистров имеет и некоторые специальные функции, о которых будет сказано далее. Каждый РОН может раcсматриваться, как состоящий из двух независимых 8-ми разрядных регистров AH, AL, BH, BL, CH, CL и DH, DL.

Адресные регистры хранят 16-ти битовые указатели (адреса) на области памяти. В SP (StackPointer) находится текущий адрес "вершины стека" - специально организованной области памяти, которая будет описана далее. Регистр BP(Base Pointer) хранит любой базовый адрес в области стека. Два регистра SI и DI (Source и Destination Index) адресуют области памяти, называемые источником и приемником данных.

Шинный интерфейс, на рис.1 его узлы отмечены двойной чертой, выполняет операции обмена между МП и памятью или внешними устройствами. В сегментных регистрах CS,SS,DS,ES хранятся указатели на 64-х килобайтные области памяти называемые сегментами. Значения этих указателей могут перекрываться. Адрес байта в ячейке памяти получается суммированием содержимого одного из сегментных регистров и одного из регистров (SP,SI,DI,IP). Например адрес текущего байта программы, извлекаемого из памяти определяется суммой адресов, хранящихся в регистре кодового сегмента (CS) и указателе команд (IP). В регистре IP хранится 16-битовый адрес байта  в кодовом сегменте к которому микропроцессор дожен обратиться. Подробнее об этом будет сказано далее. Связь с внешними устройствами осуществляется через специальные тристабильные схемы с повышенной нагрузочной способностью и называемые буферами.

Текущий байт программы направляется в очередь команд: шесть однобайтовых регистров расположенных конвейером (по принципу "первым вошел - первым вышел" или FIFO ). Конвейер позволяет одновременно выполнять команду из очереди и загружать следующую, повышая производительность МП. Буферные тристабильные элементы увеличивают мощность сигналов до стандартных значений ТТЛ.

 

РЕГИСТР ФЛАГОВ

 

По результатам операций АЛУ устанавливает либо сбрасывает отдельные биты в регистре флагов F.

x обозначает, что содержимое этого бита не имеет значения. Некоторые операции влияют только на отдельные флаги, а другие совсем на них не воздействуют, поэтому при описании флагов подразумевается выполнение тех команд (операций), которые влияют на эти флаги. В дальнейшем, в тексте, фраза "содержимое XX" будет обозначаться круглыми скобками - (XX).

  •  ZF - флаг/признак нулевого результата (Zero), устанавливается в 1, если получен нулевой результат, иначе (ZF)=0.
  •  CF - флаг переноса (Carry) устанавливается, если в результате выполнения операции из старшего бита переносится или занимается 1 при сложении или вычитании, иначе (CF)=0. На CF влияют также команды сдвига и умножения.
  •  SF - флаг знака результата (Sign) равен единице, если результат отрицательный, т.е. он дублирует старший знаковый бит результата.
  •  PF - флаг четности (Parity). (PF)=1, если сумма по модулю два всех битов результата равна нулю (число единичных битов - четное).
  •  AF - флаг дополнительного переноса (Auxiliary) устанавливается, если есть перенос из старшего бита младшей тетрады (бит D3) в младший бит старшей тетрады (бит D4). Используется в операциях над упакованными BCD числами.
  •  OF - флаг переполнения (Overflow) устанавливается, когда результат операции превысит одно- или двухбайтовый диапазон чисел со ЗНАКОМ, а также в некоторых других случаях. Другое определение: (OF)=1, если перенос/заем в старший бит результата не равен переносу/заему из старшего бита.

Рассмотрим в качестве примера сложение двух однобайтовых чисел: 125 + 4 = 129 выходит за пределы -128.. ..+127 чисел со знаком (для беззнаковых чисел 129 - корректный результат).

  0 1 1 1 1 1 0 1 = +125

  0 0 0 0 0 1 0 0 = +4

  1 0 0 0 0 0 0 1 = +129 > +128 (или -127 ???)

 / / :

0 1  :

Перенос в бит D7 равен 1, а из бита D7 = 0, в результате сложения чисел (OF) = 1, (CF) = 0, (ZF) = 0, (SF) = 1, (PF) = 0, (AF) = 1. Остальные три флага будут рассмотрены далее. Содержимое регистра признаков называется также словом состояния процессора(программы) и обозначается PSW.

 

ОРГАНИЗАЦИЯ ПАМЯТИ И ВЫЧИСЛЕНИЕ АДРЕСА

 

МП 8086 имеет 20-ти разрядную шину адреса ША, позволяющую обращаться к 2^20 или примерно к одному миллиону ячеек памяти. 16-ти битовая шина данных ШД может пересылть информацию байтами или словами. Память обычно организована в виде линейного одномерного массива байтов, причем два соседних байта могут рассматриваться как слово. Все мегабайтное пространство памяти условно делится на 16 сегментов объемом по 64Kb. Микропроцессору доступны в каждый момент четыре - кодовый сегмент, где хранится программа, стековый сегмент, сегмент данных программы и дополнительный сегмент данных. Начальные адреса этих сегментов хранятся в регистрах CS,SS,DS и ES. Так как эти регистры 16-ти битовые, а все адресное пространство 20-ти битовое, то МП начальный сегментный адрес в 20-ти битовом сумматоре сдвигает на четыре бита влево (эквивалентно умножению на 16) и складывает с содержимым одного из регистров (IP,SP,DI,SI).

Полученное число называется физическим адресом. Например, извлекая из памяти очередной байт кода программы МП формирует физический адрес по формуле: Физический адрес = (IP) + (CS) * 16, где (IP) - смещение, эффективный или исполнительный адрес, (CS) - сегментный адрес, а (CS) * 16 - называется начальным сегментным адресом. Организация памяти приведена на рис.2.