Реферат по предмету "Информатика, программирование"


Микропроцессор i8086/i8088

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ
Кафедра информационных систем и измерительных технологий
КУРСОВОЙ ПРОЕКТ
по предмету: Системное программирование
Выполнил: студентка4 курса
специальность200106
Шифр604992/с
Проверил:
Москва 2008

содержание
Введение. 3
1. Структура микропроцессора i8086. 8
2. Разработка программного обеспечения. 17
2.1. Основной алгоритм… 17
2.2. Отладка и тестирование. 19
2.3. Подсчёт контрольного кода четности. 23
2.4. Битовое маскирование. 24
2.5. Подсчет в массиве байтов с четным количеством бит. 26
2.6. Проверка элементов массива на чётность. 27
3. Ввод числовых данных. 29
4. Алгоритм проверки ввода десятичного числа. 31
Приложение. 32
Литература. 57
Введение
Производство интегральныхмикросхем на сегодняшний день — фундамент не только индустрии информационных икомпьютерных технологий, но и многих смежных отраслей — бытовой электроники,медицины, военной промышленности.
Следует различать два основныхнаправления развития производства микросхем. Первое — разработка архитектуры,включающая в себя выбор тех или иных функций и особенностей будущих схем,микросхемотехнику и компоновку на кристалле функциональных блоков и ихэлементов. А также — оптимизация готовых блоков с целью упрощения и удешевленияих массового производства.
Второе направление – этополупроводниковые технологии производства микросхем. Сюда входят научнаяразработка и воплощение в «кремний» всё более быстрых и маленьких транзисторов,цепей связи между ними, создание новых материалов и оборудования для этого, атакже «manufacturability» — область знаний о том, какпроизводить микросхемы более высокого качества, более быстрые, с меньшим числомдефектов.
На сегодняшний день прощеназвать те области, которые пока не зависят от достижений микроэлектроники. Современныйчеловек просто обязан иметь представление о том, что такое микроэлектроника итехнология производства микросхем. Вершиной же этой технологии являютсямикропроцессоры — самые сложные и важные интегральные схемы. [10]
Интегральные микросхемы делаютна поверхности монокристаллического кремния путём последовательного созданияразличных слоёв на тонкой (меньше миллиметра) круглой (диаметром до 30 см) кремниевойпластине, именуемой подложкой. Слои формируются при помощи различных процессовс использованием химических реактивов, газов и света. Более двадцати слоев«витиевато» соединены между собой, дабы сформировать схему микропроцессора стрехмерной структурой. Точное число слоев на подложке (вафле) зависит от дизайн- проекта конкретного процессора.
Процессы формирования различныхслоев и рисунков элементов микросхемы на подложке достаточно хитроумны, однаков их основе лежит одна простая идея: поскольку размеры создаваемого рисунканастолько малы, что осаждать материалы в нужных местах просто невозможно,поступают проще — материал осаждают сразу на всю поверхность подложки, а затемего аккуратно удаляют из тех мест, где он не нужен. Для этого служит процессфотолитографии.
Прежде всего, на подложкесоздается тонкий (обычно тоньше одного /> />
микрона) и сплошной, без дефектов, слой нужного материала.
Рис.1. «Чистая комната»
Далее на нём проводится фотолитография.Для этого сначала на поверхность пластины наносится тонкий слойсветочувствительного материала (фоторезист). Затем пластина с фоторезистомпомещается в прецизионную установку, где нужные участки поверхности облучаютсяультрафиолетом сквозь прозрачные отверстия в фотомаске (фотошаблоне). Маскасодержит соответствующий (наносимый на поверхность) рисунок, которыйразрабатывается для каждого слоя.
Под действием ультрафиолетаоблученные участки фоторезиста меняют свои свойства так, что становится возможнымих селективно удалить. После снятия фоторезиста остаются открытыми областиповерхности пластины, над которыми требуется совершить нужную операцию (убратьслой диэлектрика или металла).
При производстве приходитсясовершать операции фотолитографии до 20-25 раз — каждый раз над новым слоем.
Кристаллы микросхем должныпроизводиться в условиях контролируемого и чистого воздуха. Посколькуфункциональные элементы на микрочипах малы, любая чужеродная частица (пыль,дым, чешуйки кожи), попавшая на пластину на промежуточных стадиях еёпроизводства, способна вывести из строя целый кристалл. Чтобы этого недопустить, для производства используются «чистые комнаты», которыеклассифицируются по размеру и количеству микрочастиц в единице объёма воздуха.
Например, комнаты класса 1,используемые в современном производстве, примерно в тысячу раз чище, чемхирургическая операционная. «Чистая комната» управляет чистотой воздуха путёмфильтрации поступающего воздуха, удалением грязи с установок, ламинарнымперемещением воздуха от потолка к полу (примерно за шесть секунд), регулировкойвлажности и температуры. Люди в «чистых комнатах» ходят в специальныхскафандрах, закрывающих, в том числе, весь волосяной покров. Для устранениявибраций чистые комнаты располагаются на собственном виброзащитном фундаменте.
Иногда применяется взрывнаяфотолитография. Сначала формируется рисунок (вытравливаются окна в фоторезистеили временном слое диэлектрика), затем на поверхность пластины наноситсясплошной слой нового материала (металла), и пластина помещается в реактив,удаляющий остатки фоторезиста или временный диэлектрик. В результате удаляемыйслой как бы «взрывается» изнутри, унося с собой лежащие на нем кускинанесенного последним металла, а в предварительно «открытых» участках металлостался и сформировал нужный нам функциональный рисунок. [10]
Межсоединения — электрическиесоединения между транзисторами в микросхемах создаются при помощи несколькихметаллических слоев, подобно тому, как на сложных печатных платах (материнских платах,видеокартах, модулях памяти) отдельные микросхемы, транзисторы, резисторы иконденсаторы объединяются в законченные схемы. Только здесь это происходит намикромасштабах. В качестве металла для межсоединений в современныхмикропроцессорах, изготавливаемых по 130-нм и 90-нм технологиям выступает медь.Новейшие микропроцессоры насчитывают от семи до десяти слоев межсоединений,причём у разных производителей число слоев может разниться: для 0,13-микронногои 90-нм техпроцессов Intel Pentium 4 имеет семь или восемь слоевсоответственно, а AMD Athlon 64 — девять слоев. /> />
Для уменьшения паразитных связей между слоями металлизации используется уже нетрадиционный диоксид кремния, а специальный материал (low-k) с более низкой диэлектрическойпроницаемостью.
Таким образом, на поверхностикремниевой пластины создается сложная трехмерная структура толщиной в несколькомикрон, которая, собственно, и является электронной схемой. Сверху схемапокрывается толстым (микроны) слоем пассивирующего диэлектрика, защищающего отвнешних воздействий. В нём лишь открываются окна для больших, стороной вдесятки микрон, квадратных металлических контактных площадок, через которые насхему подаются извне питающие напряжения и электрические сигналы. Снизу основоймикросхемы служит кремниевая пластина толщиной в сотни микрон.
После завершения технологическихпроцедур каждый из кристаллов тестируется, а потом пластина разрезается наотдельные кристаллы. Далее каждый чип упаковывается в свой корпус, чтопозволяет подключать его к другим приборам. Все упакованные чипы тестируютсяеще раз и отгружаются заказчику.
1. Структура микропроцессора i8086
Микропроцессор i8086/i8088 принадлежит к 16-разрядным процессорам первого поколения.Большая интегральная схема i8086 с геометрическимиразмерами 5,5x5,5 мм имеет 40 контактов, содержит около 29 000 транзисторов ипотребляет 1,7 Вт от источника питания +5 В, тактовая частота составляет 5; 8или 10 МГц.
Микропроцессор выполняет операциинад 8 — и 16-разрядными данными, представленными в двоичном илидвоично-десятичном виде, может обрабатывать отдельные биты, а также строки илимассивы данных. Он имеет встроенные аппаратные средства умножения и деления.
Микропроцессор имеет внутреннеесверхоперативное запоминающее устройство (СОЗУ) емкостью 14x16 байт. Шинаадреса является 20-разрядной, что позволяет непосредственно адресовать 220 = 1048 576 ячеек памяти (1 Мбайт).
Пространство адресовввода/вывода составляет 64 Кбайт. В БИС i8086 реализованамногоуровневая векторная система прерываний с количеством векторов до 256. Предусмотренатакже организация прямого доступа к памяти, по которому микропроцессорпрекращает работу и переводит шины адреса, данных и управления ввысокоимпедансное состояние.
Среднее время выполнения командызанимает 12 тактов. Особенностью i8086 являетсявозможность частичной реконфигурации аппаратной части для обеспечения работы вдвух режимах — минимальном и максимальном. Режимы работы задаются аппаратно. Вминимальном режиме, используемом для построения однопроцессорных систем,микропроцессор самостоятельно формирует все сигналы управления внутреннимсистемным интерфейсом. В максимальном режиме, используемом для построениямультипроцессорных систем процессор формирует на линиях состояния двоичный код,который зависит от типа цикла шины. В соответствии с этим кодом системныйконтроллер К1810ВГ88 формирует сигналы управления шиной. Контакты, которыеосвободились в результате кодирования информации, используются для управлениямультипроцессорным режимом. При использовании арифметического сопроцессоранеобходимо выбирать максимальный режим. /> />
Структурная схема микропроцессора i8086. В МП i8086 применена конвейерная архитектура, которая позволяетсовмещать во времени циклы исполнения и выборки из памяти кодов последующихкоманд. Это достигается параллельной работой двух сравнительно независимыхустройств — операционного устройства и шинного интерфейса. Структурная схема МПi8086 показана на рис.1.1.
Рис.1.1. Структурная схемамикропроцессора i8086.

Операционное устройствовыполняет команду, а шинный интерфейс осуществляет взаимодействие с внешнейшиной — выставляет адреса, считывает коды команд и операнды, записываетрезультаты вычислений в память или устройства ввода/вывода. [1,58]
Операционное устройство состоитиз РОН, предназначенных для хранения промежуточных результатов вычислений — данныхи адресов; АЛУ с буферными регистрами; регистра флагов; схемы управления исинхронизации, которая дешифрует коды команд и генерирует управляющие сигналыдля всех блоков схемы МП. Шинный интерфейс состоит из шестибайтной регистровойпамяти, которая называется очередью команд, четырех сегментных регистров: CS, DS, ES, SS, указателя команд IP, сумматора, атакже вспомогательных регистров связи и буферных схем шин адреса/данных.
Очередь команд работает попринципу FIFO (First Input — First Output, т.е. «первый пришел — первыйвышел») и сохраняет на выходе порядок поступления команд. Длина очереди — 6 байт.Если операционное устройство занято выполнением команды, шинный интерфейссамостоятельно инициирует опережающую выборку кодов команд из памяти в очередькоманд.
Выборка из памяти очередногокомандного слова осуществляется тогда, когда в очереди обнаруживаются двасвободных байта. Очередь увеличивает быстродействие процессора в случаепоследовательного выполнения команд. При выборке команд переходов, запросов ивозвращений из подпрограмм, обработки запросов прерываний очередь командсбрасывается, и выборка начинается с нового места программной памяти.
Ещё одной задачей шинногоинтерфейса является формирование физического 20-разрядного адреса из двух16-разрядных слов. Первым словом является содержимое одного из сегментныхрегистров CS, SS, DS, ES, а второе слово зависит оттипа адресации операнда или кода команды. Суммирование 16-разрядных словпроисходит со смещением на 4 разряда и осуществляется с помощью сумматора,который входит в состав шинного интерфейса. /> />
Условное графическое изображение микропроцессора приведено на рис.1.2. Назначениеконтактов БИС зависит от режима работы процессора. Восемь контактов имеютдвойное обозначение, причём обозначения в скобках соответствуют максимальномурежиму. В таблице 1.1. приведены назначения контактов, одинаковые для обоихрежимов, в таблице 1.2. — назначение контактов, которые используются только вминимальном режиме, в таблице 1.3. — назначение контактов, которые используютсятолько в максимальном режиме. Буквой z обозначены трехстабильныевыходы, которые переводятся в высокоимпедансное состояние при переходемикропроцессора в режим захвата; в скобках приведены альтернативные обозначенияконтактов, которые встречаются в литературе.
Рис.1.2. Графическое изображениеБИС МП i8086.

Таблица 1.1. Назначениеконтактов МП i8086 для
минимального и максимальногорежимовОбозначение Назначение Тип AD15 — АО Address/data — мультиплексная двунаправленная шина адреса/данных (ADB — Address Data Bus), по которой с разделением во времени передаются адреса и данные. Адреса передаются в первом такте цикла шины и сопровождаются сигналом ALE, а данные — во второй половине цикла шины и сопровождаются сигналом DEN
Вход/ выход
(z) BHE/ST7 Byte High Enable/Status 7 — выходной сигнал разрешения старшего байта/сигнал состояния. В первом такте цикла одновременно с адресной информацией передается сигнал ВНЕ. Активный (L) уровень ВНЕ означает, что по старшей половине AD15 — AD8 шины адреса/данных передаются 8-разрядные данные. Сигнал ВНЕ используется для разрешения доступа к старшему банку памяти или к внешнему устройству с байтовой организацией, подключенному к старшей половине шины данных. В других тактах формируется сигнал состояния ST7 Выход (z) RD Read — выходной сигнал чтения. Указывает на то, что МП выполняет цикл чтения
Выход
(z) READY Ready — входной сигнал готовности, подтверждающий, что ячейка памяти или устройство ввода/вывода, адресуемое в команде, готово к взаимодействию с МП при передаче данных Вход INTR Interrupt Request — входной сигнал запроса (при Н-уровне) маскированного прерывания. Если прерывания разрешены, МП переходит к подпрограмме обработки прерывания, в противном случае игнорирует этот сигнал Вход RESET (CLR) Сигнал аппаратного сброса (при Н-уровце). Переводит МП в начальное состояние, при котором сброшены сегментные регистры (кроме CS, все разряды которого устанавливаются в единичное состояние), указатель команд IP, все флаги, регистры очереди команд и все внутренние триггеры устройства управления. Сигнал RESET не влияет на состояние РОН. Во время действия сигнала RESET все выходы, имеющие три состояния, переводятся в высокоимпедансное состояние; выходы, которые имеют два состояния, становятся пассивными. Минимальная продолжительность сигнала RESET при первом включении МП составляет 50 мкс, а при повторном запуске — четыре Вход Обозначение Назначение Тип TEST Test — входной сигнал проверки. Сигнал используется вместе с командой ожидания WAIT, выполняя которую, МП проверяет уровень сигнала TEST. Если TEST = 0, МП переходит к выполнению следующей после WAIT команды. Если TEST = 1, МП находится в состоянии ожидания, выполняет холостые такты и периодически, с интервалом 5TCLK, проверяет значение сигнала TEST Вход CLK, (CLC) Clock — входные тактовые импульсы, обеспечивающие синхронизацию работы МП Вход MN/MX Minimum/maximum — вход сигнала выбора минимального или максимального режимов. Определяет режим работы МП: при 1 — минимальный, при 0 — максимальный Вход INTA Interrupt Acknowledge — выходной сигнал подтверждения прерывания, определяющий чтение вектора прерывания Выход ALE Address Latch Enable — выходной сигнал разрешения фиксации адреса; выдается в начале каждого цикла шины и используется для записи адреса в регистр-фиксатор Выход DEN (DE) Data Enable — выходной сигнал разрешения данных, который определяет появление данных на шине адреса/данных Выход (z) DT/R (OP /IP) Data Transmit/Receive (Output-Input) — выходной сигнал передачи/приема данных; определяет направление передачи данных по ADB. Предназначен для управления шинными формирователями и действует на протяжении всего цикла шины Выход (z) M/IO
Memory/Input-Output — выходной сигнал признака обращения к памяти (М/Ю = 1) или внешнему устройству
(М/Ю = 0). Используется для распределения адресного пространства памяти и устройств ввода/вывода Выход (z) WR Write — выходной сигнал записи. Указывает на то, что МП выполняет цикл записи в память или внешнее устройство, и сопровождает данные, которые выдаются МП на шину данных Выход (z) HOLD Hold — входной сигнал запроса захвата шин от внешнего устройства или контроллера прямого доступа к памяти Вход HLDA Hold Acknowledge — выходной сигнал подтверждения захвата. Сигнал указывает на то, что МП перевел свои шины адреса/данных, адреса/состояния и управления в z-состояние Выход
Таблица 1.2. Назначениеконтактов МП i8086 в максимальном режиме
ST2 — ST0
(S2 — SO) Выходные сигналы линий состояния. Характеризуют тип выполняемого цикла шины; используются для формирования управляющих сигналов
Выход
(z) RQ/GTO RQ/GT1 (RQ/ЁО) (RQ/БЦ Request/Grant (Request/Enable) — два входных/выходных сигнала запроса/предоставления локальной шины; используются для связи с другими процессорами, в частности, с арифметическим сопроцессором. Линия RQ/GT1 имеет меньший приоритет Вход/ выход LOCK Lock — выходный сигнал блокировки (занятости) шины — сигнал монополизации управления шиной; формируется во время выполнения команды с префиксом LOCK и информирует другие процессоры и устройства о том, что они не должны запрашивать системную шину Выход QS1. QSO Queue Status — два выходных сигнала состояния очереди; идентифицируют состояние внутренней шестибайтной очереди команд и действуют на протяжении такта синхронизации после выполнения операции над очередью. Сигналы QS1, QS0 предназначены для сопроцессора, который контролирует шину адреса/данных, фиксирует момент выборки из памяти программ предназначенной для него команды с префиксом ESC, а после этого следит за очередью команд и определяет момент, когда эта команда должна выполняться Выход
2. Разработка программного обеспечения2.1. Основной алгоритм
Термин «чётность» впрограммировании может иметь двоякий смысл:
— первое; целое число считаетсячётным, если делится на два без остатка;
— второе; значение термина«чётность» используется применительно к флагу чётности (PF– Parity Flag),который предусмотрен в составе регистра флагов процессора i8086.Этот флаг устанавливается в 1, если младший байт результата предыдущей командысодержит чётное число битов, равных 1, и в 0 — нечётное.
Выберем предпочтительный вариантинтерпретации термина «контроль четности». Для этого рассмотрим два алгоритмаконтроля и определим, какой из них окажется более чувствительным к изменениюисходных данных.
Сначала определим общий принципформирования контрольного кода. Очевидно, что использовать общее количествоэлементов массива нецелесообразно, так как тогда можно будет в лучшем случаеобнаружить изменение размера массива, но не изменение отдельных его элементов. Болеетого, в большинстве языков программирования понятие «массив» предполагает наборданных, количество элементов в котором в процессе выполнения программы неизменяется (является константным). Соответственно, изменение размера каквариант изменения массива рассматривать нецелесообразно.
Обработку же отдельных элементовмассива независимо от интерпретации термина «чётность» можно выполнять двумяспособами:
Если размер массива не превышаетёмкости контрольного кода (количеству бит в двоичном представлении числа), токаждому элементу массива можно поставить в соответствие один бит в контрольномкоде. При этом если элемент массива чётный, то соответствующий бит контрольногокода будем устанавливать в 1, в противном случае – в 0. В таком случае если произойдетизменение любого элемента массива таким образом, что изменится чётность этогоэлемента, контрольный код позволит не только обнаружить сам факт измененияинформации, но и однозначно определить изменённый элемент.
Если размер массива превышаетёмкость контрольного кода, то однозначное соответствие между элементами массиваи битами контрольного кода обеспечить невозможно. В таком случае можноподсчитывать количество чётных или, наоборот, нечётных элементов массива. Еслиизменится чётность какого-либо элемента массива, изменится и контрольная сумма,что позволит обнаружить сам факт изменения исходных данных.
Однако такой способ негарантирует защиты от «компенсирующих» ошибок, то есть когда одновременноизменяется два (в общем случае – чётное количество) элементов, причём одинстановится вместо чётного нечётным, а второй – наоборот, вместо нечётногочётным. В такой ситуации контрольная сумма останется неизменной и изменениеданных обнаружено не будет.
Для более надежного контролясохранности данных используют, как правило, более сложные алгоритмы, например, CRC32 – подсчёт циклической контрольной суммы. Можно сделатьвывод — в любом случае необходимо определить наиболее «устойчивую»интерпретацию термина «чётность» на уровне отдельного элемента массива.
Двоичное число является чётным вматематическом смысле, если его самый младший бит равен нулю. Соответственно,изменение любых старших битов элемента массива никак не скажется на егочётности (нечётности).
При использовании механизмаподсчёта битов, аналогичном установке флага чётности, изменение любого битаисходного байта изменит и контрольное число. Естественно, что это также необеспечивает защиты от «компенсирующих» ошибок, когда будет изменена сразу пара(или чётное количество) битов. Тем не менее, очевидно, что вариант подсчётабитов в исходных элементах массива более чувствителен к изменению исходныхданных, чем проверка делимости элементов на два без остатка.
На основании вышеизложенногопримем решение использовать алгоритм подсчёта битов в элементе массива. Расчётже контрольного кода сделаем адаптивным, то есть для массивов, размер которыхне превышает разрядность контрольного кода, используем битовое маскирование, адля массивов большего размера – подсчёт количества «чётных» элементов.
Учитывая потенциальнуювозможность повторного использования, алгоритм вычисления контрольного кодачётности реализуем в виде подпрограммы. 2.2. Отладка и тестирование
Для отладки и тестированияосновной подпрограммы разработаем программу, в которой будет реализованаследующая функциональность:
— формирование контрольногомассив данных и его заполнение с помощью генератора псевдослучайных чисел;
— вычисление контрольного кодачётности и его сохранение с помощью основной подпрограммы;
— вывод на экран значенийэлементов массива и контрольного кода чётности;
— интерактивное изменениекакого-либо элемента исходного массива;
— пересчёт контрольного кодамассива и сравнение с сохраненным ранее.
Тестовая программа будетразработана, как и основная подпрограмма, с использованием языкапрограммирования Ассемблер.
В общем случае тестоваяпрограмма не обязательно должна разрабатываться на том же языкепрограммирования, что и основной алгоритм, – можно было бы использовать любойязык программирования, позволяющий взаимодействовать с Ассемблером. Причём,разные языки программирования обеспечивают необходимое взаимодействие с помощьюразличных механизмов и определяют собственные ограничения. Так, C и C++ поддерживают подключениедвоичных модулей, которые могут быть получены как результат компиляцииассемблерной программы. Turbo Pascal, например, поддерживает ассемблерные вставки на уровнеисходных текстов.
Для разработки тестовойпрограммы потребуется ряд вспомогательных подпрограмм, обеспечивающих, вчастности, вывод на экран текстовых сообщений и числовых значений, вводчисловых данных, генерация случайных чисел. Рассмотрим основные из них:
1. Вывод на экран текстовыхсообщений. Этот алгоритм будет использоваться для вывода пояснительных сообщений,приглашений к вводу данных и прочих.
2. Вывод на экран числовыхзначений — будет использоваться для отображения значений элементов массива иконтрольного кода чётности. Если преобразовать число к строковому виду, то длянепосредственного отображения можно будет использовать алгоритм вывода на экрантекстового сообщения. Таким образом, реализация алгоритма может быть упрощеназа счёт его разбиения на две составляющие:
— преобразовать число кстроковому виду;
— вывести строку на экран.
3. Преобразование числа кстроковому виду.
Наиболее распространенныеварианты представления чисел – десятичное, восьмеричное, шестнадцатеричное идвоичное.
Символы ‘0’…’9’ располагаются втаблице ASCII-кодов последовательно, поэтому простореализуется преобразование чисел в десятичное представление. Также десятичнаяформа отображения чисел является достаточно компактной. С учётом этого примемрешение выводить числа на экран в десятичном виде.
4. Ввод числовых данных. С цельюунификации визуального представления ввод числовых данных также будетосуществляться в десятичном представлении. Целесообразно усилить реализациюалгоритма проверкой введенного значения на превышение задаваемого в видепараметра лимита – это позволит использовать единообразно использоватьразработанную подпрограмму и для ввода номера элемента массива, ограничиввозможное значение размером массива, и для ввода нового значения элементамассива.
5. Генерация случайных чисел
В силу детерминированной природыкомпьютерных программ получить случайную последовательность чисел за счётгенерации невозможно. В программировании используется более точный термин –«псевдослучайная» последовательность. Это означает, что генерируемаяпоследовательность чисел похожа на случайную, однако при повторении внешнихусловий, определяющих работу генератора, выходная последовательность повторится.
В качестве внешнего параметрагенераторов псевдослучайных чисел, как правило, используют значение текущеговремени компьютера в миллисекундах или количество тиков, прошедших с моментазапуска компьютера. Такие внешние параметры хотя теоретически и могут бытьповторены, вероятность их непроизвольного повторения практически равна нулю. Таккак генерация случайных чисел будет использоваться только для автоматическогозаполнения тестового массива, особых требований к его «случайности» можно непредъявлять, что позволит использовать один из простейших генераторов.
Самый часто применяемый типалгоритмов генерации псевдослучайных последовательностей – линейныеконгруэнтные генераторы, описываемые общим рекуррентным соотношением:
Ij+1 = (aIj + c) MOD m
При правильно выбранных числах a и c эта последовательностьвозвращает
все числа от нуля до m–1 псевдослучайным образом и её периодичность сказываетсятолько на последовательностях порядка m. Если число a подобрано очень тщательно, может оказаться, что число c равно нулю. Так, классический стандартный генератор Льюиса,Гудмана и Миллера использует a=16807 (75) при m=231-1, а генераторы Парка и Миллера используют a=48271 и a=69621 (при том же m).
Реализуем последний из описанныхвариантов, используя в качестве начального значения Iтекущее значение тактов таймера, которое хранится в виде двойного слова вобласти данных BIOS по адресу 0040: 006C.
6. Компоновка алгоритмов. Алгоритмы,реализуемые в программе, в интересах лучшей читаемости исходных текстов ивозможности повторного использования оформлены в виде подпрограмм. Передачапараметров в подпрограммы и получение результатов будет осуществляться черезрегистры процессора. Модификация регистров внутри подпрограмм в целяхминимизации неуправляемых побочных эффектов будет сведена к минимуму. Глобальныепеременные будут использоваться по возможности только во вспомогательныхалгоритмах.
С учётом сформулированных ранеепроектных решений, касающихся формирования контрольного числа, очевидно, чточем больше разрядность контрольного кода, тем большей ёмкости массивы могутбыть обработаны более точным и информативным методом – методом битовогомаскирования.
С учётом же того, что внастоящее время наиболее распространены персональные компьютеры с 32-разряднойархитектурой, целесообразно ограничить ёмкость контрольного числа 32-мя битами.
Вопрос типа элементов вобрабатываемых массивах не является существенным, так как в контексте языкапрограммирования Ассемблер речь может идти только о байтовых массивах, омассивах машинных слов (16 разрядов) и двойных слов (32 разряда). Если принятьво внимание, что в любом случае под массив отводится непрерывная областьпамяти, то массив машинных слов можно рассматривать как байтовый массивдвойного размера, а массив двойных слов – как байтовый массив учетверенногоразмера. Таким образом, будем обрабатывать только байтовые массивы. 2.3. Подсчёт контрольного кода четности
Для вычисления контрольного кодачётности будем использовать подсчёт битов в исходных элементах массива. Сучётом ёмкости контрольного числа в 32 бита для массивов, размер которых неболее 32 байта, используем битовое маскирование результирующего кода, а длямассивов большего размера – подсчёт байтов, количество битов в которых чётно.
Блок-схема алгоритма имеет вид:
/>
Из блок-схемы видно, чтоалгоритм подсчета контрольного кода четности использует два вложенных алгоритма:битового маскирования результата и подсчета количества байтов с четнымколичеством бит.
2.4. Битовое маскирование
Традиционно массивы вграфическом виде представляются в виде последовательности элементов, упорядоченныхслева направо, а двоичные числа – справа налево:
/>
Такое представление затрудняетпонимание общей природы массивов и двоичных чисел. Достаточно упорядочитьэлементы массива и биты двоичного числа в одном направлении и, возможно, ввестинумерацию элементов массива с 0, чтобы увидеть, что по сути двоичное число –это обычный массив, элементами которого являются биты:
/>
С учётом этого факта несложнопостроить алгоритм формирования контрольного числа, в котором последовательнобудут проверяться элементы массива и в зависимости от результата проверкисоответствующие биты контрольного числа будут устанавливаться в 1 или 0. Текстовоеописание такого алгоритма:
1. Обнулить контрольное число
2. Установить указатель напоследний элемент массива
3. Проверить на четностьочередной элемент массива
4. Если чётный, установить флагпереноса в 1. Иначе установить в 0.
5. Выполнить битовый сдвигконтрольного числа с учётом флага переноса на 1 разряд в сторону старшихразрядов.
6. Если все элементы массиваобработаны, закончить.
7. Иначе перейти к предыдущемуэлементу массива и продолжить с пункта 3
Графическое представление алгоритмав виде блок-схемы:
/>
2.5. Подсчет в массиве байтов с четным количествомбит
Подсчёт количества байтов счётным количеством бит реализовать достаточно просто:
Обнулить результат
Установить указатель на первыйэлемент массива
Проверить на чётность очереднойэлемент массива
Если чётный, добавить крезультату 1
Если все элементы массиваобработаны, закончить
Иначе перейти к предыдущемуэлементу массива и продолжить с пункта 3
/>

Графическое представлениеалгоритма в виде блок-схемы:
2.6. Проверка элементов массива на чётность
Для проверки отдельных байтовмассива на чётность удобно использовать команду test,которая вычисляет результат действия побитового логического «И» над приёмникоми источником и устанавливает флаги SF, ZF и PF в соответствии с результатом,при этом результат не сохраняется. Если после выполнения команды test флаг PF будет установлен в 1,количество бит в байте чётно.
1. Вывод на экран текстовыхсообщений
Наиболее простое решение –использовать для вывода текста функцию 9h DOS (прерывание INT21h), которая получает адрес строки для вывода через регистр dx, причем строка должна завершаться символом $.
2. Преобразование числа кстроковому виду
В качестве основы используемреализацию алгоритма преобразования числа
в десятичное представление. [4,201]
Суть используемого алгоритмазаключается в выполнении следующих действий:
Разделить исходное число на 10.
Добавить к остатку ASCII-код нуля.
Записать полученную цифру в стек.
Увеличить счётчик цифр.
Если ещё есть что делить,продолжить с п.1
По количеству цифр: извлечьцифру из стека и дописать в конец результирующей строки.
Дописать в конец результирующейстроки символ $.
Базовый алгоритм рассчитан наработу с 16-разрядными числами. Так как в разрабатываемой программе кодчётности будет представлен в виде 32-разрядного числа, модифицируем исходныйалгоритм для работы с двойными словами. Такая модификация выполняетсядостаточно просто заменой в исходном коде наименований регистров: ax на eax, bxна ebx, dx на edx.
3. Ввод числовых данных
С учётом того, чторазрабатываемая программа является тестовой и не требует специфическогоуправления клавиатурой, ввод с клавиатуры запрограммируем с помощью функций DOS.
Соответственно, алгоритм вводачисла в виде текстового описания будет выглядеть следующим образом:
Подготовить буфер ввода данных
Вызвать функцию DOS 0Ah для ввода с клавиатуры
Проверить количество введенныхсимволов. Если = 0, ошибка
Выполнить проверку вводадесятичного числа
/>

В целях обеспечения возможностиповторного использования, а также для более простого понимания алгоритма в нёмвыделен отдельный подалгоритм проверки ввода десятичного числа.
4. Алгоритм проверки ввода десятичного числа
Алгоритм проверки вводадесятичного числа можно представить в виде текстового описания:
1) Проверить количество символов.Если больше 5, ошибка
2) Обнулить результат
3) Читать символ из буфера ввода
4) Если код символа меньше «0»или больше «9», ошибка
5) Получить промежуточныйрезультат вычитанием кода символа «0»
6) Умножить на 10 результат
7) Если в ходе умножения полученопереполнение, ошибка
8) Прибавить к результатупромежуточный результат
9) Если обработаны не всесимволы, перейти к следующему символу. Переход к п.3
10) Если обработаны все символы,вернуть результат
Приложение
ПРИЛОЖЕНИЕ 1. ЛИСТИНГ ПРОГРАММЫНА ЯЗЫКЕ ASSEBLER
. model small; модель памяти
. stack 100h; сегмент стека
. data; сегмент данных
MAXDIGITSequ16; максимальноеколичество символов
; для ввода целого числа
BUFFERSIZEequMAXDIGITS + 2 + 1; объембуфера ввода
bufferdbBUFFERSIZE dup(?); буфер ввода
ARRAYSIZEequ4; количествоэлементов массива / 4
dataArraydb4*ARRAYSIZE dup(?); массив данных
changeValueNodb?; номерэлемента массива для изменения
changeValuedb?; новое значениеэлемента массива
parityCodedd?; код четности
; переменные для работыгенератора случайных чисел
rand_add69621
rand_mdd7FFFFFFFh
seeddd-1
;
; Сообщения для вывода на экран
;
welcomeMsgdb«Welcometo array parity checker. », 0Dh, 0Ah
db0Dh, 0Ah
db«Thisprogram generates array with random values and calculates its parity code. »,0Dh, 0Ah
db«Thenyou can change any array value and program will check parity code. », 0Dh,0Ah
db«Enjoy! »,0Dh, 0Ah
db0Dh, 0Ah
db0Dh, 0Ah,"$"
errorMsgdb«Paritycheck error. », 0Dh, 0Ah, "$"
okMsgdb«Paritycheck ok. », 0Dh, 0Ah, "$"
dataMsgdb«Arraydata: $»
codeMsgdb«Paritycode: $»
numberMsgdb«Enterarray item number to change (0. .15): $»
valueMsgdb«Enternew value (0. .255): $»
uncorrectMsgdb«Incorrectnumber. $»
writelndb0Dh,0Ah, "$"
byeMsgdb«Bye!», 0Dh, 0Ah, "$"
itemSeparatordb" $"
. code; сегмент кода
.386; программа для процессора80386
; — ----------------------------------------------------------------------------------------
; Главная программа
; — ---------------------------------------------------------------------------------------
start: movax, @data
movds, ax; настройка регистров
moves, ax;
andsp, not 3; выравниваниеграницы стека
; во избежание ошибки доступа кпамяти
movax, 0003h; видеорежим 3,очистка экрана и установка курсора
int10h
movdx, offset welcomeMsg; вывестиприветствие
callshowString
callfillArray; заполнить массивслучайными данными
movcx, ARRAYSIZE * 4; рассчитатьконтрольное число
; и записать в parityCode
movsi, offsetdataArray
movdi, offsetparityCode
callsaveParityCode
callshowArray; вывестизначения элементов массива
moveax,parityCode
callshowParityCode
callinputValueNo;запросить у пользователя номер
; элемента массива для изменения
callinputValue; запросить упользователя новое значение
; элемента массива
callchangeItem; изменитьзначение элемента массива
callshowArray; вывести значенияэлементов массива
callgetParityCode; рассчитатьконтрольное число
callshowParityCode
cmpparityCode,eax
jeparityCode_notChanged
parityCode_Changed:
movdx, offset errorMsg; сообщениеоб изменении кода четности
callshowString
jmpmain_exit
parityCode_notChanged:
movdx, offset okMsg; сообщение онеизменности кода четности
callshowString
main_exit:
callwriteLine; переводстроки
callwriteLine; переводстроки
movdx, offsetbyeMsg; до свидания
callshowString
callwriteLine;перевод строки
movax, 4c00h; завершениевыполнения программы
int21h
; — ---------------------------------------------------------------------------------------
;
; Заполнить массив случайнымиданными.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] dataArray- массив данных для заполнения
; [in] ARRAYSIZE- размер массива
;
; — ---------------------------------------------------------------------------------------
fillArrayproc
pusheax
pushcx
pushedi
movedi, offsetdataArray; указатель на массив данных
movcx,ARRAYSIZE; размер массива
fillArray_loop:
callrand; генерировать случайноечисло в eax
cld; направление записи — вперед
stosd; записать в очереднойэлемент массива
loopfillArray_loop
popedi
popcx
popeax
ret
fillArrayendp
; — ----------------------------------------------------------------------------------------
; Генерация случайного числа.
;
; Параметры: нет
;
; Возвращаемое значение:
; eax — случайное положительное32-битное число (от 0 до 2^31 — 2)
;
; Модификация регистров:
; eax
;
; Глобальные переменные:
; [in] rand_a –коэффициент a
; [in] rand_m –коэффициент m
; [ref] seed– последнее случайное число
;
; Примечание:
; Используется алгоритм,описанный в [Зубков С.В.] на стр.238.
; Линейный конгруэнтныйгенератор описывается формулой:
;
; I [j + 1] =(a * I [j] + c) mod m
;
; При правильно выбранных числахa и c эта последовательность возвращает
; все числа от нуля до m — 1псевдослучайным образом и ее периодичность
; сказывается только напоследовательностях порядка m.
; Классический стандартныйгенератор Льюиса, Гудмана и Миллера
; использует a = 16807 (7^5) приm = 2^31 — 1.
; Генераторы Парка и Миллераиспользуют a = 48271 и a = 69621
; при том же m.
; Используем последний вариант.
; Значения a и m задаются вглобальных переменных rand_a и rand_m.
; — ---------------------------------------------------------------------------------------
randproc
pushedx
moveax, dword ptr seed; считатьпоследнее случайное число
testeax, eax; проверить его
jsfetch_seed; если не — 1,функция еще ни разу не вызывалась
; и надо создать начальноезначение
randomize:
muldword ptr rand_a; умножить начисло a
divdword ptr rand_m; взятьостаток от деления на 2^31 — 1
moveax, edx
movdword ptr seed, eax; сохранитьдля следующих вызовов
popedx
ret
fetch_seed:
pushds
push0040h
popds
moveax, dword ptr ds: 006Ch; считатьдвойное слово из области данных BIOS
; по адресу 0040: 006C — текущеечисло тактов таймера
popds
jmpshort randomize
randendp
; — ----------------------------------------------------------------------------------------
; Рассчитать контрольное число элементовмассива и сохранить в переменной.
;
; Параметры:
; cx — размер массива
; ds: si — указатель на началомассива
; es: di — указатель напеременную-получатель
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
; — -----------------------------------------------------------------------------------------
saveParityCodeproc
pusheax
callgetParityCode; рассчитатьконтрольное число
mov [di], eax; сохранитьрезультат
popeax
ret
saveParityCodeendp
; — ----------------------------------------------------------------------------------------
; Рассчитать контрольное числочетности элементов массива.
; Если размер массива больше 32байт, контрольное число
; рассчитывается методомсуммирования — см. getParitySum
; Если размер массива не более32 байт, контрольное число
; рассчитывается методом битовыхмасок — см. getParityBits
;
; Параметры:
; cx — размер массива
; ds: si — указатель на началомассива
;
; Возвращаемое значение:
; eax — 32-битное контрольноечисло
;
; Модификация регистров:
; eax
; — ----------------------------------------------------------------------------------------
getParityCodeproc
cmpcx, 32
jagetParityCode_sum
callgetParityBits
ret
getParityCode_sum:
callgetParitySum
ret
getParityCodeendp
; — -----------------------------------------------------------------------------------------
; Рассчитать контрольное числочетности элементов массива методом битовых масок.
; Используется для массивовразмером не более 32 байт.
; Для каждого байта определяетсяколичество битов. Если оно четное, соответствующий
; бит контрольного числаустанавливается в 1, если нечетное — в 0.
; Нулевому байту массивасоответствует нулевой бит контрольного числа и т.д.
;
; Параметры:
; cx — размер массива
; ds: si — указатель на началомассива
;
; Возвращаемое значение:
; eax — 32-битное контрольноечисло
;
; Модификация регистров:
; eax
; — ----------------------------------------------------------------------------------------
getParityBitsproc
pushebx
pushcx
pushsi
xorebx, ebx; обнулить результат
std; направление чтения — назад
addsi, cx; установить указательна последний элемент массива
decsi
getParityBits_loop:
lodsb; прочитать байт данных вal
testal, al; проверить четность
jpgetParityBits_parity; есличетность, перейти к установке флага cf
clc; сброс флага cf
jmpshort getParityBits_shift; перейтик формированию результата
getParityBits_parity:
stc; установитьфлаг cf
getParityBits_shift:
rclebx,1; сдвиг влево на 1 бит с учетом флага cf
loopgetParityBits_loop
moveax, ebx; записать результат в eax
popsi
popcx
popebx
ret
getParityBitsendp
; — -----------------------------------------------------------------------------------------
; Рассчитать контрольное числочетности элементов массива суммированием.
; Используется для массивовразмером более 32 байт.
; Для каждого байта определяетсяколичество битов. Если оно четное,
; контрольное число увеличиваемна 1.
;
; Параметры:
; cx — размер массива
; ds: si — указатель на началомассива
;
; Возвращаемое значение:
; eax — 32-битное контрольноечисло
;
; Модификация регистров:
; eax
;
; — ----------------------------------------------------------------------------------------
getParitySumproc
pushebx
pushcx
pushsi
xorebx, ebx; обнулить результат
cld; направление чтения — вперед
getParitySum_loop:
lodsb; прочитать байт данных вal
testal, al; проверить четность
jnpgetParitySum_next; если нечетность, продолжить
incebx; увеличить результат на 1
getParitySum_next:
loopgetParitySum_loop
moveax, ebx; записать результатв eax
popsi
popcx
popebx
ret
getParitySumendp
; — -----------------------------------------------------------------------------------------
; Вывод на экран элементовмассива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] dataMsg – сообщение
; [in] dataArray – массив данных
; [ref] buffer– буфер преобразования числа в строку
; [in] itemSeparator– разделитель элементов массива
; [in] ARRAYSIZE- размер массива
; — ----------------------------------------------------------------------------------------
showArrayproc
pusheax
pushcx
pushdx
pushsi
pushdi
movdx, offsetdataMsg; сообщение
callshowString
xoreax, eax; обнулитьаккумулятор
movsi, offset dataArray;читать данные из массива данных
movdi, offset buffer
movcx, ARRAYSIZE * 4; размер массива, байт
showArray_loop:
cld; направление чтения — вперед
lodsb; прочитать байт данных вal
callint2dec; преобразовать встроку
movdx, offset buffer
callshowString;вывести на экран
movdx, offsetitemSeparator
callshowString;вывести пробел
loopshowArray_loop
callwriteLine; переводстроки
popdi
popsi
popdx
popcx
popeax
ret
showArrayendp
; — ---------------------------------------------------------------------------------------
; Вывод на экран контрольногокода четности.
;
; Параметры:
; eax — контрольное число
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] codeMsg – сообщение
; [ref] buffer– буфер преобразования числа в строку
; — -----------------------------------------------------------------------------------------
showParityCodeproc
pushdx
pushdi
movdx, offset codeMsg;сообщение
callshowString
movdi, offsetbuffer
callint2dec; преобразоватьв строку
movdx, di
callshowString;вывести на экран
callwriteLine; переводстроки
popdi
popdx
ret
showParityCodeendp
; — ----------------------------------------------------------------------------------------
; Запросить у пользователя номерэлемента массива для изменения.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] ARRAYSIZE- размер массива
; [in] numberMsg – запрос наввод номера элемента массива
; [in] uncorrectMsg – сообщениеоб ошибке
; [out] changeValueNo– результат ввода
; — ----------------------------------------------------------------------------------------
inputValueNoproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, ARRAYSIZE * 4 — 1; максимальнодопустимое значение
movcl, 2; максимально допустимоеколичество символов
movdx, offset numberMsg; запросна ввод номера элемента массива
movsi, offset uncorrectMsg; сообщениеоб ошибке
movdi, offset changeValueNo; запомнитьрезультат ввода в changeValueNo
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueNoendp
; — -----------------------------------------------------------------------------------------
; Запросить у пользователя новоезначение элемента массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] valueMsg- запрос на ввод нового значения элемента массива
; [in] uncorrectMsg – сообщениеоб ошибке
; [out] changeValue– результат ввода
; — -----------------------------------------------------------------------------------------
inputValueproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, 255; максимальнодопустимое значение
movcl, 3; максимально допустимоеколичество символов
movdx, offset valueMsg; запросна ввод нового значения элемента массива
movsi, offset uncorrectMsg; сообщениеоб ошибке
movdi, offset changeValue; запомнитьрезультат ввода в changeValue
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueendp
; — -----------------------------------------------------------------------------------------
; Изменить значение элементамассива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] dataArray– массив данных
; [in] changeValueNo– номер элемента массива для изменения
; [in] changeValue– новое значение элемента массива
; — -----------------------------------------------------------------------------------------
changeItemproc
pushax
pushbx
pushsi
movbx, offsetdataArray
xorax, ax
moval,changeValueNo
movsi, ax
moval, changeValue
mov [bx + si], al
popsi
popbx
popax
ret
changeItemendp
; — ----------------------------------------------------------------------------------------
; Запрос у пользователя числа.
; Вводятся беззнаковые целыечисла в диапазоне 0. .65535.
;
; Параметры:
; bx — максимально допустимоезначение
; cl — максимально допустимоеколичество символов
; dx — указатель настроку-приглашение для ввода
; si — указатель на сообщение обошибке
; di — указатель на байтовуюпеременную-получатель
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] buffer– буфер преобразования строки в число
; — -----------------------------------------------------------------------------------------
inputNumberproc
pushax
pushdi
inputNumber_input:
callshowString;вывод строки-приглашения для ввода
movdi, offset buffer; указательна буфер ввода
calldo_inputNumber
callwriteLine;перевод строки
jncinputNumber_exit; если нетошибки ввода, выход
inputNumber_error:
pushdx
movdx, si; сообщение об ошибке
callshowString
popdx
jmpshortinputNumber_input
inputNumber_exit:
popdi
mov [di], al; запомнитьрезультат ввода в переменной-получателе
popax
ret
inputNumberendp
; — -----------------------------------------------------------------------------------------
; Ввод числа.
; Вводятся беззнаковые целыечисла в диапазоне 0. .65535.
;
; Параметры:
; bx — максимально допустимоезначение
; cl — максимально допустимоеколичество символов
; es: di — указатель на буферввода
; первый байт буферарезервируется для записи максимально допустимого количества символов
; второй байт буферарезервируется для записи количества реально введенных символов
;
; Возвращаемое значение:
; ax — результат ввода
; ch — количество введенныхсимволов
; cf —
; = 0 в случае успешногопреобразования
; = 1 в случае ошибкипреобразования
;
; Модификация регистров:
; ax, cx, flags. cf
; — -----------------------------------------------------------------------------------------
do_inputNumberproc
pushdx
pushsi
andcx, 0Fh; обнуление ch (длинывведенной строки)
clc; сброс флага ошибки
inccl
mov [di], cl; максимальноеколичество символов для ввода
deccl
movdx, di; настройка указателяна начало буфера ввода
movah, 0Ah; ввод с клавиатуры
int21h
movch, [di + 1]; количествовведенных символов
cmpch, 0;если = 0, ошибка
jedo_inputNumber_error1
movsi, di; подготовим указательна первый введенный символ
incsi; для последующегопреобразования строки в число
incsi
pushcx; преобразованиедесятичного числа
movcl, ch
andcx, 0Fh
calldec2int
popcx
jcdo_inputNumber_error1; если ошибкапреобразования, выход с ошибкой
cmpbx, ax
jcdo_inputNumber_error2; если превышениелимита, выход с ошибкой
; без очистки результата
jmpdo_inputNumber_exit; если непревышает лимит, выход без ошибки
do_inputNumber_error1:; ошибкапреобразования
xorax, ax; обнулить результат
do_inputNumber_error2:; ошибкапреобразования
stc; установить флаг ошибки
do_inputNumber_exit:
popsi
popdx
ret
do_inputNumberendp
; — -----------------------------------------------------------------------------------------
; Вывод строки на экран.
;
; Параметры:
; dx — адрес строки для вывода,строка должна заканчиваться символом $
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
; — ----------------------------------------------------------------------------------------
showStringproc
pushax
movah, 9h; вызов функции DOS
int21h
popax
ret
showStringendp
; — -----------------------------------------------------------------------------------------
; Переводстроки.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] writeln– коды перевода строки
; — -----------------------------------------------------------------------------------------
writeLineproc
pushdx
movdx, offset writeln; выводсимволов перевода строки
callshowString
popdx
ret
writeLineendp
; — -----------------------------------------------------------------------------------------
; Преобразование строки,содержащей десятичные символы, в число.
; Строка должна содержатьстроковое представление целого числа в диапазоне 0. .65535.
;
; Параметры:
; ds: si — указатель на первыйобрабатываемый символ исходной строки
; cx — количество символов(беззнаковое число)
;
; Возвращаемое значение:
; ax — результат преобразования
; cf —
; = 0 в случае успешногопреобразования
; = 1 в случае ошибкипреобразования
;
; Модификация регистров:
; ax, flags. cf
; — -----------------------------------------------------------------------------------------
dec2intproc
pushbx
pushcx
pushdx
pushsi
cmpcx, 0; проверка: количествосимволов 1. .5
jedec2int_error
cmpcx, 5
jadec2int_error
xorax, ax; обнуление результата
xorbx, bx; обнулениерегистра-приемника
clc; сброс флага ошибки
dec2int_loop:; цикл обработкисимволов исходной строки
movbl, byte ptr [si]; читатьочередной символ
cmpbl, '0'; если меньше 0,ошибка
jbdec2int_error
cmpbl, '9'; если больше 9,ошибка
jadec2int_error
subbl,'0'; вычесть код символа 0
movdx, ax; умножение на 10содержимого ax:
shlax, 1; ax =2x
jcdec2int_error
shlax, 1; ax =4x
jcdec2int_error
addax, dx; ax =4x + x = 5x
jcdec2int_error
shlax, 1; ax =10x
jcdec2int_error
addax, bx; добавитьпромежуточный результат преобразования
jcdec2int_error
incsi; перейти к следующемусимволу
loopdec2int_loop
jmpdec2int_exit
dec2int_error:; ошибкапреобразования
xorax, ax; обнулить результат
stc; установить флаг ошибки
dec2int_exit:
popsi
popdx
popcx
popbx
ret
dec2intendp
; — ----------------------------------------------------------------------------------------
; Преобразование числа вдесятичное строковое представление.
; Полученная строка завершаетсясимволом $.
;
; Параметры:
; eax — исходное число
; es: di — указатель на первыйсимвол буфера для выходной строки
;
; Возвращаемое значение:
; выходная строка
;
; Модификация регистров: нет
; — ----------------------------------------------------------------------------------------
int2decproc
pusheax
pushebx
pushcx
pushedx
pushdi
xorebx, ebx
movbl,10; множитель
xorcx, cx; обнуление счетчикасимволов
int2dec_loop:; начало циклапреобразования
xoredx, edx; обнулениепромежуточного результата преобразования
divebx; деление ax на 10, в dl — остаток от деления
adddl, '0'; перевод в ASCII
pushdx; сохранение результата встеке
inccx; увеличить счетчиксимволов
testeax, eax; проверить ax на 0
jnzint2dec_loop; если что-тоосталось,
; продолжить цикл преобразования
cld; направление обработки строк- вперед
int2dec_store:; циклформирования конечного результата
popax; восстановить цифру изстека
stosb; записать в результат
loopint2dec_store; проверкаокончания цикла
movbyte ptr [di], '$'; добавитьсимвол завершения строки
popdi
popedx
popcx
popebx
popeax
ret
int2decendp
; — — - end start; конец программы
; — ---------------------------------------------------------------------------------------
Литература
1. Бойко В.И. и др. Схемотехника электронных систем. Микропроцессорыи микроконтроллеры. – СПб.: БХВ-Петербург, 2004…
2. Гутников В.С. Интегральная электроника в измерительныхустройствах.2-е изд., перераб. и доп. – Л.: Энергоатомиздат. Ленигр. отд-ние,1988.
3. Джордейн Р. Справочник программиста персональныхкомпьютеров типа IBM PC, XT и AT. –М.: Финансы и статистика, 1992
4. Зубков С.В. Assembler для DOS, Windows и UNIX.– М.: ДМК Пресс, 2000.
5. Кулаков В. Программирование на аппаратном уровне. Специальныйсправочник. – СПб: Питер, 2001.
6. Мячев А.А., Степанов В.Н. Персональные ЭВМ и микроЭВМ. Основыорганизации: Справочник / Под ред.А. А. Мячева. – М.: Радио и связь, 1991.
7. Использование Turbo Assembler при разработке программ. –Киев: «Диалектика», 1994
8. Фролов А.В., Фролов Г.В. Операционная система MS DOS. – М.:«Диалог-МИФИ», 1992
9. Юров В.И. Assembler. – СПб: Питер,2000
10. http: // www. gelezo. com


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

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

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.