Text
                    Л. Дао
ПРОГРАММИРОВАНИЕ
МИКРОПРОЦЕССОРА
8088
Издательство «Мир»

Программирование микропроцессора 8088
MASTERING The 8088 MICROPROCESSOR ВУ LANNY V. DAO TAB BOOKS Inc. Blue Ridge Summit 1984
Л. Дао ПРОГРАММИРОВАНИЕ МИКРОПРОЦЕССОРА 8088 Перевод с английского М. Б. БЕЛЯЕВА под редакцией канд. техн, наук М. М. ГЕЛЬМАНА Москва «Мир» 1988
ББК 32.973-01 Д19 УДК 681.3 Дао Л. Д19 Программирование микропроцессора 8088: Пер. с англ. — М.: Мир, 1988.— 357 с., ил. ISBN 5-03-000232-4 Книга американского автора является простым и доступным для широкого круга пользователей пособием по программирова- нию на языке ассемблера микропроцессора 8088. В качестве при- меров приводятся 20 программ, реализующих алгоритмы типовых задач сбора и обработки данных. Описывается архитектура микро- процессора с использованием 32-разрядных регистров, позволяю- щих создавать микро-ЭВМ больших вычислительных возможностей^ Для программистов и специалистов, использующих вычисли- тельную технику и желающих ознакомиться с программированием микро-ЭВМ. 2405000000-299 Д 04!(01)-88 189-88, ч. 1 ББК 32.973-01 Редакция литературы по информатике и робототехнике ISBN 5-03-000232-4 (СССР) ISBN 0-8306-0888-5 (США) © 1984 by TAB BOOKS Inc. © перевод на русский язык, «Мир», 1988
ПРЕДИСЛОВИЕ К РУССКОМУ ИЗДАНИЮ Персональные ЭВМ оказались первыми программно- управляемыми вычислительными средствами, доступ- ными широкому кругу пользователей. Это позволило последним приступить к активной формализации зна- ний с целью автоматизации рутинной части интеллек- туальной деятельности. Появление персональных ЭВМ, положивших начало эре «компьютерной» гра- мотности, по значимости для развития человечества можно сравнить с изобретением книгопечатания. Чтобы «общаться» с машиной, необходимо знать ее входной язык и иметь возможность прямого досту- па к вычислительным ресурсам для обработки данных по формализованным алгоритмам. До недавнего вре- мени формализация алгоритмов и разработка соответ- ствующих программ оставались прерогативой профес- сиональных программистов. Однако в связи с быстрым ростом числа ЭВМ и областей их проблемной ориен- тации остро встала проблема подготовки нужного чис- ла программистов. Кроме того, решение ряда задач, например в биотехнологии, сегодня возможно только на основе неформализованных знаний специалистов, что требует их личного участия в процессе формали- зации алгоритмов. При этом за программистами оста- ются функции системного сопровождения разработки программ пользователем и создание базового про- граммного обеспечения комплекса. Пользователь со- ставляет программы на одном из языков высокого уровня. Когда его потребности выходят за пределы возможностей освоенной версии языка, программист разрабатывает новые процедуры этого языка, расши- ряющие его функциональные возможности. По мере развития описанного процесса частота контактов 5
пользователь — программист снижается. При этом удобным инструментом является язык ассемблера, по- скольку он дает возможность непосредственного до- ступа ко всем средствам ЭВМ. Это обеспечивает так- же большую эффективность имитационного модели- рования различных систем и процессов благодаря возможности их адекватного программного представ- ления на уровнях вплоть до элементарных операций и функций. Именно с учетом перечисленных факторов следует оценивать полезность предлагаемой книги. По суще- ству она представляет собой введение в практику программирования персональных ЭВМ фирмы IBM, центральным процессором которых является микропро- цессор 8088. Близким к нему по составу команд и ор- ганизации программирования является отечественный микропроцессор К1810. Книга представляет несомнен- ный интерес для специалистов, занимающихся разра- боткой проблемно-ориентированных программ обра- ботки данных путем расширения версий используемых языков высокого уровня, а также использующих пер- сональные ЭВМ для имитационного моделирования. М. Гельман
ПРЕДИСЛОВИЕ Прошло более десяти лет с тех пор, как микропроцес- соры (МП) появились на рынке по доступным ценам, однако лишь совсем недавно они достигли производи- тельности, достаточной для построения на их основе недорогих микрокомпьютеров, сравнимых по своим характеристикам с традиционными мини-ЭВМ. Благо- даря бурному развитию технологии производства сверхбольших интегральных схем (СБИС) стало воз- можным создание более эффективных и производи- тельных микропроцессоров. Сегодня МП применяют в административной, ком- мерческой, юридической областях, медицине, в ма- шинном проектировании, промышленном производстве и др. СБИС Intel 8088 и ее 16-разрядное семейство, включающее микропроцессоры 8086, 80186 и 80286, представляют собой новое поколение современных средств обработки данных, наиболее полно отражаю- щих преимущества технологии СБИС по такому пока- зателю, как отношение стоимость/производительность. Цель этой книги — дать общее представление о структуре микропроцессора Intel 8088, его системе команд, принципе и технике его программирования. Книга может послужить основой для разработчиков программного обеспечения, развивающих или при- меняющих программы для МП 8088. Все принципы программирования и применения программного обес- печения, предназначенные для МП 8088, можно без каких-либо изменений использовать и в системах, ос- нованных на микропроцессорах 8086, 80186, 80286. Предполагается, что читатели уже знакомы с про- граммированием на одном из языков высокого уров- ня, например таком, как Фортран. Пользователю, 7
имеющему опыт программирования других микропро- цессоров или компьютеров, эта книга подскажет прие- мы программирования, использующие специфические характеристики и возможности МП 8088. В книге описываются практические методы, часто используемые при обработке информации, в том чис- ле: генерация псевдослучайных чисел, сортировка и поиск данных, преобразование представления симво- лов, использование стека в рекурсивных процеду- рах, преобразования над алгебраическими выраже- ниями и так называемыми обратными польскими записями. В первой главе приводятся основные понятия и оп- ределения, относящиеся к структуре микро-ЭВМ на основе МП 8088, и способы представления информа- ции. В качестве примера машины, созданной на базе МП 8088, рассматривается персональный компьютер фирмы IBM. Вторая глава является по существу введением в машинный язык микропроцессора 8088. Кроме того, она дает представление об архитектуре центрального микропроцессора, включая его регистры общего поль- зования, регистры сегментов и способы адресации. Третья глава посвящена языку ассемблера для микропроцессора 8088, который помогает понять смысл машинных команд, представляемых в ассем- блере символически. Приводятся основной формат ас- семблера и типовые ошибки, допускаемые при про- граммировании. В четвертой главе содержится описание всех ма- шинных команд МП 8088. Для каждой из них даются примеры записи на языке ассемблера. В пятой главе на конкретных примерах поясняется выполнение арифметических операций над 32-разряд- ными числами и перевод чисел из одной системы счис- ления в другую с использованием 16-разрядного МП 8088. (Автор настоятельно рекомендует решить эти примеры самостоятельно, чтобы проверить, насколько хорошо усвоен изложенный материал.) В шестой главе приводятся логические команды, включающие булевы операторы НЕ, И, исключающее ИЛИ и включающее ИЛИ, а также примеры, демон- стрирующие гибкость МП 8088, которые включают способы преобразования символов и методы кодиро** 8
вания и декодирования, обеспечивающие защиту ин- формации. В седьмой главе рассматриваются команды пере- сылки данных. Демонстрируется работа с последова- тельностями знаков и перевода символов табличным способом. Описывается обработка структур данных, таких, как связанные списки. На конкретных приме- рах иллюстрируются операции удаления и вставки элементов двойных связанных списков. В восьмой главе внимание уделяется командам пе- редачи управления, позволяющим изменять естествен- ный порядок выполнения команд. Подробно рассма- триваются программные переходы, вопросы сортиров- ки и использования стека в рекурсивных процедурах. В девятой главе описываются команды сдвига и циклического сдвига чисел, рассматриваются приемы работы при помощи этих команд с отдельными раз- рядами чисел.
ОБЩИЕ ПРИНЦИПЫ ПОСТРОЕНИЯ МИКРО-ЭВМ Появление в начале 70-х годов первого микропроцессора (МП) ознаменовало собой новую эру в развитии вычислительной тех- ники — микрокомпьютерную технику. В настоящее время мик- рокомпьютеры «вторглись» во все сферы деятельности и жизни человека — от простых расчетов, связанных с ведением домаш- него хозяйства, до сложнейших деловых операций. В данной главе содержатся основные определения и прин- ципы организации микрокомпьютерной техники. Кроме того, по- казано, как информация, числовая и алфавитно-цифровая, мо- жет быть представлена в программах и записана в машинную память. Для решения задачи на ЭВМ ее делят на ряд частей. Про- стейшая часть представляется в виде машинной команды. На- бор машинных команд, написанных в определенной последова- тельности, является основной формой машинной программы. Микрокомпьютер может запомнить программу в своей памяти и выполнять ее без вмешательства человека. Аппаратная часть Микро-ЭВМ состоит из нескольких основных функ- циональных устройств, реализующих арифметико-ло- гические операции, а также управление, запоминание, ввод и вывод данных (рис. 1.1). . Устройство центрального процессора Арифметико-логическое устройство (АЛУ) и уст- ройство управления (УУ) объединены в одном крем- ниевом кристалле и образуют центральный процессор (ЦП), или микропроцессор. Большинство кристаллов микропроцессоров заключено в миниатюрные корпуса прямоугольной формы (рис. 1.2). Арифметико-логиче- ское устройство выполняет основные арифметиче- ские операции, такие, как сложение и вычитание. Оно 10
Рис. 1.1. Функциональные части микрокомпьютера. !Рис. 1.2. Коммерческие микропроцессоры: МП 8088 и 8036
Рис. 1.3. Структурная организация МП 8088, может также сравнивать два заданных операнда и ин* дицировать результат. Устройство управления коор*. динирует и синхронизирует взаимодействие микропро- цессора и памяти микро-ЭВМ. Микропроцессор 8088 разработан фирмой Intel Corporation of Santa Clara (Калифорния). Сегодня его выпускает фирма Intel, а также другие фирмы- 12
производители полупроводниковых приборов, но в не- сколько различных модификациях. Для разработчика программного обеспечения АЛУ микропроцессора 8088 может быть представлено как множество регистров (рис. 1.3). Основное назначение каждого регистра — хранение информации для пред- стоящей обработки или хранение уже обработанной информации. Данные могут передаваться между ре- гистрами или из регистров в память микрокомпьюте- ра и обратно. МП 8088 имеет четыре регистра общего назначения, четыре регистра указателя и четыре ре- гистра сегмента. Память Компьютер обрабатывает информацию, представ- ляемую в виде чисел или символов. Информацией, хранящейся в памяти компьютера, могут быть про- граммы, написанные на машинном языке, входные данные, промежуточные и окончательные результаты. В компьютерной памяти такая информация всегда хранится группами в виде двоично-кодированных слов или частей слов. Двоичная цифра может принимать значение 0 или 1. Использование двоичного кода объясняется тем, что такое представление информации позволяет использо- вать устройства с двумя логическими состояниями: 0 или 1, ”да” или ’’нет”, включено или выключено, от- крыто или закрыто. Сегодня практически вся инфор- мация обрабатывается в двоичном представлении. В микропроцессоре 8088 двоичные цифры объединены в группы по восемь разрядов (по восемь битов). Группа из восьми битов называется байтом, группа из 16 бит — словом, а группа из 32 бит — двойным словом. Память микрокомпьютера построена из полупровод- никовых элементов и подразделяется на постоянное запоминающее устройство (ПЗУ) и оперативное за- поминающее устройство (ОЗУ), или память с произ- вольным доступом. ПЗУ используется для запоминания программ, констант и таблиц. В нем хранят важные компьютер- ные программы, такие, как операционные системы, управляющие программы запуска и выполнения 13
базовых операций, что предохраняет их от случай- ного изменения или стирания. Содержимое в ПЗУ записывается изготовителем и не может быть изменено и перепрограммировано пользователем. В персональном компьютере фирмы IBM ПЗУ (рис. 1.4) содержит машинные коды интер- претатора языка Бэйсик и базовую операционную си- стему ввода-вывода, предназначенную для запуска компьютера и диагностики включенных аппаратурных средств. Существует несколько форм постоянной па- мяти. ППЗУ (программируемое постоянное запоминаю- щее устройство) может программироваться пользова- телем с помощью специального устройства — програм- матора. Изменить содержимое ППЗУ пользователь может только один раз. ПППЗУ (перепрограммируемое постоянное запо- минающее устройство) может быть запрограммирова- но пользователем, а затем его содержимое можно неоднократно «стирать» с помощью интенсивного уль- трафиолетового излучения. Это позволяет заново про- граммировать ПППЗУ каждый раз, когда возникает необходимость внести изменения в основные програм- мы. Такая гибкость ПППЗУ удобна при развитии но- вых систем, в которых часто изменяются программы. Емкость памяти измеряется в килобитах (Кбит) или килобайтах (Кбайт), где 1К= 1024 ПППЗУ может хранить большие объемы информации. Микросхема ПППЗУ Intel 27128, показанная на рис. 1.5, может со- держать 128 Кбит, точнее 131072 бит, информации. Устройство для стирания содержимого ПППЗУ (рис. 1.6) вырабатывает ультрафиолетовые лучи боль- шой интенсивности. Стирание выполняется за относи- тельно короткое время (10—15 мин). Для записи в ПППЗУ новой информации используют специальный программатор (рис. 1.7). ОЗУ является рабочей памятью микропроцессора. Существуют два типа ОЗУ: статическое и динамиче- ское. ОЗУ статического типа (рис. 1.8) может хранить записанную информацию до тех пор, пока к нему под- ключено питание. Статическое ОЗУ позволяет быстро записывать и считывать из него информацию, что ха- рактеризуется временем доступа. Время доступа не- которых статических ОЗУ не превышает 50 нс. Основ- 14
Рис. 1.4. Постоянная память персонального компьютера фирмы IBM, Рис. 1.5. Микросхемы 2716, 2732, 2764 и 27128 перепрограмми-’ руемой памяти, совместимые с микросхемами фирмы Intel, 15
Рис. 1.6. Устройство стирания ПППЗУ ультрафиолетовым излу- чением. ными недостатками запоминающих устройств данного типа являются их относительно большие габариты и меньшая по сравнению с динамическими ОЗУ инфор- мационная емкость. Поэтому в микрокомпьютерах в качестве памяти чаще используют динамические ОЗУ (рис. 1.9). Они значительно медленнее статических (по времени доступа), но относительно дешевы и могут со- держать гораздо больше информации. В настоящее время самые емкие устройства динамической памяти могут содержать 256 Кбит информации. Физические Рис. 1.7. Программатор ПППЗУ. 16
Рис. 1.8. Две микросхемы ОЗУ емкостью 2 Кбайт размеры элемента динамической памяти меньше, чем элемента статической памяти. Недостатком динамиче- ской памяти является необходимость использования дополнительных элементов для регенерации информа- ции. Наличие регенерации — одно из основных усло- вий функционирования динамического ОЗУ. Для вос- становления данных, находящихся в динамической памяти, требуется определенное время, в течение Рис. 1.9. Микросхемы динамических ОЗУ емкостью 64 Кбайт. Большая микросхема — статическое ОЗУ емкостью 2 Кбайт* 17
которого доступ ^обращение)' к памяти запрещен. Если регенерация не выполняется соответствующим образом, то данные в динамическом ОЗУ теряются. Программное обеспечение компьютера Полный набор команд, предназначенных для уп- равления микрокомпьютером при решении конкретной задачи или осуществления специальной функции, на- зывается компьютерной программой. По характеру выполняемых функций программы делятся на при- кладные и системные. Прикладная программа — совокупность команд, используемых для специализированной обработки ин- формации. Функции прикладных программ различны и зависят от характера применений. Примерами мо- гут служить программная обработка слов для авто- матизированного составления бланков и писем, распе- чатка финансовых расчетов и планов, сбор и анализ метеорологических данных и прогноз погоды и др. Системная программа — средство, позволяющее сделать эффективным процесс программирования за- дач и их решения процессором. Примерами системных программ являются редак- торы, ассемблеры, отладчики, компиляторы, компо- новщики и утилиты !>, программы операционной си- стемы. Совокупность прикладных и системных программ делает доступными для пользователя аппаратные средства ЭВМ. Основной частью программного обеспечения ЭВМ является операционная система, обеспечивающая пла- нирование и организацию процесса обработки дан- ных, ввод-вывод информации, распределение ресурсов вычислительной системы, подготовку и отладку про- грамм, диагностику ошибок программно-технических средств и выполнение ряда других вспомогательных операций обслуживания. Примерами операционных систем для микро-ЭВМ на базе микропроцессоров 8086 и 8088 являются си- Утилиты — программы для выполнения постоянных задач, таких, как перезапись из одного устройства в другое. — Прим* перев. 18
стемы MS-DOS гг(фирма Microsoft Corporation) и CPM-86 (фирма Digital Research, Inc.), предназначен- ные для использования микрокомпьютеров в моно- польноми однопрограммном2) режимах. Большие возможности обеспечивают операционная система МРМ-86 (фирма Digital Research), позволяющая вы- полнять одновременно несколько программ, и версия операционной системы Unix (фирма Bell Laborato- ries), позволяющая организовывать мультипрограмм- ную обработку данных в системе коллективного поль- зования. В каждой из этих операционных систем предусмо- трены программные средства, которые существенно облегчают разработку и модификацию программного обеспечения ЭВМ. Они включают редактор, ассемб- лер, отладчик, компоновщик, интерпретаторы и ком- пиляторы. Редактор Редакторы используются для ввода и модифика- ции исходных программ или текстовой информации. Подобная информация обычно хранится в устройствах внешней памяти, таких, как твердые магнитные диски, магнитные дискеты или ленты, в форме файла3), на- зываемого исходным файлом. Редактор может форми- ровать эти файлы и манипулировать информацией, со- держащейся в них. Пользователи ЭВМ вызывают ре- дактор путем введения соответствующих команд с клавишного пульта и получают требуемую информа- цию на экране видеотерминала (дисплея). Хороший редактор микрокомпьютерной системы, как правило, обеспечивает: О построчное редактирование (в каждый момент времени обрабатываться может только одна строка Монопольный режим (в отличие от режима коллективного пользования)—режим, при котором с системой работает только один пользователь. — Прим, перев. 2> Однопрограммный режим (в отличие от мультипрограмм- ного) — режим, при котором в системе содержится и выпол- няется только одна программа. — Прим, перев. 3) Один из форматов последовательной записи данных. Груп- пы слов (8 4- 16-разрядных, от двух до нескольких тысяч) об- разуют блоки, а группы блоков (от двух до нескольких сотен) образуют файлы. — Прим. ред. 19
New* ♦ г file . (insert command) l:*;This is the first line of a test program* 2:*Test 3:* 4:*Main 5:**C Segment Para Assume CS:TestiDS:TesttES:Test,SS;Test Endp (Control-C to get out entry mode)' *11 1: ‘/Phis (listing command) is the first line of a test program. Segment Para Assume CSzTestjDS^TestiESsTest.SS^Test Endp 2: Test 3: 4: Main *4d ♦41 4:*Main 5;*AC Proc Near ♦11 1! ;This is the first line of a test program* 2: Test Segment Para 3: Assume CS;TestfDS:Test>ES:Test,SS:Test 4; Main Proc Near * • * Рис. 1.10. Пример работы с редактором EDLIN на персонала ном компьютере фирмы IBM. исходной программы или информации)'. Вместе с тем имеется возможность работы с полным экраном дис- плея, что позволяет пользователю редактировать сра- зу целую страницу текста. (Размер экранной страни- цы обычно ограничен числом строк экрана видеотер- минала.) ; ® гибкое управление перемещением курсора видео- терминала для отслеживания текущего редактируе- мого символа. Специальные функциональные клавиши на пульте или их комбинации могут обеспечить пере- движение курсора на любое место видеотерминала: в верх и в низ экрана, к начальному или конечному символу слова или строки, движение вверх и вниз от строки, вперед или назад; ® считывание из устройств внешней памяти в память микро-ЭВМ информации для ее просмотра или изме-. 20
нения. Редактор также может переписывать новую информацию из памяти микро-ЭВМ в устройства внешней памяти. Обмен данными между ЭВМ и пе- риферийными устройствами происходит автомати- чески; ® отображение на экране видеотерминала содержи- мого исходных файлов, записанных в устройствах внешней памяти. Любая часть исходного файла может быть выведена на дисплей по запросу пользователя в удобном формате. На экран можно вывести нужное число слов в строке или строк на странице, можно пе- ремещать страницу вверх или вниз по строкам или «листать» текст на экране по страницам; ® ввод в микрокомпьютерную систему новой инфор- мации. Записанная на внешних носителях информа- ция может перезаписываться, сохраняться или изме- няться. Возможности редактирования могут предусма- тривать удаление и вставку текстовой информации в исходный файл по символам, словам, строкам или предложениям. Простым построчным редактором текстов являет- ся программа EDLIN.COM, которая входит в опера- ционную систему PC-DOS. На рис. 1.10 приведен при- мер работы с этой программой на персональном компьютере фирмы IBM под управлением операцион- ной системы PC-DOC. ^Ассемблер Машинные инструкции удобнее писать в форме мнемонических кодов. В этом случае адресам ячеек ставят в соответствие символы и метки. Такое напи- сание программы на машинном языке делает ее более понятной и легкой для прочтения по сравнению с про- граммой, написанной в виде строк двоичных чисел, со- ставляющих истинные инструкции машины. Ассемблером называется системная программа, переводящая программу, написанную на символиче- ском языке, в последовательность машинных команд, которая должна быть записана в память микро-ЭВМ и выполнена микропроцессором. Программа, пере- веденная на язык машины, называется объектным 21
'модулем Существует несколько вариантов ассемб- лера для микро-ЭВМ, базирующихся на микропроцес- сорах 8086 и 8088, например Macro Assembler (фирма Microsoft Corporation), и ASM-86 (фирма Intel), Компоновщик Компоновщик — системная программа, обеспечи- вающая возможность объединения нескольких отдель- ных объектных модулей в один, который может быть загружен в память и выполнен. Такой модуль назы- вают загрузочным. Компоновщик может находить и создавать библиотеки объектных модулей (например, математических функций, графиков), которые при не- обходимости могут быть включены в любой другой объектный модуль. Это означает, что для использова- ния уже существующих библиотек при разработке но- вой программы достаточно просто дать команду ком- поновщику на присоединение библиотечных объект- ных модулей к объектному модулю новой программы. Примером компоновщика является программа-утили- та LINK.EXE, входящая в состав дисковой операцион- ной системы PC-DOS. Отладчик Сложная структура машинных программ затруд- няет их проверку визуальным способом. Программные средства операционной системы, обеспечивающие про- верку работы любой части каждой машинной коман- ды, называются отладчиком. Стандартный отладчик обладает возможностями просмотра и изменения со- держимого оперативной памяти и (или) регистров микропроцессора, выполнения программы в заданном диапазоне адресов, изменения последовательности вы- полнения машинных команд путем изменения содер- жимого отдельных ячеек оперативной памяти или регистров центрального процессора. Большая часть отладчиков позволяет выполнять программы в поша- говом режиме, т. е. по одной команде. Самой важной характеристикой отладчиков надо считать их способность выполнять программы по ча- 1} Программа, записанная на языке программиста — Фор- тране, Коболе, языке ассемблера и др., называется исходным модулем. — Прим. ред. 22
стям, что позволяет сделать процесс отладки пол- ностью управляемым и контролируемым. Примером стандартного отладчика может служить программа- утилита DEBUG.COM, входящая в операционную си- стему PC-DOS. Интерпретаторы и компиляторы Язык ассемблера обладает рядом существенных недостатков. Так, являясь языком символического ко- дирования, он тем не менее машиннозависим. Про- грамма для микро-ЭВМ, основанной на базе микро- процессора 8088, может быть выполнена только ма- шинами с микропроцессорной серией 8086/8088 и не может быть выполнена на любой другой ЭВМ, напри- мер построенной на базе микропроцессора MC68000 (фирма Motorola). И хотя программа, написанная на языке ассемблера, очень эффективна с точки зре- ния быстродействия и объема занимаемой памяти, трудности изучения и неудобства программирования велики. Для устранения этих трудностей в 50-х годах были созданы программы, способные переводить в последовательности машинных команд инструкции, написанные на языках, напоминающих английский. Эти программы дали начало разработке языков так называемого высокого уровня и таким образом позво- лили получать машинные программы, близкие по сво- ей эффективности к написанным на языке ассемблера. Примерами распространенных языков высокого уров- ня, используемых сегодня в микро-ЭВМ, являются Бэйсик, Фортран, Паскаль. Программы, переводящие инструкции, написанные на языках высокого уровня, подразделяются на интерпретаторы и компиляторы. Интерпретаторы просматривают каждый оператор программы, генерируют соответствующий машинный код и тут же его выполняют. Следовательно, изменив оператор программы, можно сразу же запускать ее вновь. Интерпретаторы последовательно транслируют каждый оператор программы на исходном языке. По- следнее обстоятельство облегчает внесение изменений ° Такой перевод называется трансляцией, а программы, вы- полняющие его, — трансляторами. — Прим, перге. 2Э
в программу при ее отладке. Кроме того, интерактив- ный режим работы с интерпретаторами значительно упрощает их изучение операторами. Однако при ис- пользовании интерпретаторов существенно увеличива- ется время выполнения программы (в 100 и более раз) по сравнению с программой, написанной на языке ас- семблера. Поэтому интерпретаторы удобны при про- верке алгоритмов, записанных на языках высокого уровня, и используются для решения задач, не тре- бующих большого объема вычислений. MOV СХ, 10 MOV BX,0 LEA SI,TABLE j Инициализация j В BX накапливается результирующая сумма ; SI указывает таблицу масштабных коэффициентов count: CALL СЕГ ; Поместить число в AL MUL BYTE PTR AL,(SI) ; Масштабируем INC SI • Следующий масштабный коэффициент ADD BX.AX • Прибавляем в ВХ другое отмасштабированное целое LOOP COUNT •10 итераций MOV SUM.BX MOV CL, 10 • Распечатать результирующую сумму DIV GL ; Усредняем MOV AVG,AL •Распечатываем среднее Рис. 1.11. Пример программы на языке ассемблера 8088. Компиляторы в отличие от интерпретаторов транс- лируют программу без ее выполнения. Хорошие ком- пиляторы позволяют получить объектные модули, ино- гда даже более оптимальные, чем написанные про- граммистом на ассемблере. Основной недостаток компиляторов состоит в том, что процесс компиляции, т. е. перевод программы, написанной на языке высо- кого уровня, в машинные коды, требует существенных временных затрат. Еще одним недостатком является невозможность работы с компилятором в интерактив- ном режиме для оперативного вмешательства в про- грамму. Диалоговый режим обмена информацией оператора с ЭВМ. — Прим, ред. 24
INTEGER ITABLE(IO) DATA ITABLE/1, 2, 3,4, 5,6,7,8,9,0/ NSUM = 0 C С Цикл маштабирования и суммирования 10 целых чисел С DO 100 I = 1,10 CALL GET (NEW,I) NSUM = NSUM + NEW* ITABLE(I) 100 CONTINUE C С Вычисляем целое С NAVG = NSUM/10 Рис. 1.12. Пример программы на языке Фортран. Важнейшим преимуществом языков высокого уров- ня является их универсальность; программа, написан- ная, например, на Фортране для микро-ЭВМ одного типа, может быть выполнена на микро-ЭВМ любого другого типа (и даже ЭВМ другого класса) при ми- нимальных изменениях. Таким образом, было бы очень удобно для языков высокого уровня иметь одновременно и интерпрета- тор, и компилятор. К сожалению, сейчас такая воз- можность обеспечена только для Бэйсика, а для остальных языков высокого уровня можно использо- вать лишь компиляторы. Для сравнения языков высокого уровня и ассемб- лера рассмотрим следующую задачу. Для массива из десяти целых чисел, находящихся в памяти, требуется 25
найти сумму и среднее значение. Тексты программ* написанных на языке ассемблера 8088 и на Фортране* приведены на рис. 1.11 и 1.12. Представление информации в микро-ЭВМ В микро-ЭВМ, выполненной на базе микропроцес- сора 8088, машинные команды представляют собой фиксированные последовательности двоичных знаков* которые могут занимать один и более байтов памяти. Наборы битов каждой команды определяются изгото- вителем. Любая программа в памяти микро-ЭВМ представляется последовательностью таких наборов битов. Численная и буквенно-цифровая информация пред- ставляются в ЭВМ в виде групп двоичных цифр, так же как и машинные команды. При этом первая может содержать как целые (положительные и отрицатель- ные) числа, так и дробные (последние представляют- ся в форме с плавающей запятой или точкой). Бук- венно-цифровой текст может содержать прописные и строчные буквы алфавита или специальные символы, такие, как знак подчеркивания __, десятичная точ- ка ., знак доллара $, звездочка * и др. Для понимания структуры микро-ЭВМ програм- мист должен знать по крайней мере три системы счи- сления — десятичную, двоичную и шестнадцатеричную. Наиболее часто используемая числовая система — де- сятичная— построена на степенях основания 10. Дво- ичная система основана на степенях основания 2, шестнадцатеричная — на степенях основания 16. В двоичной системе счисления используются только два символа: 0 и 1. В десятичной системе—10 сим- волов (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), а в шестнадцатерич- ной— 16 символов (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F). Представление целых чисел Двоичное представление целых чисел — это запись числа в двоичной системе счисления. Так, например, число 4896 в десятичной системе счисления, т. е. пред- ставленное поразрядно как разложение по степеням 26
основания 10, запишется в виде 4Х 103 = 4000 + 8Х Ю2= 800 + 9X10’= 90 + 6 X Ю° = 6 4896 Следовательно, в десятичной системе счисления крайний правый разряд представляет собой нулевую степень основания 10. Разряд левее (справа налево) — первую степень основания 10, следующий — вторую степень основания 10 и т. д. Таким образом, десятич- ное число бз б2 61 бо можно записать в виде (б3 X 103) + (б2 X Ю2) + (б! X 1О') + (бо X Ю°), где подстрочный индекс у б обозначает соответствующий разряд десятичного числа. При двоичном представлении чисел каждый раз- ряд пропорционален степени “два”. Например, двоич- ное число 100 001 можно записать как 1 X 32 = 32 + ох 16= О + 0Х 8= 0 + 0Х 4= О + 0Х 2= 0 + 1Х 1= 1 33, или 1 Х25 = 32 + 0Х24= О + 0Х23= О + 0Х22= О + 0X2'= О + 1X2°= 1 33, т. е. число 100 001 есть двоичное представление деся- тичного числа 33. Точно так же, как и для десятичной системы, край- ний правый бит двоичного числа представляет собой нулевую степень основания “два” системы счисления, бит левее — первую степень основания “два”, и т. д. 27
Двоичное число 656463626160 можно записать в общем виде как (Ьб х 25) + (b4 X 24) + (Ьз X 23) + (Ь2 х 22) + (bL х 21) + (Ь0Х2°). Максимальное число битов (разрядов), которое микропроцессор обрабатывает за определенное время, характеризует его производительность. В любом из регистров микропроцессора 8088 можно записать 2 байт, или 16 бит, информации (максимальное целое десятичное число, которое можно представить шест- надцатью битами, равно 65535). По этой причине мик- ропроцессор 8088 является 16-разрядным микропро- цессором. Представление целых чисел со знаком Выше было рассмотрено представление положи- тельных целых чисел. Однако если крайний левый бит в записи числа использовать для записи его знака, то можно представлять как положительные, так и отри- цательные числа (рис. 1.13). Чтобы различать биты в байте или слове, их позиции нумеруются обычно от 0 до 15 справа налево. В записи двоичного числа со знаком 0 в крайней левой позиции (пятнадцатый бит)' обозначает плюс, т. е. положительное число, а едини- ца — минус, т. е. отрицательное число. Отрицательные числа представляют в так называе- мом дополнительном коде. Это означает, что если i —: положительное число, то —i представляется шестна- дцатибитовой записью числа 216 — i. Например, число —125 получается вычитанием 125 из 216 в двоичном виде: 216 = 10000000000000000 — 125 = 0000000001111101 1111111110000011 Представление шестнадцатеричных чисел С двоичными числами большой разрядности труд- но оперировать, поэтому используют более компакт- ное их представление, тесно связанное с двоичным^ В шестнадцатеричной системе счисления числа пред- оставляются по степеням основания 16 (16 = 24), что 28
15 14 13 12 11 10 9 8 7 5 5 4 3 2 1 0 4-Пози- Определяет-J o|o|o|o|ololo|l|o|o|l|o|l|o|o|l |ЦИрядов знак плюс 1—1—1—1—1—1—1—1—1—1—1—1—1—1—1—’—I Представление 16 разрядами числа +297J 1 0 0 0 0 0 11 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ◄-Позиции 1 I——————— q—|—]————— разрядов Определяет-й знак минус L Представление 16 разрядами числа —725 Рис. 1.13. Целые числа со знаком. эквивалентно комбинации цифр двоичной записи в группы по четыре. Для кодирования шестнадцатерич- ных цифр выбраны 16 символов: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F (табл. 1.1). Таблица 1.1. Шестнадцатеричные цифры Шестнадцатеричная цифра Двоичный эквивалент Десятичный эквивалент ’ 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 А 1010 10 В 1011 11 О 1100 12 D 1101 13 Е' 1110 14 F 1111 15 29
Перевод из двоичной системы счисления в шестна- дцатеричную и наоборот очень прост: для перевода целого двоичного числа в шестнадцатеричное его раз- ряды, начиная с крайнего правого, группируются по четыре, а затем каждая группа заменяется ее шестна- дцатеричным эквивалентом согласно табл. 1.1. Напри- мер, двоичное число 110010010110101 в шестнадцате- ричной системе счисления представляется числом 64В5: 110 0100 1011 0101 6 4 В 5 Также прост перевод шестнадцатеричного числа в двоичный код. При этом каждая цифра шестнадцате- ричного числа заменяется, согласно табл. 1.1, на соот- ветствующее двоичное значение; 7 F О Е 0111 1111 0000 1110 Арифметические операции над целыми двоичными числами Арифметическое сложение и вычитание целых дво- ичных чисел выполняется согласно следующем прави- лам; 0^0 = 0 0-ь 1 = 1 14-0 = 1 1 4- 1 = (1)0, где (1) указывает на перенос 1 в соседний старший разряд (двоичное число 10, образованное единицей переноса и нулем в младшем разряде, равно десятич- ному числу 2). Двоичное вычитание двух чисел сводится к сложе- нию первого числа с дополнительным кодом второго. Пример 1 Представить сумму десятичных чисел 456 и 127 в шестнадцатеричной системе счисления.. 30
Десятичная запись 456 127 583 Двоичная запись 0000 0001 1100 1000 0000 0000 0111 1111 _ ,0000 0010 0100 0111 •Нет переноса^Нет переноса Нет переполнения В шестнадцатеричном представлении имеем Десятичное число Шестнадцатеричный эквивалент 456 01С8 Q07F 0247 127 583 Пример 2 Сложить в шестнадцатеричном представлении два числа: 32 000 и 28 000. Десятичная запись ‘32000 28000 Двоичная запись 0111 1101 0000-0000 ’ ОНО 1101 ОНО 0000 уЩ01010 ОНО 0000 Йет переноса*** Перенос Переполнение Так как результат сложения чисел 32 000 и 28000 больше допустимого положительного целого числа (216— 1), произошло переполнение. Поскольку в зна- ковом разряде числа появилась единица, результат сложения будет рассматриваться как отрицательное .число. Очевидно, что результат неверен. Пример 3 Сложить два отрицательных десятичных числа:’ —32 700 и —4325. Десятичная Двоичная запись запись -32700 1000 0000 0100 0100 -4325 1110 1111 0001 1011 ^/)110 1111 0101 1111 Перенос Нет переноса Исчез порядок 31
Поскольку сумма меньше —32 768 (—216), произошло исчезновение порядка. Результат ^(положительное чис- ло) неверен. Пример 4 Сложить два отрицательных десятичных числа, —25 и —9, в шестнадцатеричном представлении. Десятичная Двоичная запись -25 -9 1111 1111 запись 1111 1110 0111 1111 1111 0111 -34 да 1111 1101 1110 Перенос Перенос Нет переполнения Результат верен, при этом бит переноса из старшего разряда (знакового) не учитывается. Из четырех приведенных примеров следует, что пе- реполнение или исчезновение порядка для шестнадца- тиразрядных двоичных чисел возможно в следующих случаях: • есть перенос из 14-го разряда, но нет переноса из 15-го (знакового); © есть перенос из знакового разряда, но нет переноса из 14-го разряда; Вместе с тем переполнения не происходит, если: О есть перенос из 14-го разряда и перенос из 15-го разряда; 0 нет переноса ни из 14-го, ни из знакового разряда. Двоично-десятичное представление чисел Двоично-десятичное представление чисел исполь-? зуется, как правило, в тех случаях, когда предъявля- ются повышенные требования к точности вычислений. В основу представления положен принцип кодирова- ния каждой десятичной цифры числа группой из че- тырех битов, причем требуемая точность достигается выбором необходимого числа двоично-десятичных раз- рядов. Хотя четырьмя битами можно закодировать шестнадцать различных комбинаций, а десятичных 32
цифр только десять', поеледййё Шёсть кодов в дво- ично-десятичном представлении не используются (табл. 1.2). Это последнее обстоятельство может быть причиной получения неверных результатов при выпол- нении обычных арифметических операций, таких, как сложение и вычитание. Для подобных ситуаций мик- ропроцессор 8088 имеет специальные команды деся- тичной коррекции результатов. Такими командами яв- ляются DAA (десятичная коррекция при сложении)’, DAS (десятичная коррекция при вычитании), ААА '(кодовая коррекция при сложении), AAS (кодовая коррекция при вычитании), ААМ (кодовая коррекция при умножении), AAD (кодовая коррекция при деле- нии). Таблица 1,2. Двоично-десятичное представление Двоично - десятичный код Десятичная цифра 0000 0001 0010 001 1 0100 0101 0110 01 1 1 1000 1001 1010 1011 1 100 1101 1 110 1111 0 1 2 3 4 5 6 7 8 9 Не используется Не используется Не используется Не используется Не используется Не используется Положение десятичной точки и знака при двоично десятичном кодировании может быть самым различ- ным. Например, самый левый байт может использо- ваться для знака, при этом 0 будет означать плюс, а 1 — минус. Десятичная точка может находиться после третьего слева разряда числа (табл. 1.3). Такой фор- мат представления числа называется неупакованным, так как каждая его цифра занимает один байт памяти. 2 Л. Дас 33
В одном байте можно записать и две двоично-деся- тичные цифры. Такая запись называется упакован* ным форматом (табл. 1.4). Таблица 1.3. Двоично-десятичное представление в неупакован- ном формате Таблица Г.4. Двоично-десятичное представление в упакованном формате Байт 0 Байт 1 Байт 2 Байт 3 Байт 4 0 55 72 34 50 Знак Десятичная запятая после 3-й цифры Преимуществом работы с двоично-десятичными числами является возможность получения результатов с абсолютной точностью. Недостатком — большой объем памяти, необходимый для записи двоично-деся- тичных чисел, и пониженная (по сравнению с двоич- ным кодом) скорость выполнения арифметических операций. Представление алфавитно-цифровых данных Для кодирования алфавитно-цифровой информа- ции или символов используют либо 7-разрядный код ASCII (американский стандартный код для обмена ин- формацией), либо 8-разрядный код EBCDIC (расши- ренный американский двоично-десятичный код для об-. 34
Таблица 1.5. 7-разрядный код ASCII Шестнад- цатерич- ное число Старшая цифра ’ 0 1 2 3 4 5 6 7 Младшая цифра Виты 000 001 010 on 100 101 no 111 6 0000 NUL DLE SP 0 @ p . \ P 1 ОО01 SOH DC1 ! 1 A Q a q Л ^0010 ' STX DC2 ff 2 В R b r L 3 0011 ЕТХ DC3 3 C S c S 4 0100 EOT DC4 $ •4 D T d t 5 0101 ENQ NAK % 5 E U e (J 6 0110 АСК SYN & 6 F V f V 7 0111 BEL ETB f 7 G w g w 8 1000 BS CAN ( 8 H X h X 9 1001 НТ EM ) 9 1 Y i У А >010 LF SUB • J z i z В 1011 VT ESC + i К [ k С 1100 FF FS 1 < L \ 1 c S D 1101 CR GS — M 1 m } Е 1110 SO RS • > N Л n *4 F 1111 SI US / 0 a DEL мена данными). Все микро-ЭВМ используют код ASCII (табл. 1.5),. Код EBCDIC используется фирмой IBM в ЭВМ типа IBM 360/370, а в микро-ЭВМ его применяют, когда необходима их стыковка с системами IBM 360/370 {табл, 1.6), 2* 35
Таблица L6. 8-разрядный код EBCDIC фирмы IBM Шестнад- цатеричное число Стар- шая цисрра 0 1 2 3 4 5 6 7 8 9 A B C n E F Младшая цифра Биты JLJ 0 0000 NUL DLE DS SP & { } \ 0 1 0001 SOH DC1 SOS / a j A J A 1 2 0010 STX DC2 FS SYN b k s В к s 2 3 ООП ЕТХ TM c 1 t C L T 3 4 0100 PF RES BYP PN d m u D M и 4 5 0101 НТ NL LF RS e n V E N V 5. 6 ОНО LC BS ETB UC f о w F О w 6 7 ОШ DEL IL ESC EOT g P X G P X . 7 8 1000 GE CAN h q У H Q Y 8 9 1001 RLF EM V \ i r z I R Z 9 А 1010 SMM cc SM c ! ( В 1011 VT CUI CU2 CU3 . $ 1 С 1100 FF IFS DC4 < * % D 1101 CR IGS ENQ NAK ( ) __ t Е 1110 SO IRS ACK + • > К 1111 SI XUS BEL SUB | tt EO
Персональная микро-ЭВМ фирмы IBM На сегодняшний день создано множество различ- ных вариантов персональных и профессиональных микро-ЭВМ на базе микропроцессора 8088, но персо- нальный компьютер фирмы IBM, вероятно, самый распространенный среди них. Аппаратная часть Персональный компьютер фирмы IBM конструк-: тивно разделен на клавишное устройство и собственно ЭВМ (процессор), соединяемые кабелем. Клавиатура имеет поле клавиш стандартной пишущей машинки. ЭВМ состоит из микропроцессора Intel 8088, ПЗУ на 40 Кбайт, ОЗУ емкостью до 256 Кбайт, одного-двух накопителей на гибких магнитных дисках, интерфейса для кассетного магнитофона, встроенного динамика и пяти разъемов для расширения системы (рис. 1.14). Клавишное устройство. Это устройство размещает- ся в отдельном блоке и содержит 83 клавиши. При на- жатии клавиш подается звуковой сигнал. Управление клавиатурой осуществляется отдельным микропроцес- сором Intel 8048, что позволяет освободить централь- ный процессор 8088 от различных операций опроса и контроля состояний клавиш. При нажатии клавиши в процессор поступает определенный код сканирования, который затем преобразуется в код ASCII табличным ПЗУ либо с помощью специальной прикладной про- граммы. Большим удобством клавиатуры персональ- ного компьютера IBM является наличие специального буфера на 10 символов, позволяющего избежать про- пуска вводимого символа при быстром вводе. Если клавиша остается в нажатом состоянии более одной секунды, то автоматически осуществляется повторный ввод в процессор соответствующего кода. Процессор. Конструкция процессора показана на рис. 1.14. В нижнем правом углу расположены 5 до- полнительных разъемов для подключения через соот- ветствующие средства сопряжения устройств черно- белого дисплея, параллельной печати, цветного гра- фического дисплея, накопителей на гибких маг- нитных дисках и плат контроллеров, таких, напри- мер, как RS-232C, предназначенных для управления &7
' -Рис. 1.14. Внутренний вид персонального компьютера фирмы IBM. | — адаптер дискета; 2—адаптер дискета; 3—четыре ряда микросхем динами- ческих ОЗУ на 256 Кбайт; 4—ПЗУ; 5—ЦП 8083; б—разъемы расширения; 7—источник пигания; 3—разъем для цифрового процессора 8037. Мпвмвтиогсш ад Н »ШВВВВЯ11Я D' fee® в I#» && :с Жй - Fj~ ЖЖ? ВШ I | Ж.1 ' Жл 1- 5 ъ ' ;ЛГГ ^₽^ЛЛ1«ГЖГ^' WsWO Рис. 1.15. Клавиатура персонального компьютера фирмы IBM, ав
асинхронным вводом-выводом информации. Рядом с разъемами находится микропроцессор 8088, работаю- щий с тактовой частотой 4,77 МГц. Рядом с МП 8088 на специальной панели можно установить дополни- тельный цифровой микропроцессор 8087, который ап- паратно реализует арифметические операции над чис- лами с плавающей запятой и тем значительно увели- чивает производительность компьютера в целом. В системе имеются четыре канала прямого доступа к памяти. Один из них используется для управления регенерацией динамической памяти, остальные — для высокоскоростной передачи данных между памятью процессора и периферийными устройствами. В системе предусмотрен режим обработки с прерыванием вы- полняемой программы с восемью уровнями приорите- тов, шесть из которых доступны пользователям. Память состоит из восьми БИС ПЗУ, содержащих интерпретатор Бэйсика (Microsoft BASIC) и програм- мное обеспечение базовой системы ввода-вывода, объемом около 40 Кбайт. Здесь же предусмотрено одно посадочное место для установки ППЗУ или ПППЗУ пользователей. Элементы оперативной па- мяти расположены в четыре ряда по девять элемен- тов в каждом. Емкость каждого ряда динамического ОЗУ — 9 X 64 Кбит, общая емкость составляет 64 Кбайт с битом контроля четности (паритета). Де- вятый элемент в каждом ряду содержит биты парите- та, что обеспечивает повышение надежности работы системы. Если фиксируется ошибка паритета, персо- нальный компьютер IBM выдает соответствующее со- общение и останавливает выполнение программы. Со- общение об ошибке паритета указывает, как правило, на сбои элементов памяти. В процессоре имеется также встроенный интерфейс для подключения кассетного магнитофона. Скорость передачи данных в кассетный магнитофон колеблется от 1000 до 2000 бит/с и.зависит от характера переда- ваемой информации. Видеодисплеи. В персональном компьютере IBM предусмотрены два различных выхода для вывода ви- деоинформации через соответствующие адаптеры мо- нохроматического дисплея/печати и цветного графиче- ского дисплея. Плата каждого адаптера представляет собой законченный узел, который можно установить 39
Г - Рис. 1.16. Адаптер монохроматического дисплея/печати. на одном из пяти свободных разъемов внутри устрой- ства. Адаптер монохроматического дисплея/печати (рис. 1.16) обеспечивает высококачественное черно- белое изображение символов. На экран выводятся 25 строк по 80 символов в каждой (рис. 1.17). Изо- бражение формируется матрицами 9 X 14 точек, при* . ж. ж ' 'Ж-.-. * ЖЖ-Ж <" --.................. w «ж ww & ж* «ш ж ' ?$**, Ж Ж $ Ж «$ЙЖ Ж Ж Ж '<« K&teii&b sssaW яаЖиЖая Ж ж Ь*4 Жю* w.'4'<v* £Жк* ЗЙЯ кяямЖЖ •>*** 7 ZSt 4f ite Wi- ЖЗ Ж . Ж >**>&*& <4 : йяв i-» а а? Ш зезаязйж Ж Ж ЖЖ <-Ж W Ж. ta? Ж >Х«:* W-ssr ШяЖЖ ?ww* 3sm?*8»i?»* *!»< iwswtt 4f Ша>^ж& яя»Ж^ ЙЖЖ$Ж 4Ж Aff^ &px&f4te. Ш к* Шя« А йЖЖЖ «жф «ж а« *%*; з* Ш Jst s •ло> < <-»5 W ф» фх-хкЖ^-хф з*йййй$Жф ф»&$ ’ЙйМяЖйЖ & W Рис, 1,17, Экран монохроматического дисплея персонального компьютера фирмы IBM. 40
Рис. 1.18. Адаптер цветного графического дисплея. чем каждый из 256 доступных знаков занимает матри- цу 7 X 9 точек. Высокое качество изображения обес- печивает благоприятные условия для работы операто- ра, длительное время проводящего перед экраном. На плате адаптера размещается память емкостью 4096 байт, которая может содержать коды до 2000 сим- волов. Независимо от используемого адаптера для представления символа всегда используются два бай- та: первый содержит код ASCII символа, а второй — код, определяющий такие признаки, как мерцание оптического изображения соответствующего символа, подчеркивание символа, его степень яркости. В число возможных 256 символов, выводимых на видеотерми- нал, входят все прописные и строчные буквы, цифры, знаки препинания, математические символы, музы- кальные ноты и множество графических элементов, позволяющих строить графики и таблицы. Адаптер монохроматического дисплея обеспечивает также воз- можность управления параллельной матричной пе- чатью типа Epson МХ-80. Адаптер цветного графического дисплея (рис. 1.18) содержит 16 Кбайт памяти и предназначен для вы- вода текстовых, графических и смешанных изображе- ний. Изображение формируется квадратами 8 X 8, в которых символ занимает матрицу 5X7 точек, при этом используется восемь цветов для символов и во- семь для фона. В табл. 1.7 представлены коды всех 16 возможных цветов. Символы цветным дисплеем воспроизводятся несколько хуже, чем монохрома- тическим. Однако пользователь имеет возможность 41
Таблица 1.7. Шестнадцать цветов дисплея персонального ком- пьютера IBM и их кодовое представление в памяти интенсивности Красный бит Зеленый бит Синий биг Цвет о О О О Черный О О а 1 Синий О О 1 О Зеленый 0 О г 1 Зелено-голубой О 1 о О Красный О 1 о 1 Фуксин 0 1 1 О Коричневый 0 1 1 1 Светлосерый 1 0 о О 7емно-серьм 1 о о 1 Голубой 1 О 1 О Светло-зеленый 1 а 1 t Зелено-голубой (светлый) 1 1 О О Розовый 1 1 о 1 светло-фиолетовый 1 1 1 0 Желтый 1 I 1 1 Белый управлять некоторыми деталями символов, такими, как толщина линий, курсив и т. д. (рис. 1.19) < Возможны три градации четкости цветных изобра- жений. Наихудшее разрешение получается при отоб- ражении 100 строк по 160 элементов, каждый из ко- торых может быть любого из 16 стандартных цветов. [(IBM этот вариант не использует.) Средняя степень разрешения обеспечивает вывод 200 рядов по 320 эле- ментов любого из четырех возможных цветов. При этом цвет фона может быть любым из 16 приведен- ных, а цвет основного изображения выбирается из трех цветов, принадлежащих любой из двух возмож- ных групп. Первую группу цветов образуют голубой, красный и белый; вторую — зеленый, красный и ко- ричневый. Наивысшее разрешение обеспечивается вос- произведением белого изображения на черном фоне, состоящего из 200 рядов по 640 элементов (рис. 1.20). Накопители на гибких магнитных дисках (диске- тах). В таких накопителях для записи используется модифицированный принцип частотной модуляции. Дискеты могут быть одно- или двусторонними. На од- ной стороне расположено 40 дорожек по девять сек- торов. Емкость каждого сектора 512 Кбайт. Таким образом, общая емкость одностороннего дискета 42
Рис. 1.19. Изображение на экране персонального компьютера фирмы IBM. Рис. 1.20. Изображение, построенное с наивысшим возможным разрешением.
составляет 184 320 байт, а двустороннего — 368 640 байт. К ЭВМ может быть подключено до четырех та- ких накопителей. Время выхода устройства на номи- нальную частоту вращения составляет 500 мс, время выборки дорожки — 8 мс, скорость передачи данных — 250 Кбит/с. Для управления накопителем использует- ся контроллер NEC, аналогичный контроллеру 8272 фирмы Intel. Программное обеспечение В состав системного программного обеспечения персонального компьютера фирмы IBM входят интер- претатор Бэйсика (Microsoft BASIC), хранящийся в ПЗУ, и дисковая операционная система PC-DOS (вер- сия операционной системы MS-DOS, разработанной Microsoft Corporation для фирмы IBM). Интерпрета- тор Бэйсика дополнен рядом мощных средств по сравнению со стандартным языком высокого уровня. В частности, он имеет встроенные команды для выво- да графической информации в режимах средней и высшей степени разрешения, управления акустиче- ским динамиком, связи со световым пером и играль- ными манипуляторами В составе PC-DOS интер- претатор Бэйсика имеет значительное число команд ввода-вывода данных и доступ к датчику времени. PC-DOS обеспечивает широкие возможности ис- пользования прикладных программ, создания и моди- фикации файлов специального назначения. Операци- онная система может работать как с гибкими, так и с твердыми магнитными дисками и представляет со- бой комплекс программ, выбираемых пользователем при работе. Ниже приводится ряд основных программ-, утилитов, работающих под управлением PC-DOS. 1. EDLIN.COM — небольшой построчный редактор текстов. Может создавать, изменять и выводить на экран исходные файлы, содержащие информацию в стандартном коде ASCII. Исходный файл может со- держать программу, написанную на языке ассембле- ра, программу на языке высокого уровня или просто произвольный текст. Пользователь управляет работой 1> В оригинале: joysticks — ручки, имитирующие рычаги управления игральных автоматов. — Прим. перев% 44
редактора с помощью односимвольных команд, позво- ляющих выполнять такие стандартные функции ре- дактора, как формирование и запись новых файлов, изменение содержимого файлов и одновременное со- хранение предыдущего варианта текста, нахождение, замену, вставку и отображение строки текста на экра- не. Содержимое файлов представляется строками раз- личной длины, но не более 253 символов в каждой. 2. DEBUG.COM — программа-отладчик, работаю- щая под управлением операционной системы PC-DOS. Предназначена для управления тестированием и кон- троля хода выполнения рабочей программы. Програм- ма-отладчик реализует стандартные функции загрузки отдельных объектных модулей и программ, команды останова в заданных местах, отображение и измене- ние содержимого регистров центрального процессора и ячеек оперативной памяти, пошаговый режим, а так- же позволяет работать с адаптерами ввода-вывода и выполнять арифметические операции над 16-разряд- ными числами. Особенностью отладчика является на- личие в нем средств ассемблирования и реассембли- рования. Ассемблерные команды транслируются сразу в машинные коды и помещаются в заданную область памяти. При этом используются и стандартный син- таксис ассемблера 8086/8088, и команды процессора 8087. Реассемблирование позволяет преобразовать программу, находящуюся в памяти (в шестнадцате- ричных машинных кодах), вновь на язык ассемблера. 3. LINK.EXE — программа-компоновщик. Позво- ляет объединить отдельно оттранслированные объект- ные модули в одну программу. Работая с библиотека- ми, она осуществляет поиск библиотечных файлов, формирует таблицы внешних имен и ссылок, создает загрузочные модули, дает возможность получить ли- стинг и обеспечивает диагностику ошибок. 4. FORMAT.COM — программа, предназначенная для инициализации выбранных гибких дисков (диске- тов). Осуществляет проверку рабочих поверхностей дискета на наличие дефектных дорожек и создает ка- талог дискета. Общая емкость двустороннего дискета с двойной плотностью записи составляет 360 Кбайт. В операционной системе предусмотрены также команды удаления ERASE, копирования COPY, изме- нения файлов REN, вывода содержимого файлов на 45
устройство вывода TYPE, распечатки каталога D1R И др. ' У ряда сторонних фирм, можно позаимствовать вы- сококачественные ассемблеры и компиляторы языков высокого уровня, таких, как Бэйсик, Фортран, Па- скаль и С. Для персонального компьютера IBM раз- работан большой набор эффективных прикладных программ, и он продолжает расти. Большой популяр- ностью пользуются пакеты прикладных программ Word Star ’) для обработки текстов и полноэкранного редактирования, Visi Са1с* 2) 3 для табличных вычисле- ний, 1-2-3 для табличных вычислений и обработки гра- фической информации3), Peachtree4) для общематема-. тических вычислений. Фирма Micro Pro Inc. 2) Фирма Visi Corp. 3) Фирма Lotus Development Corp. *> Фирма Peachtree Soitware.
МИКРОПРОЦЕССОР INTEL 8088 Данная глава посвящена архитектуре микропроцессора Intel 8088. Дается описание внутренней структуры типового 16-разрядного микропроцессора и способов его адресации, а также рассматри- ваются принципы выполнения команд. Приводятся основные кон- цепции использования стековых структур и процедур обработки прерываний, определяющие основные достоинства архитектуры микропроцессора Intel 8088, Машинный язык В любой ЭВМ базовыми элементами управления, определяющими характер выполняемых ЭВМ функ- ций, являются машинные команды. Они представля- ются числами и хранятся в памяти ЭВМ. Множество машинных команд, написанных на машинном языке и выполняемых последовательно, представляют собой основополагающую форму программы. Каждая ма- шинная команда содержит в себе код операции, опре- деляющий действия ЭВМ при ее выполнении. Программист, владеющий машинным языком, мо- жет полностью управлять микропроцессором и имеет доступ ко всем аппаратным и программным средствам микро-ЭВМ. Для написания эффективных программ на машинном языке программист должен хорошо по- нимать архитектуру микропроцессора, его внутреи-; нюю организацию, способы адресации и правила ис- пользования центрального процессора, а также функ-. ции, выполняемые каждой машинной командой. В соответствии с особенностями операций машин- ные команды подразделяются на несколько видов: команды пересылки — для передачи данных байтами или словами между памятью микро-ЭВМ и регистрами процессора; команды ввода-вывода — для выполнения
связи ЭВМ с внешними периферийными устройствами; арифметические команды — команды операций с 8- и 16-разрядными числами; команды битовых опера- ций — для выполнения логических и циклических сдвигов побитно в байте или слове; команды перехо- да — для изменения последовательности выполнения команд программы безусловно или в зависимости от определенных условий; команды управления — для координирования и синхронизирования работы микро- процессора с появлением определенных внешних со-* бытий. Архитектура процессора Микропроцессор 8088 является 16-разрядным про* цессором третьего поколения, выполненным в кремние- вом кристалле, с 8-разрядной внешней магистралью для связи с памятью и устройствами ввода-вывода. Хотя МП 8088 имеет 16-разрядные внутренние регист-. GND 1 '40 ^cc А14 2. 39 A15 А13 3 38 A16/S3 А12 4 37 A17/S4 А11 5 36 A18/S5 АЮ 6 35 A19/S6 А9 7 34 SSO (HIGH) А8 8 33 MN/MX AD7 9 32 RD AD6 10 31 HOLD (RQ/GTO) AD5 и ? 30 HLDA (RO/GT1) AD4 12 О 29 WR_ (ГОГК) AD3 13 g 28 10/M (52) AD2 14 gQ 27 DT/R (S1) AD1 15 26 DEN . (SO) AD0 16 25 ALE (QS0) NMf 17 24 inTa (QS1) INTR 18 23 TEST* CLK 19 22 READY GND 20 21 RESET Рис. 2.1, Распределение выводов МП 8088. 48
15 Регистры данных О 8 7 АН AL АХ ВН BL ВХ сн CL СХ DH DL DX 15 Регистры-указатели 0 SP ВР SI DI > Регистры сегментов 15 О CS DS ES SS 15 Указатель команд и флаги 0 IP Регистр флагов процессора Рис. 2.2. Регистры МП 8088< ры, в памяти микро-ЭВМ единовременно можно запи- сать или считать из нее только 8 бит. На рис. 2.1 по- казано распределение внешних выводов микросхемы МП. Центральный процессор 8088 имеет (рис. 2.2) че- тыре 16-битовых регистра общего назначения АХ, ВХ, СХ, DX, четыре регистра-указателя SI, DI, ВР и SP, .четыре регистра сегментов (или сегментных регистра) CS, DS, ES и SS и один 16-битовый регистр флагов^ 49
Регистры общего назначения 1 Эта группа состоит из четырех 16-битовых регист- ров. Каждый регистр в группе можно рассматривать как пару самостоятельных 8-битовых, для которых возможна отдельная адресация в байтовых операциях. Регистр-аккумулятор АХ. Используется для хране- ния промежуточных данных и результатов. Команды, управляющие регистром АХ, компактны и занимают в памяти мало места. При делении однобайтных чисел регистр используется для хранения частного и остат- ка. При делении двухбайтных чисел в АХ содержатся младшие 16 бит 32-разрядного делимого. В командах обработки строковых данных регистр может содержать одно- или двухбайтные данные. Если для обработки данных достаточно использовать 8-разрядные числа, то регистр АХ можно рассматривать как два совер- шенно независимых 8-битовых регистра, обозначаемых АН и AL (рис. 2.3), причем регистр АН содержит старшие восемь битов, a AL — младшие восемь битов. 15 8 7_________О | АН | AL "] Рис. 2.3. Регистр АХ. Базовый регистр ВХ. При базовых типах адреса- ции регистр содержит адрес области памяти либо ад- рес, который суммируется для получения нового зна- чения со смещением. Таким образом, одна и та же машинная команда, используя регистр ВХ, может ад- ресоваться к различным областям памяти путем про- стого изменения содержимого базового регистра. 15 8 7_________О I ВН I BL I Рис. 2.4. Регистр ВХ, В данной группе это единственный регистр, который может быть использован в качестве указателя адреса памяти. При исполнении большинства операций с ак- кумулятором АХ регистр ВХ может выполнять функ*. @0
ции регистра общего назначения. При выполнении операций с 8-битовыми операндами регистр ВХ может рассматриваться как два независимых 8-разрядных регистра ВН и BL (рис. 2,4). Регистр-счетчик СХ. Предназначен для управления числом итераций в цикле или числом повторений в командах REP (REPeat — повторение) в строковых операциях. При выполнении операций с аккумулято- ром АХ он также может использоваться как регистр общего назначения. При работе с 8-битовыми операн- дами регистр СХ можно рассматривать как пару не- зависимых 8-разрядных регистров СН и CL (рис. 2.5). 15 8 7________О | CH I CL 1 Рис. 2.5. Регистр СХ. Регистр данных DX. Используется как вторичный аккумулятор для хранения промежуточных данных и результатов. В командах умножения и деления он мо- жет использоваться вместе с регистром АХ для фор- мирования 32-разрядных чисел, при этом он содержит старшие 16 бит числа. При делении двухбайтных чи- сел DX используется для хранения остатка. При при- еме или выводе информации на периферийные уст- ройства регистр может использоваться для хранения адреса порта ввода-вывода. В однобайтных операциях регистр DX можно рассматривать как два независи- мых 8-разрядных регистра DH и DL (рис. 2.6)» 15 ' 8 7_______________О | DH | DL ~~| Рис. 2.6. Регистр DX. Индексные регистры и регистры-указатели В эту группу входят четыре 16-разрядных регист- ра. Индексные регистры используются обычно как указатели при выборке операндов из памяти. Регист- ры-указатели используются для работы со стеком» 51
Каждый регистр этой группы может использоваться в большинстве арифметических и логических опера- ций, 15 О I si I Рис. 2.7. Регистр SI. Индексный регистр-источник SI (рис. 2.7). Исполь- зуется в качестве указателя адреса байта или слова в таких строковых командах, как LODS (загрузить строку), CMPS (сравнить строку), MOVS (переслать строку). При базово-индексной адресации содержимое регистра SI может суммироваться с содержимым ре- гистра ВХ. Для повышения эффективности выполне- ния операций над последовательностями содержимое регистра SI может автоматически возрастать или уменьшаться в режиме автоиндексации. Регистр мо- жет также быть использован при выполнении большей части арифметических и логических операций. 15 О DI Рис. 2.8. Регистр DL Индексный регистр назначения DI (рис. 2.8). Ис- пользуется как указатель назначения для адреса бай- га или слова в строковых командах, таких, как SCAS (сканировать строку), CMPS (сравнить строку), MOVS (переслать строку), STOS (записать строку). При базово-индексной адресации для получения ад- реса операнда содержимое регистра DI может ис- пользоваться для суммирования с содержимым ре- гистра ВХ. В операциях над последовательностями возможно автоматическое увеличение или уменьшение содержимого DI. Регистр может использоваться в большинстве арифметических и логических операций. Регистр — указатель стека SP (рис. 2.9). Исполь- зуется для работы с данными в стековых структурах. Его содержимое указывает адрес элемента на верши* 52
не стека, что оказывается удобным при организации обработки прерываний, процедур вызова подпрограм- мы и выхода из нее путем сохранения адреса возврата на вершине стека. Хотя регистр SP может выполнять Рис. 2.9. Регистр SP. и функции регистра общего назначения в арифмети- ческих и логических операциях, однако, как правило, в таком качестве он не используется. 15 ___________________О I ВР | Рис. 2.10. Регистр ВР. Регистр — указатель базы ВР (рис. 2.10). Исполь- зуется как дополнительный указатель для работы с данными в стековых структурах. Регистр ВР может выполнять функции указателя обхода параметров или промежуточных данных, записанных в стек команда- ми PUSH. В режиме базово-индексной адресации для получения адресов операндов содержимое регистра ВР может суммироваться с содержимым регистров SI или DI. Регистр ВР может использоваться в боль- шинстве арифметических и логических операций. Регистры сегмента t Микропроцессор 8088 может адресоваться к одно- му мегабайту (1 048 576 байт) памяти. Адресное про- странство памяти МП, откуда происходит выборка команд и данных, разделено на сегменты (области памяти) емкостью до 64 Кбайт каждый. Процессор 8088 имеет прямой доступ одновременно к четырем сегментам. Начальный адрес каждого из них содер- жится в одном из четырех регистров сегмента. Этими регистрами являются 16-разрядные регистры CS, DS, ES и SS, доступные программам на машинном языке 53
через команды типа MOV (переслать) или POP (счи* тать из стека). Регистры сегмента используются преимущественно для идентификации текущего сегмента адресного про- странства. Поэтому они тге могут выполнять функции регистра общего назначения jb арифметических и ло- гических операциях. 15 -________________0 I CS П Рис. 2.11. Регистр CS. Регистр сегмента команд CS (рис. 2.11) — 16-раз- рядный управляющий регистр, указывающий сегмент, содержащий адрес текущей выполняемой команды. Его содержимое может быть изменено только при вы- полнении команд JMP (переход), CALL (вызов про- цедуры), RET (возврат из процедуры), IRET (выход из прерывания) с указанием другого сегмента команд. 15__________________ О I DS I Рис. 2.12. Регистр DS. Регистр сегмента данных DS (рис. 2.12) — 16-раз- рядный управляющий регистр. Его содержимое указы- вает начало зоны адресов, которая в общем случае включает программно изменяемые таблицы и констан- ты. Такая организация, при которой данные группи- руются вместе в отдельном сегменте и не попадают в сегмент, хранящий коды команд, облегчает програм- мирование. Все прямые и косвенные адресные ссылки, использующие регистры ВХ, SI или DI, определяются относительно регистра DS. Адресные ссылки в строч- ных командах, использующих регистр SI, таких, как LODS (загрузить строку), MOVS (переслать строку) или CMPS (сравнить строку), также вычисляются от- носительно регистра DS. Регистр дополнительного сегмента ES (рис. 2.13)— управляющий 16-разрядный регистр. Его содержимое Ъ'4
указывает начало области памяти, которая обычно используется для запоминания промежуточных дан- ных, т. е. рабочей зоны. Адресные ссылки в командах работы со строками, использующих регистр DI, таких, как STOS (запомнить строку), SCAS (сканировать ES Рис. 2.13. Регистр ES, строку), MOVS (переслать строку) и CMPS (сравнить строку), вычисляются относительно регистра допол- нительного сегмента ES. SS Рис. 2.14. Регистр SS. Регистр сегмента стека SS (рис. 2.14)— 16-разряд- ный управляющий регистр. Его содержимое указы-: вает начало стековой структуры в памяти ЭВМ. Со- держимое регистров SP или ВР может использоваться для указания относительных адресов переходов, ис- пользующих эти регистры и вычисляемых относитель- но регистра SS. Рис. 2.15. Указатель команд IP, Указатель команд IP (рис. 2.15) — 1б-разрядный регистр, аналогичный счетчику команд PC в традици- онных устройствах центрального процессора. Его со- держимое указывает адрес следующей команды в сег- менте памяти, определяемом содержимым регистра сегмента команд CS. Во время выполнения программ содержимое регистра IP изменяется и всегда указы- вает адрес следующей выбираемой команды. Содержимое регистров IP и CS однозначно опре- деляет адрес байта во всем мегабайтном адресном 55
15 14 13 12 If 10 9 8 7 6 5 4 3 2 1 0 TF sf|zf| AF М |CF *— Перенос — Паритет ; Вспомогатель- ный перенос — Ноль — Знак — Ловушка Разрешение прерывания — Направление — Переполнение Рис. 2.16. Регистр флагов процессора. пространстве микропроцессора 8088. Физический ад- рес байта — это 20-битовое число, получаемое сдви- гом влево содержимого регистра CS на четыре бита и сложением результата сдвига с содержимым регист- ра IP. . В действительности даже программы на машинном языке не имеют прямого доступа к регистру-указате- лю команд IP. Однако содержимое регистра IP мож- но изменить выполнением таких команд, как JMP (пе- реход), CALL (вызов процедуры), RET (возврат из процедуры), IRET (выход из прерывания), и некото- рыми командами условного перехода, например JE (переход по равенству), JO (переход при переполне- нии) и др. Регистр флагов (рис. 2.16)— 16-разрядный регистр, содержащий информацию о текущем состоянии мик- ропроцессора. Имеет шесть однобитовых флагов со- стояния, которые индицируют результаты выполнения 56
арифметических и логических операций. В зависимо- сти от состояния этих флагов некоторые машинные команды могут изменять последовательность выполне- ния команд в программе. Флагами состояния явля- ются: AF (Auxiliary Carry Flag) — флаг вспомогательно- го переноса; CF (Carry Flag) — флаг переноса; OF (Overflow Flag) — флаг переполнения; SF (Sign Flag)-—флаг знака; PF (Parity Flag) —флаг четности (или флаг пари- тета); ZF (Zero Flag) — флаг нуля. Существуют еще три дополнительных однобитовых флага управления в старшем байте регистра флагов, которые могут быть установлены в единичное состоя- ние или сброшены в нулевое программным путем для изменения состояния процессора: DF (Direction Flag)—флаг направления; IF (Interrupt-Enable Flag) —флаг разрешения пре- рывания; TF (Trap Flag) —флаг ловушки. Флаг вспомогательного переноса AF. Используется при арифметических операциях над 8-разрядными чис- лами для индикации переноса единицы из Младших че- тырех битов в старшую тетраду или заема единицы из старшей тетрады в младшую. Этот флаг особенно полезен для десятичной арифметики. Если флаг AF установлен в единичное состояние, то это означает, что произошел перенос или заем. Флаг вспомогатель- ного переноса занимает четвертый бит регистра фла- гов. Флаг переноса CF. Используется для индикации переноса единицы в старший разряд или заема еди- ницы из этого разряда при арифметических опера- циях над 8- или 16-разрядными числами. Появление переноса или заема устанавливает флаг в единичное состояние. Флаг делает возможным выполнение сло- жения и вычитания чисел, значения которых зани- мают больше 16 бит. Команды циклического сдвига тоже могут использовать этот флаг для установки определенного бита в байте или слове, помещая нуж- ный бит в флаг переноса CF. Определенные команды могут устанавливать флаг CF в 1 .(STC) или сбрасы- 57
вать его в О ^(СЬС)\ Флаг CF расположен в самом младшем бите регистра флагов. Флаг переполнения OF. Используется для индика- ции переполнения результатов при выполнении ариф- метических операций. Он показывает состояние, при котором происходит потеря значащего бита в тех слу- чаях, когда результат превышает 8 или 16 бит при выполнении операций соответственно над байтами или словами. Если флаг OF равен 1, это означает, что произошло переполнение. Для обработки такой ситуа- ции с помощью команды INTO (Interrupt on Over- flow— прерывание по переполнению) может быть вы- звана соответствующая процедура прерывания. Флаг переполнения OF расположен в 11-м разряде регист- ра флагов. Флаг знака SF. Используется для индикации состояния, при котором старший бит результата однобайтовой или двухбайтовой операции равен 1. Поскольку числа в системах, базирующихся на микро- процессоре 8088, представляются в стандартном до- полнительном коде, флаг знака указывает знак ре- зультата операции. Если флаг SF установлен в 1, то это значит, что результат — отрицательное число. Если флаг SF равен 0, результат — положительное число. Флаг знака SF расположен в седьмом разряде регистра флагов. Флаг паритета PF. Используется для индикации четности числа битов в 8-разрядном числе или в млад- ших восьми битах 16-разрядного числа. Если флаг установлен в единичное состояние, это значит, что ре- зультат содержит четное число единичных бит, т. е. паритет четный. Этот флаг полезен для проверки ра- ботоспособности памяти микро-ЭВМ диагностическим тестом или для поиска ошибок при передаче данных. Флаг паритета PF занимает второй разряд регистра флагов процессора. Флаг нуля ZF. Используется для индикации равен- ства нулю результата операций с байтами или сло- вами. В этом случае флаг ZF становится рав- ным 1. Флаг находится в шестом разряде регистра флагов. Флаг направления DF. Используется преимуще- ственно вместе с командами обработки строк. Когда флаг DF равен единице, эти команды автодекременти- 58
руются, т. е. выполняют операции с адресами от стар- ших к младшим. Содержимое индексных регистров SI и/или DI, используемых в этих операциях, уменьшает» ся на 1 или на 2 в зависимости от команд, работаю» Щих соответственно с байтами или словами. Если флаг направления сброшен в 0, команды об» работки строк автоинкрементируются, т. е. выпол- няют операции с адресами от младших адресов к стар- шим. При этом содержимое индексных регистров SI и/или DI, используемых в операциях, увеличивается на 1 или 2 соответственно при работе с байтами или словами. Флаг направления DF расположен в десятом разряде регистра флагов процессора. В единичное со- стояние флаг устанавливается командой STD (Set Di» rection — установить флаг направления), а в 0 сбра» сывается командой CLD (Clear Direction — сбросить флаг направления). Флаг разрешения прерывания IF. Используется в программах для разрешения или запрета обработки внешнего маскируемого прерывания, приходящего по линии INTI? магистрали. Когда флаг прерывания сброшен в 0, прерывания запрещены, т. е. запросы внешних маскируемых прерываний игнорируются. На немаскируемые внешние прерывания, появляющиеся в линии NMI магистрали, и на программные прерыва- ния флаг не влияет. Флаг прерывания IF находит- ся в девятом разряде регистра флагов. В единич- ное состояние флаг устанавливается командой STI '(Set Interrupt), в нулевое — командой CLI (Clear Interrupt). Флаг ловушки TF. Используется преимущественно для осуществления пошагового режима работы. Когда флаг TF установлен в 1, микропроцессор автоматиче- ски вырабатывает сигнал внутреннего прерывания после выполнения каждой команды. Это обеспечивает удобство проверки программ, написанных на машин- ном языке, поскольку они при этом выполняются команда за командой. Адрес сервисной процедуры организации пошагового режима должен быть опре- делен в абсолютных адресах от 00004Н до 00007Н. Процедура может включать в себя отображение на дисплее такой информации, как содержимое регистров « определенной области памяти сразу после выполне- ния команды. Флаг ловушк-и TF занимает восьмой 69
разряд в регистре флагов. Для установки флага в нуль или единицу можно использовать команду POPF (Pop Flag). Шины микропроцессора Микрокомпьютерная система содержит шины (или линии), по которым данные и другая информация пе- редаются между микропроцессором, памятью и устрой- ствами ввода-вывода. В магистральных системах раз- личают три основные группы шин, или магистралей: информационные, адресные и управления (рис. 2.17). В микро-ЭВМ, базирующихся на МП 8088, адрес- ная магистраль содержит 20 шин и информация, появ- ляющаяся на ней, является адресом, который одно- значно определяет ячейку памяти микрокомпьютера, чем обеспечивается доступ* к любой ячейке памяти во всем мегабайтовом адресном пространстве. Информация, генерируемая центральным процес- сором и записываемая в память, передается по инфор- мационным шинам. По ним передаются также коман- ды и другие данные программ, считываемые в процес- сор из устройств памяти микро-ЭВМ: ПЗУ и ОЗУ« Количество информационных шин ограничивает ма- ксимальное число битов, которое центральный процес- Рис, 2.17. Блок-схема микрокомпьютера с адресными, информ ционными шинами и шинами управления, , 60
сор может считать или записать в память за один раз. Магистраль данных МП 8088 состоит всего лишь из восьми шин, а микропроцессоры 8086, 80186 и 80286 имеют 16 информационных шин. Это позволяет им ра- ботать быстрее микропроцессора 8088, так как они могут считывать одновременно два байта. Однако все внутренние регистры арифметико-логического устрой- ства МП 8088 16-разрядные. Поэтому он считается 8-разрядным центральным процессором с 16-разряд- ной внутренней архитектурой. Шины управления включают в себя линии, по ко- торым передаются команды, определяющие тип свя- зей и координирующие действия центрального процес- сора, его памяти и периферийных устройств. Напри- мер, при активизации линии RESET инициализирует- ся предопределенная последовательность стартовых команд МП 8088. Исполнительное устройство и устройство связи с магистралью В существующих микропроцессорах выполнение программ на машинном языке осуществляется путем повторения следующих обобщенных операций: • выборка очередной машинной команды из памяти ЭВМ; ® декодирование очередной команды; • чтение операндов (если они требуются команде) из памяти ЭВМ; • выполнение команды; • запись результата в память (если этого требует выполняемая команда). В современных микро-ЭВМ эти операции должны выполняться последовательно. Исполнение текущей команды должно быть завершено до момента начала выборки следующей команды. Архитектура семейства микропроцессоров 8086 и 8088 позволяет разделить перечисленные выше операции между двумя отдель- ными устройствами в центральном процессоре. Исполнительное устройство (ИУ) осуществляет непосредственное выполнение машинных команд, а устройство связи с магистралью (УС) — выборку команд, чтение операндов и, если необходимо, запись 61
S3 Текущее время Занята Занята Занята Занята Занята Традиционный микропроцессор Исполнение 1-й команды Запись результата Выборка 2-й команды Исполнение 2-й команды Выборка 3-й команды Чтение операнда 3-й команды Исполнение 3-й команды Запись результата 3-й команды Магистраль ЦП Микропроцессор ^088/8085 Исполнение 1-й команды Исполнение ?-й команды Исполнение 3-й команды Исполнительное устройство Выборка 2-й команды Выборка 3-й команды Запись результата 1-й команды Чтение операнда 3-й команды Выборка 4-Й команды Запись результата 3-й команды Выборка 5-й команды занята занята Занята Занята Занята Занята Занята Устройство Магистраль связи Рис. 2.18. Блок-схемы выполнения команд в МП.
результатов. Эти устройства могут функционировать независимо друг от друга, поэтому в большинстве случаев возможны одновременно выборка следующей команды и выполнение текущей. Такая организация в целом позволяет ускорить цикл исполнения машин-, ной команды, поскольку затраты времени, необходи- мые для выборки команды, фактически отсутствуют. Таким образом, ИУ может выполнять команды, кото- рые предварительно выбраны из памяти устройством связи с магистралью. Блок-схемы, демонстрирующие принципы параллельного выполнения операций в сравнении с последовательным выполнением команд, приведены на рис. 2.18. Исполнительное устройство центрального процес- сора 8088 содержит арифметико-логическое устройство (АЛУ) и перечисленные выше регистры. Для ускоре- ния внутреннего обмена все регистры и информацион- ные шины в исполнительном устройстве выполнены 16-разрядными. Так как исполнительное устройство микропроцессоров 8088 и 8086 одинаково, оба цен- тральных процессора имеют одну и ту же аппаратур- ную реализацию системы команд. Исполнительное устройство не имеет прямого до- ступа к памяти ЭВМ. Оно получает команды из оче- реди, организуемой устройством связи с магистралью. Рис. 2.19 иллюстрирует логические связи между ис- полнительным устройством и устройством связи для семейства микропроцессоров 8086 и 8088. Устройство связи обеспечивает исполнительному устройству доступ ко всей памяти и операции с маги- стралью. Оно осуществляет выборку из памяти ЭВМ очередной команды из последовательности команд программы, в то время как исполнительное устройство занято выполнением текущей команды. Микропроцес- сор 8088 имеет внутреннюю оперативную память, на- зываемую очередью команд, которая может хранить до четырех — предварительно выбранных из потока команд — байтов. Если один байт в очереди свободен и не активизирован запрос от исполнительного устрой- ства, устройство связи микропроцессора 8088 автома- тически осуществляет выборку следующего байта команды. Если.исполнительное устройство выполняет машинную команду, передающую управление другой ячейке памяти (например, команды CALL или JMP), та
Центральный процессор Рис. 2.19. Диаграмма работы исполнительного устройства и устройства связи с магистралью. устройство связи вновь устанавливает очередь команд и начинает ее заполнять с нового значения. В боль- шинстве случаев исполнительное устройство может сразу получить команду из очереди, а не ждать, пока она будет выбрана из памяти. Организация памяти и адресации Микропроцессор 8088 имеет мегабайтовую память. Для того чтобы адресоваться к такому количеству ячеек, необходим 20-разрядный указатель. Поскольку 64
указатель команд IP, таййсе как и все остальные ре- гистры-указатели ВХ, SI, DI, ВР и SP центрального процессора 8088, имеет 16 разрядов, микропроцессор не имеет прямого доступа сразу ко всей памяти. Эта задача решается с помощью сегментирования. Организация сегмента Как уже отмечалось, память микропроцессора 8088 разделена на сегменты. Каждый сегмент содержит до 64 Кбайт (65 536 байт). Начальный адрес сегмента может быть установлен прикладной программой и всегда должен начинаться с 16-байтовых границ. Ба- зовый адрес сегмента получается делением действи- тельного физического адреса начальной ячейки сегмен- та на 16. Эти базовые адреса содержатся в сегментных регистрах, так что микропроцессор 8088 одновременно может отслеживать до четырех однозначно определяе- мых сегментов. На расположение сегмента не накла- дывается никаких специальных ограничений, кроме одного: он должен быть на границе 16 байт (т. е. фи- зический адрес начальной ячейки должен делиться на 16). Сегменты могут быть смежными, разделенными, перекрываться частично или полностью. На рис. 2.20 показано несколько возможных вариантов расположен ния сегментов в физической памяти микро-ЭВМ. По- сле того как сегмент определен, регистры-указатели могут быть использованы для адресного обращения к любому байту или слову в пределах этого сегмента» При такой организации адресации микропроцессор 8088 имеет прямой доступ только к 64 Кбайт памяти; а к миллиону байтов может адресоваться лишь при помощи регистров сегментов. Это один из недостач^ ков, присущих микропроцессорам семейства 8086/8088, по сравнению с другими 16-битовыми центральным^ процессами с прямой адресацией (например, микроб процессор Motorola MC68000, используя свой 32-раз* рядные внутренние регистры-указатели, может непо- средственно адресоваться к 16 млн. байт памяти), Так как центральный процессор 8088 имеет четыре регистра сегментов, в его памяти одновременно вы- деляются четыре адресуемых сегмента: командный сегмент, сегмент данных, дополнительный сегмент и 3 Л. Дао 05
ооооон юооон -► Сегмент А Сегмент в 20000Н-* Сегмент С Сегмент D Сегменты Айв перекрываются полностью Сегменты вив перекрываются Частично Сегменты А и С смежные Разделенные сегменты С и Е Сегмент Е Сегмент F ФИЗИЧЕСКАЯ ПАМЯТЬ Сегмент G Сегменты Е и F перекрываются полностью Сегменты Е и G перекрываются частично Сегменты FHG перекрываются частично ЛОГИЧЕСКИЕ СЕГМЕНТЫ Рис. 2.20. Физическое расположение сегментов в памяти. стековый сегмент; их базовые адреса находятся в ре- гистрах CS, DS, ES и SS соответственно. Командный сегмент представляет собой 64-кило- байтовую область памяти, содержащую машинные команды, которые выбираются устройством связи и выполняются исполнительным устройством. Содержи- мое указателя команд соответствует перемещаемому адресу очередной выполняемой в этом сегменте команды. Сегмент данных представляет собой 64-килобай- товую область памяти, обычно используемую для запоминания программных данных, переменных и констант. Дополнительный сегмент обеспечивает до- полнительные 64 Кбайт рабочей памяти. Стековый сегмент содержит стековую структуру емкостью до 64 Кбайт. Можно писать программы, которые для хранения команд, переменных и констант, а также для стека ис- пользуют один и тот же сегмент памяти. Это дости- гается назначением во все регистры сегментов одного 66
и того же базового адреса, так что все четыре сег- мента будут перекрывать одну и ту же область физи- ческой памяти. Сегментирование эффективно для развития мо- дульного построения программного обеспечения и структурного программирования, где большие про- граммы обычно разбивают на множество более мел- ких логических модулей. Организация памяти Мегабайтовую память микропроцессора 8088 мож- но рассматривать как последовательность байтов, на- чинающуюся с физического адреса 00000Н и закан- чивающуюся адресом FFFFFH (рис. 2.21). Команды и программные данные могут быть записаны побайтно Младшие адреса 7 0 4----Позиции разрядов Рис. 2.21. Пространство памяти МП 8088* 67 3*
«• Содержимое Адрес Шестнадцатеричное число 35Н 2800Н Шестнадцатеричное число 02K 2801Н В ячейке 2800Н хранится слово 0235Н Рис. 2.22. Формат 16-битового слова. или словами в любой из этих адресов. Для запоми- нания 16-битового слова и 32-битового двойного сло- ва используется следующее соглашение: 1. 16-битовое слово всегда заносится в память так, что старший байт находится в ячейке с большим но- мером. Например, если шестнадцатеричное число 0235Н записано в ячейку 2800Н, то при этом сама ячейка 2800Н содержит число 35Н, а число 02Н запи- сывается в ячейку 2801Н (рис. 2.22). 2. 32-битовое двойное слово может быть использо- вано в качестве указателя для адресации байта или слова в любом сегменте памяти ЭВМ. Младшее сло- во адреса указывает перемещаемый адрес, а старшее слово — начальную ячейку (базовый адрес) сегмента. Два байта каждого слова заносятся в память соглас- но условию записи 16-битового слова. Так как физи- ческий адрес определяется 20-битовым кодом, то ус- тройство связи генерирует действительный адрес, со- Вячейке 2802Нхранится двойное слово 04854000Н Рис, 2.23. Формат 32-битового двойного слова. 68
ответствующий адресу в сегменте, сдвигая базовый адрес (старшее слово) влево на четыре разряда и прибавляя к нему 16-битовый перемещаемый адрес (младшее слово). На рис. 2.23 показан 32-битовый указатель, заполненный шестнадцатеричным числом 04В54000Н, которое задает физический адрес 08В50Н (сегмент 04В5Н, сдвинутый на четыре разряда влево), что дает 4В50Н, плюс перемещаемый адрес (4000Н). Режимы адресации Операнды команд в программе, написанной на ма- шинном языке, могут храниться в регистре общего на- значения, в регистре сегмента или в ячейке памяти. Операнды также могут быть заданы и в форме кон-, стант, являющихся частью команды. В микропроцес-. соре 8088 на основе использования различных режи- мов адресации реализован ряд гибких методов выбор- ки операндов, определяющих производительность и гибкость семейства микропроцессоров 8086/8088, что позволяет им конкурировать с другими мини-компью- терными системами. Способы адресации МП 8088 используют регистро- вые и непосредственные операнды, прямую и косвен-, ную адресацию, косвенную адресацию со смещением, базово-индексную адресацию, базово-индексную адре- сацию со смещением, адресацию строковых данных и портов ввода-вывода. Регистровые операнды Команды, содержащие только регистровые операн- ды, являются наиболее компактными и выполняются быстрее всех остальных типов команд. Это происхо- дит вследствие того, что все операции с регистровыми операндами реализуются в исполнительном устрой- стве центрального процессора 8088 без обращений к памяти ЭВМ. Регистры общего назначения могут быть источниками операндов, их приемниками или теми и другими одновременно. Сегментные регистры могут использоваться только либо как источники, либо как приемники операндов. Например, машинная команда 20D0 (AND AL, DL) выполняет операцию логическо- го умножения AND содержимого регистров AL и DL 69
и помещает результат в регистр AL. Регистр DL ян-* ляется источником операнда, а регистр AL — прием- ником. Эта команда содержит только два байта и вы- полняется ЦП за три такта. Непосредственные операнды Непосредственные операнды — это постоянные данные, определяемые как часть машинной команды. Данные могут быть 8- или 16-битовыми. Непосред- ственные операнды могут быть выбраны достаточно быстро, так как ЦП может получить их прямо из оче- реди команд без обращения к памяти ЭВМ. Не- посредственные операнды могут быть заданы только как так называемые операнды-источники. Машинная команда более компактна, если приемником операнда служит аккумулятор (регистр AL или АХ). Например, машинная команда ЗС02(СМР AL,02) сравнивает содержимое регистра AL с шестнадцате- ричным числом 02 и устанавливает определенные флаги в соответствии с результатом сравнения. Непо- средственным операндом в этой команде является шестнадцатеричная константа 02. Эта команда зани- мает только два байта в памяти и может быть пол- ностью выполнена ЦП за четыре такта. Исполнительный адрес ЕА Перемещаемый адрес внутри сегмента, который ЦП 8088 вычисляет для операнда в памяти, называет- ся исполнительным адресом ЕА операнда. Так как сегмент памяти содержит до 65 536 однобайтовых ячеек, перемещаемый адрес может быть представлен :16-разрядным двоичным числом без знака, что обеспе- чивает возможность доступа к каждому байту сегмен- та. В тех случаях, когда для определения операнда в памяти в коде машинной команды требуются два байта, группа битов второго байта команды сообщает центральному процессору, как вычисляется 16-бито- вый исполнительный адрес необходимых операндов. Общий формат второго байта команды, считывающий операнды из памяти приведен на рис. 2.24. Поле Mod (рис. 2.24) используется для того, чтобы различать, соответствуют ли операнды команд регист- 70
рам ЦП или ячейкам памяти. Величина XX имеет четыре возможных двоичных значения: 00, 01, 10 и 11. Двоичное значение 11 в поле Mod указывает на то, что операндами машинных команд являются ре- гистровые операнды. Двоичные значения 00, 01 и 10 задают типы адресации соответственно с нулевым, одно- или двухбайтовым смещением. Смещение может быть 8-битовым числом со знаком или 16-битовым числом без знака, которое включается в машинную Mod • ft eg " • R M X X У У У 2 X 2 1------ -....————^.хХо'два бита, образующие поле Moi ----- у у у. три бита образующие поле Лед —*ZZZ‘Tph бита, образующие поле Rm Мо(ЬО0*нет байтов смещения ОЬодин знаковый байт смещения' | ModI Reg Rm ] । моЩ?нив 10-два байта смещения [16 бит без знака) | Mod Reg Rm Смещение Смешение Младший бай1 Старший байт Байт Слово Reg=? ООО AL АХ 001 CL СХ 010 DL DX 01 1 BL ВХ 100 АН SP 101 СН ВР 110 DH SI 111 ВН DI Rm- Байт Слове 000 BX4-SI ВХ 4-SH смещение AL АХ 001 BX + D1 BXlDI+смещение CL СХ 010 BP+SI BP + sif смешение DL DX 01 1 BP + OI BP + DIf смещение BL ВХ 100 S[ si ^-смешение АН SP 101 DI DI + смещение сн ВР 110 Direct ВР +смещение DH я 111 ВХ ВХ + смещение ВН DI Mod-00 Mod=01 HwMod=r!0 Mod=H Рис, 2,24. Общий формат адресного байта, 71
команду как ее часть и используется при вычислении исполнительного адреса. Обозначение YYY соответствует трем битам, обра- зующим поле Reg и используемым для указания ре- гистра, содержащего операнд. Поле Reg идентифици- рует 8-битовый регистр при байтовых операциях и 16-битовый регистр при работе со словами. В некото- рых командах эти биты используются также для идентификации группы, к которой относится машин- ная команда (например, команда AND в группе логи- ческих команд). Три бита ZZZ формируют поле Rm. Вместе с по- лем Mod оно используется для идентификации опре- деленного типа адресации. В команде допустима лю- бая комбинация в полях Mod и Rm, что обеспечивает многообразие режимов адресации памяти в семействе микропроцессоров 8086/8088. Прямая адресация Простейшим типом адресации является прямая; она не использует никаких регистров. Исполнитель- ный адрес ЕА берется непосредственно из 16-битового поля смещения машинной команды (рис. 2.25). Этот прямой адрес однозначно определяет байт или слово памяти, расположенные внутри сегмента. Прямая ад- ресация обычно используется для работы с простыми переменными или константами. В процессоре 8088 должно соблюдаться условие, согласно, которому пря- мой адрес не выходит за пределы сегмента данных. Поскольку в программах прямой адрес может опреде- ляться относительно любого из четырех доступных сегментов, для его модификации возможно примене- ние префиксных команд. При использовании прямой адресации в поле Mod содержится число 00, а в прле Rm — число 110. , ’ ’ ‘ Пусть, например., в программе, написанной на язы- ке ассемблера, регистр сегмента данных DS содержит 04В5Н, а байт 1400Н текущего сегмента данных — символическое имя LOCI. Машинная команда С606001402 (MOV LOCI,02) предписывает запомнить по перемещаемому адресу 1400Н сегмента данных шестнадцатеричное число 02. Поле смещения коман- ды содержит число 1400Н и интерпретируется как ис* 72
КОД операции Mod Reg Rm 16-разрядное смещение Исполнительный адрес ЕА Код операции 8-разрядное смещение указатель команд Исполнительный адрес ЕА Код операции 16-разрядное смещение Адрес сегмента Физический адрес Рис. 2.25. Структуры команд с прямой адресацией. А — перемещаемый адрес; .В — относительная адресация; С — абсолютная адресация. полнительный адрес ЕА. Действительный физический 20-битовый адрес, определяемый устройством связи, в этом случае соответствует 05F50H (4В50Н4-1400Н). Для прямой адресации используют два специаль- ных вида адресации: относительную и абсолютную. При относительной адресации поле смещения представляется 8-битовым числом со знаком. Испол- нительный адрес ЕА при этом определяется в резуль- тате сложения содержимого поля смещения и регист- ра указателя команд IP (рис. 2.25, В). Относительную адресацию используют для команд условных перехо- дов, таких, как JE (переход по равенству), JO (пере- ход по переполнению). При использовании относи- тельной адресации байт адресации (Mod/Reg/Rm) не требуется. При абсолютной адресации часть команды пред- ставляет собой 32-битовый указатель, определяющий физический адрес в памяти МП 8088. Младшее слово указателя рассматривается при этом как переме- щаемый адрес сегмента, базовым адресом которого 73
является старшее слово указателя (рис. 2.25, С). При абсолютной адресации байт адресации (Mod/Reg/Rm) также не требуется. Косвенная адресация I При такой адресации в качестве исполнительного адреса ЕА выступает содержимое базового или ин- дексных регистров (ВХ, SI или DI) (рис. 2.26). Вслед- ствие этого одна и та же команда может быть обращена к множеству различных участков памяти простым изменением содержимого базового или индекс- ного регистров, участвующего в косвенной адресации. При этом содержимое соответствующего регистра — ВХ, SI или DI — рассматривается как исполнительный адрес внутри текущего сегмента данных. Приклад- ные программы могут использовать дополнительные префиксные команды для переназначения испол- нительного адреса в другие сегменты памяти. С по- мощью адресации данного вида можно очень эффек- тивно организовать работу с различными участками компьютерной памяти. При косвенной адресации существует одно исклю- чение: для команд JMP (переход) и CALL (вызов процедур) в качестве исполнительного адреса может выступать содержимое любого из 16-битовых регист- ров общего назначения (АХ, ВХ, СХ, DX, SI, DI, ВР, SP). Пусть, например, в программе на языке ассембле- ра регистр DS содержит число 14С5Н. Если содержи- мым регистра SI является число 28FFH, команда С60410 (MOV[SI], ЮН) запоминает шестнадцатерич- ное число 10 в байте 28FFH сегмента данных. В этом Рис, 2.26, Косвенная адресация, 74
случае содержимое регистра SI служит исполнитель- ным адресом. Действительный физический 20-битовый адрес памяти, соответствующий перемещаемому адре- су 28FFH, при этом равен 1754FH (14C50H+28FFH). Косвенная адресация со смещением При такой адресации исполнительный адрес ЕА определяется как сумма величины смещения и содер- жимого одного из регистров — базового или индекс- ного (ВХ, BP, SI, DI) (рис. 2.27). Величина смещения может быть 8-битовым числом со знаком или 16-бито- вым числом без знака. При использовании регистров ВХ, SI или DI за исполнительный адрес принимается перемещаемый адрес текущего сегмента данных, ба- зовый адрес которого определяется регистром сегмент та данных DS. При использовании регистра ВР за исполнительный адрес принимается перемещаемый адрес текущего стекового сегмента, базовый адрес ко- торого содержится в регистре сегмента стека SS. По- скольку в прикладных программах могут быть исполь- зованы префиксные команды, существует возможность переприсвоения исполнительных адресов относительно других сегментов памяти. При использовании адресации данного типа поле Mod содержит двоичное число 01 лли 10 в зависимо- сти от того, является ли смещение 8- или 16-битовым числом. Поле Rm представляется двоичным числом 100, 101, 110 или 111 в зависимости от того, какой используется регистр —- SI, DI, ВР или ВХ соответ-» ственно. Рис. 2.27, Косвенная адр&адшз со смеадннеШ; 73
Рассмотрим пример, в котором регистр, сегмента стека содержит код 04В5Н. Если регистр ВР содер- жит число FF10H, машинная команда С6870245 (MOV [BP-f-02], 45Н) запоминает шестнадцатеричное число 45 в байте FF12H стекового сегмента. Величиной сме- щения является 8-битовое число со знаком (02), зани- мающее в команде третий байт. Исполнительный ад-, pec ЕА вычисляется в результате сложения величины смещения с содержимым регистра ВР (FF10H-J-02H-), Это соответствует физическому адресу 14А62Н (4B50H-FFF12H) памяти, который определяется ус- тройством связи. Поскольку при использовании ре- гистра ВР описанная адресация обеспечивает доступ к стековому сегменту, она очень удобна для работы с конструкциями данных, использующими стек. Базово-индексная адресация При такой адресации исполнительный адрес опре- деляется в результате сложения содержимого базо- вого регистра (ВХ или ВР) и индексного регистра (SI или DI) (рис. 2.28). Благодаря возможности измене- ния в процессе выполнения программы содержимого базового и индексного регистров базово-индексная ад- ресация является очень гибким, средством доступа к самым различным участкам компьютерной памяти, При использовании регистра ВХ исполнительный ад- рес определяется относительно сегмента данных с ба- зовым адресом, содержащимся в регистре DS. При использовании регистра ВР ^исполнительный адрес определяется относительно сегмент^ стека, базовый адрес которого содержится в регистре SS. Приклад- ные программы могут включать префиксные команды, дающие возможность переприсвоить исполнительный адрес относительно других сегментов памяти компью- тера. При базово-индексной адресации поле Mod пред- ставлено числом 00. Поле Rm представляется двоич- ным числом ООО, 001, 010 или 011 соответственно ис- пользуемой адресации [BXj^SI], [BX-j-DI], [BP-j-SI] или [ВР-j-DI]. Пусть регистр сегмента данных содержит код 04В5Н. Если регистры ВХ и SI содержат коды 1000Н и 1500Н соответственно, то машинная команда С60015 76
код операции Mod Reg Rm ВХ илиВР (+)- Исполнительный адрес ЕА SI или Dr Рис. 2.28. Базово-индексная адресация, (MOV [BX4-SI], 15Н) запомнит шестнадцатеричное число 15 в байте памяти, имеющем адрес 2500Н в сегменте данных. Исполнительный адрес вычисляет- ся суммированием содержимого регистров ВХ и SI (1000Н4-1500Н). Этот исполнительный адрес соответ- ствует действительному физическому адресу памяти 07050Н (4В50Н 4* 2500Н), устанавливаемому устрой- ством связи с магистралью. Базово-индексная адресация со смещением При такой адресации исполнительный адрес опре- деляется сложением содержимого базового регистра (ВХ или ВР), индексного регистра (SI или DI) и вели- чины смещения (рис.2.29). Как отмечалось выше, ве- личина смещения является-.частью команды и может быть 8-битовым числом со знаком или 16-битовым чис- лом без знака. За исполнительный адрес принимается перемещаемый адрес текущего сегмента данных или стекового сегмента в зависимости от того, какой из код операции Mod Reg Rm Смещение ВХ или ВР Исполнительный адрес ЕА SI илиР! Рис. 2.29, Базово-индексная адресация со смещением, 77
регистров используется — ВХ или ВР соответственно. Прикладные программы могут содержать префиксные команды, благодаря которым можно переприсвоить исполнительные адреса относительно других сегмен- тов памяти. При базово-индексной адресации со смещением поле Mod представляет собой двоичное число 01 или 10 в зависимости от того, определяется ли смещение 8- или 16-битовым числом. Поле Rm представляется точно так же, как и в случае базово-индексной адре- сации. Рассмотрим пример, в котором регистр сегмента стека содержит число 04С5Н. Если регистры ВР и SI содержат соответственно FF00H и 0010Н, то по ма- шинной команде С642200В (MOV [ВР SI],OBH) шестнадцатеричное число ОВ будет записано в ячейку FF30H стекового сегмента. Смещением в этом случае является 8-битовое число со знаком (шестнадцатерич- ное число 20Н). Исполнительный адрес равен сумме величины смещения и содержимого регистров ВР и SI (FF00H + 0010Н + 20Н) и соответствует действи- тельному физическому адресу памяти 14В80Н (4С50Н +’ FF00H + 0010Н Ц- 20Н), определяемому устройством связи с магистралью. Адресация строк данных 1 Строковые команды, такие, как MOVS (переслать строку), CMPS (сравнить строку), LODS (загрузить строку), STOS (записать строку) и SCAS (сканиро- вать строку), не используют ни один из рассмотренных выше типов адресации для выборки своих операндов. Содержимое индексных регистров (SI и/или DI) ис- пользуется для непосредственного указания требуемо- го участка памяти. Как следует из рис. 2.30, регистр SI всегда используется как указатель первого байта или слова строки-источника. Регистр DI используется как указатель первого байта или слова строки-приемника. Команда LODS предполагает использование регистра SI в качестве указателя источника. Команды STOS и SCAS исполь- зуют регистр DI в качестве указателя приемника. Команды MOVS и CMPS используют оба регистра SI и DI, Перемещаемый адрес, находящийся в регистре 78
Рис. 2.30. Строковая адресация. DI, всегда относится к текущему дополнительному сегменту. Для команд работ со строками данных мо- гут быть определены и префиксные команды, которые позволяют переприсвоить сегмент данных (для команд LODS, MOVS и CMPS) или дополнительный сегмент (для команды SCAS) другому сегменту, расположен- ному в любой части памяти 8088. При исполнении строковой команды увеличение или уменьшение содержимого регистров SI или DI опре- деляется состоянием (нулевое или единичное) флага направления. В зависимости от того, с чем работает команда — с байтом или со словом, — содержимое ин- дексных регистров увеличивается/уменьшается соот- ветственно на 1 или 2. Адресация порта ввода-вывода Э/от тип адресации обеспечивает доступ к устрой- ствам ввода-вывода (В/В), присоединенным к В/В области памяти 8088. Область В/В 8088 в допол- нение к мегабайтовой памяти содержит еще 65 Кбайт (рис. 2.31). Эта область В/В не является сегментируе- мой и может выполняться как отдельно, так и вместе со всей памятью 8088. В последнем случае уменьшает* ся мегабайтовая память на 64 К, но обеспечивается дополнительная гибкость при программировании, так как все рассмотренные ранее типы адресации могут обеспечить доступ к этой области. Каждый байт области В/В 8088 может быть назна* чен в качестве адреса однозначно определяемого пор< та В/В. Таким образом, область В/В может обслу* жить 64 К (65536) 8-битовых портов В/В. Данные могут передаваться между накопителем и любым портом В/В, адресуемом внутри .64-килобайтовой 79
Рис. 2.31. Адресация порта ввода-вывода. области В/В. Регистр AL используется для передачи байта, а регистр АХ — для передачи слова. Для адре- сации порта В/В существуют команды IN (ввести из порта) и OUT (вывести в порт). Если номер порта находится в пределах 0—255 (десятичных чисел), он может быть определен частью машинной команды; если же номер порта превышает 255, то для его хра- нения используют регистр DX. Работа со стековой памятью Для создания программ, полностью использующих все достоинства семейства микропроцессоров 8086/ 8088, программист должен быть знаком с концепция- ми работы со стековой памятью (стеком). Стек — это область памяти, специально выделен- ная для временного хранения параметров или про- граммных данных, необходимых для информационной связи программ и процедур. Запись и чтение данных в стеке основаны на принципе “первым пришел — по- следним ушел”. Как показано на рис. 2.32, в стек мо- я^ет быть загружен в определенной последовательно- сти ряд данных, которые впоследствии выбирают (считывают) из стека, но уже в обратной последова- тельности. Количество стеков в памяти ЭВМ ограни- чивается выделенной областью памяти. Максималь- ная емкость стековой структуры составляет 32 К (32 768) 16-битовых слов. Таким образом, стек может полностью размещаться в одном сегменте памяти. Поскольку существует только один регистр сегмен- та стека SS, хранящий начальный (базовый) адрес стека, в каждый момент времени можно обращаться только к одному стеку. Указатель стека SP исполь- зуется для хранения адреса последнего члена после- довательности (вершины стека), записанного в стек. 80
Старший адрес СГек Базовый адрес стека (указывается регистром SS) Вершина стека (указывается регистром SP) Младший адрес Последователь- ность данных, содержащая до 32ОЛ0В Рис. 2.32. Стек МП 8088. В большинстве случаев программист не должен следить за адресами действительного расположения программных данных в стеке. Такие команды, кай PUSH (записать данные в стек), POP (считать дан-? ные из стека), CALL к( вызов процедуры), RET (воз-, врат из процедуры) или IRET (выход из прерывания)', автоматически изменяют содержимое указателя стека SP так, чтобы отслеживать адрес вершины стека. Запись данных в стек называется операцией за- грузки. При загрузке в стек нового числа содержимое указателя стека уменьшается на 2 и указывает на но- вое положение вершины стека. Таким образом, новое число, загружаемое в стек, записывается в слове, пе- ремещаемый адрес которого в текущем сегменте стека с базовым адресом в регистре SS определяется ре- гистром БР.Шри операциях загрузки стек растет в направлении ^младших адресов сегмента стека. Дру- гими словами/ стек растет по направлению к базо- вому адресу сегмента стека. Съем данных, начиная с вершины стека, называет- ся операцией считывания. Когда из стека считывается чиело, содержимое указателя стека возрастает на 2, при этом полагают, что ячейка стека, содержавшая считанное число, считается свободной и готовой для последующего использования. Физически же содержи- мое ячейки компьютерной памяти после операции счи- тывания остается без изменений. 81
Старший «Ap€G младший адрес ,$р Область в W <а) стек пустой *i t $Р «2 •«з SP Следующая запись (^Считывание числа иэ стека <Ь) Запись числа • s стек, fi стек Рис. 2.33. Операции записи в стек и считывания из стека. На рис. 2.33 показаны обычные операции записи и считывания в микрокомпьютерах, базирующихся на МП 8088. Команды PUSH (записать данные в стек) и POP (считать данные из стека) позволяют организо- вать обмен данными между стеком и любым из Гб-бн- товых регистров общего назначения или ячейками па- мяти. Процедуры вызова и возврата, использующие стек Процедуры и подпрограммы позволяют многократ- но использовать фиксированную последовательность команд и данных различными программами, которые могут располагаться в любых участках памяти ком- пьютера. Для этого машинные команды CALL (вызов процедур) и RET (возврат из процедур) устанавли- вают стандартную форму передачи управления от программы к процедуре и возврат управления коман- де, следующей за командой CALL, после выполнения процедуры. Вызов и возврат внутри сегмента. Если физиче- ский адрес ячейки памяти, содержащей команду CALL, и начальная ячейка процедуры лежат внутри сегмента, то для передачи управления процедуре используется внутрисегментная команда CALL. Адрес возврата (адрес команды, следующей за командой CALL) загружается в текущий стек (определяемый указателем стека SP и регистром SS) (рис. 2.34). По- следней командой, выполняемой перед выходом из 82
Рис. 2.34. Внутрисегментная процедура: вызов и возврат, >, процедуры, должна быть команда RET (обозначае- мая в машинном коде шестнадцатеричным числом СЗ), по которой содержимое вершины стека (являющееся адресом возврата) считывается в указатель команд IP. Это обеспечивает передачу управления команде, следующей за командой CALL. В языке ассемблера процедура, вызванная внутрисегментным вызовом, определяется как NEAR. В процедурах NEAR ассемб- лер транслирует все команды RET в шестнадцатерич- ный машинный код СЗ (внутрисегментный возврат). Межсегментные вызовы и возвраты. Программа может передавать управление процедуре, находящей- ся в произвольном месте мегабайтовой памяти 8088, используя межсегментную команду CALL. Выполняя Рис. 2,35, Межсегментная процедура: вызов н возврат, 83
ее, процессор автоматически осуществляет следующие' операции (рис. 2.35): • указатель стека уменьшается на 2. Содержимое ре- гистра CS, базовый адрес текущего командного сег- мента, переносится в ячейку — вершину стека; • указатель стека вновь уменьшается на 2. В стек загружается перемещаемый адрес команды, следую- щей за командой CALL. Последней машинной командой, выполняемой пе- ред выходом из процедуры, вызванной межсегментной командой вызова, должна быть команда RET (соот- ветствующий шестнадцатеричный машинный код СВ). В языке ассемблера процедуры, вызываемые коман- дой межсегментного вызова, определяются как FAR. Команда RET в процедуре FAR транслируется в шест- надцатеричный машинный код СВ (межсегментный возврат). При осуществлении команды межсегментно- го возврата процессор 8088 автоматически выполняет следующие операции: • слово из вершины стека (определяемой указателем стека SP) считывается в указатель команд IP. Для определения новой вершины стека содержимое регист- ра SP увеличивается на 2; • слово, занимающее новую вершину стека, перепи- сывается обратно в регистр CS. Содержимое регистра SP вновь возрастает на 2. Таким образом управление передается команде, следующей за командой CALL. Вложенные процедуры вызова и возврата. Про- грамма может передавать управление процедуре, ко- торая в свою очередь может вызывать другую про- цедуру, расположенную в произвольном месте памяти компьютера. В этом случае вторая процедура опреде- ляется как вложенная процедура вызова. Благодаря использованию стека становятся возможными считы- вание всех адресов возвратов автоматически в тре- буемом порядке без каких-либо дополнительных программных сложностей и вставка произвольно чередующихся межсегментных и внутрисегментных вызовов без какой бы то ни было путаницы. Пример, представленный на рис, 2.36, демонстрирует типичную 84
(а) Стек до входа в процедуру (Ь) Стек после испол- нения 1-й команды CALL (межсег- ментной) (с) Стек после исполнения 2-й команды CALL (внутрисегментной) (d) Стек после исполнения Э й команды CALL (межсегментной} (е) Стек после меж- сегментного воз- врата, соответст- вующего Э-й команде CALL (f) Стек после внутрисегмент- ного возврата, соответствующего 2-й команде CALL (g) Стек после межсегментного возврата,соответ- ствующего 1-й команде CALL Рис, 2.36. Использование стека при встроенных процедурах. 85
Старший адрес Младший адрес Аргумент! Аргумент 2 Аргумент 3 Старый С5~ Старый IP Аргумент! Аргумент 2 Аргумент 3 Старый CS' Старый IP (а) Стек до входа (Ь) Б стек записали (с) Стек после {d) Стек после ... в процедуру три аргумента исполнения исполнения ( межсегмент- команды RET ной команды со смещением Рис. 2.37. Передача данных через стек. последовательность вложенных процедур вызова и возврата. Использование стека для передачи переменной. Хранение в стеке параметров или промежуточных ре- зультатов ведущей программы позволяет воспользо- ваться ими при выполнении определенной процедуры (программы). Во многих случаях операции, осуществ- ляемые процедурой, могут выполняться непосредствен- но над данными, расположенными в стеке. Для ука- зания данных, хранящихся в стеке, обычно исполь- зуется регистр ВР. Вместе с командой RET может быть определено смещение для обхода области пере- менных в стеке, что позволяет при возврате передать контроль команде, следующей за командой CALL (рис. 2.37). Прерывания работы микропроцессора ' Прерывания осуществляются аппаратными сред- ствами, которые заставляют микропроцессор приоста- новить выполнение текущей программы и отреагиро- вать на внешнее событие. Прерывания используются прежде всего для увеличения эффективности централь- ного процессора. В большинстве микрокомпьютеров семейства 8088 прерывания используют в качестве удобного средства, обеспечивающего доступ к аппара- турному оборудованию и утилитным программам, кон- тролируемым операционной системой. Прерывания дают возможность осуществлять операции ввода-вы- вода независимо от микропроцессора,
Поскольку быстродействие центрального процессо- ра 8088 значительно выше, чем устройств ввода-выво- да данных, желательно, чтобы ЦП имел возможность выполнять другие программы или осуществлять более полезные функции, чем постоянный контроль за со- стоянием присоединенных к нему периферийных уст- ройств. Когда же устройство ввода или вывода тре- бует обслуживания со стороны ЦП 8088, оно сооб- щает об этом микропроцессору формированием соответствующего запроса (сигнала), по которому может быть прервано выполнение текущей програм- мы ЦП. Поясним понятие прерывания на следующих при- мерах. Пример 1 Юлия разговаривает с подругой по телефону. Не- ожиданно раздается звонок в дверь. Перечислим ва- рианты возможной реакции Юлии: 1. Юлия игнорирует звонок в дверь и продолжает телефонный разговор. 2. Юлия немедленно прерывает разговор и отправ- ляется выяснять, кто звонит в дверь. Затем она возоб- новляет телефонный разговор. 3. Юлия продолжает разговор до тех пор, пока не находит подходящий момент прервать его. Затем она отправляется к двери. После этого она возобновляет телефонный^ разговор. Этот простой пример в точности представляет кон- цепции прерываний в микрокомпьютерной системе. Ситуация, описываемая словами “Юлия разговари- вает с подругой по телефону”, может рассматриваться как аналог микропроцессора 8088, обрабатывающего программу. Слова “звонок в дверь” — аналог требо- вания внешнего прерывания (другими словами, аппа- ратное устройство в микрокомпьютере сигнализирует ЦП, что оно нуждается в обслуживании микропроцес^ сором). Первый вариант реакции (“Юлия игнорирует зво- нок в дверь и продолжает телефонный разговор”) яв^ ляется аналогом ситуации, в которой ЦП игнорирует требование маскируемого прерывания и продолжает выполнять текущую программу. Это происходит тогда, когда флаг разрешения прерывания IF регистра флагов содержит 0 ^прерывание невозможно) и 87
маскируемые прерывания должны ждать обслужива- ния центральным процессором. Следующий вариант (“Юлия немедленно преры- вает разговор и отправляется выяснять, кто звонит в дверь”) аналогичен ситуации, когда ЦП 8088 приоста- навливает выполнение текущей программы и передает управление процедуре (программе) обслуживания прерываний. “Идти выяснять, кто звонит в дверь’* фактически описывает операции контроля и анализа, выполняемые процедурой обслуживания прерываний для удовлетворения требования на прерывание. “Во- зобновление телефонного разговора” — это тот мо- мент, когда процедура обслуживания прерываний воз- вращает управление прерванной программе. Дальней- шее выполнение программы продолжается от места прерывания. Третий вариант (“Юлия продолжает разговор до тех пор, пока не находит подходящий момент пре- рвать его”) можно рассматривать как аналог ситуа- ции, когда ЦП игнорирует требование маскируемого прерывания и продолжает выполнять текущую про- грамму (потому что флаг прерывания равен 0) до тех пор, пока не “натолкнется” на команду STI (установить прерывание), разрешающую ЦП выпол- нить маскированное прерывание. Сразу после того, как флаг разрешения прерывания переходит в состоя- ние 1, выполнение текущей программы приостанавли- вается, и управление передается процедуре обслужи- вания прерываний. Приведенный пример демонстрирует понятия мас- кируемых прерываний. Понятие немаскируемые пре- рывания поясним на следующем примере. Пример 2 Дежурный контролирует несколько видеоэкранов. Неожиданно раздается сигнал пожарной тревоги. Де- журный немедленно прекращает слежение за экрана- ми и вызывает пожарную службу. После того как вы- зов сделан, он возвращается к наблюдению за экра- нами. Этот простой пример в точности представляет кон- цепции немаскируемых прерываний. “Дежурный, кон- тролирующий несколько видеоэкранов”, может рас- сматриваться как аналог микропроцессора 8088, вы- полняющего программу. “Сигнал пожарной тревоги” 88
является аналогом требования немаскируемого прет рывания. Момент, когда ЦП должен немедленно при- остановить исполнение программы в ответ на требова- ние прерывания, не считаясь с положением флага разрешения прерывания, аналогичен ситуации, в ко- торой “дежурный немедленно прекращает слежение за экранами и вызывает пожарную службу”. “Сигнал пожарной тревоги” попросту не может иг- норироваться, так что не существует никаких других вариантов действий. Аналогично немаскируемые пре- рывания имеют в микрокомпьютере наивысший при- оритет и должны обслуживаться микропроцессором немедленно. При использовании микрокомпьютеров в монопольном режиме немаскируемыми прерываниями являются фактически “катастрофы”, такие, как ошиб- ки памяти или признаки сбоя питания. При коллек- тивном или мультипрограммном режимах пользова- ния микрокомпьютерами немаскируемыми прерыва- ниями могут быть сигналы системного времени на прекращение работы (например, для выполнения дру- гой программы) или сигнал прекращения выполнения программы, которая нарушила границы отведенной ей памяти (программые ошибки, приводящие к ее не- правильному выполнению). Прежде чем реагировать на прерывание, ЦП 8088 всегда завершает выполнение текущей машинной команды. Если машинная команда состоит из множе- ства тактов (например, команды умножения и деле: ния), требование на прерывание не выполняется до полной реализации машинной команды, и только по- сле этого оно будет опознано и обслужено микропро- цессором. Время, необходимое ЦП для того, чтобы отреагировать на требование прерывания, называется задержкой прерывания. Семейство микропроцессоров 8086/8088 имеет про- стую, но очень гибкую систему прерываний. Каждому прерыванию соответствует код, по которому его раз- личает микропроцессорГв системе может быть до 256 типов прерываний. Прерывания могут генерироваться требованиями устройств ввода-вывода, внешними по отношению к ЦП. Такого типа прерывания могут быть как немаскируемыми, так и маскируемыми. Прерыва- ния могут быть внутренними, возникающими в при- кладных программах при определенных условиях, 89
таких, как выполнение команды INTO (прерывание по переполнению), когда флаг переполнения OF равен 1. ЦП 8088 автоматически прерывает текущую рабо- ту в следующих случаях: • при делении на 0 (прерывание из-за ошибки деле- ния, тип 0); • при выполнении команды, когда флаг ловушки TF находится в состоянии 1 (пошаговый останов, тип прерывания 1); • при выполнении команды СС (шестнадцатеричный код) (прерывание в заданной точке программы). Внешние прерывания В систему, основанную на микропроцессоре 8088, может входить много соединенных с ним внешних устройств: матричная печать, телевизионный терми- нал, ЗУ на гибких дисках, клавишное устройство вво- да и др. Ряд из них требует “внимания” со стороны микропроцессора лишь на непродолжительный срок; остальное время они могут функционировать без по- мощи ЦП. Рассмотрим для примера клавишное устройство, предназначенное для ввода в микрокомпьютер команд, инструкций и данных. Хорошая машинистка способна вводить до 400 символов в 1 мин. Это означает, что новый символ может поступать от клавишного устройства в микрокомпьютер каждые 150 мс, а ми- кропроцессор 8088 должен каждые 150 мс считывать и запоминать символ, введенный с клавиатуры. Сам процесс считывания символа и занесения его в память занимает менее 10 мкс. В этом примере пре- имущества от использования прерываний очевидны. Каждый раз, когда нажимается клавиша, устройство выдает в ЦП 8088 требование на прерывание. Что бы ни выполнял микропроцессор, он приостанавливает свою работу и передает управление процедуре преры- ваний, обслуживающей клавишное устройство, кото- рая содержит команды, необходимые для считывания и занесения символа в компьютерную память. Когда эта процедура завершается, ЦП 8088 про- должает свою работу с того места программы, где его застало прерывание. Благодаря механизму преры- вания процессор тратит менее 10 мкс на считывание 90
Рис, 2.38. Линии прерывания МП 8088. каждого символа, вводимого с клавиатуры. А в тече- ние времени, оставшегося от 150 мс интервала между двумя символами, вводимыми с клавиатуры, он мо- жет выполнять другие действия. У микропроцессора 8088 есть три линии прерыва- ний, RESET, NMI и INTR (рис. 2.38), по которым внешние устройства могут передавать свои запросы на обслуживание со стороны ЦП. Запуск ЦП 8088. При появлении запроса в линии RESET ЦП 8088 выполняет следующие действия: • устанавливает флаг IF в нулевое состояние. Это приводит к невозможности выполнения маскируемых и пошаговых прерываний; © обнуляет регистры сегментов DS, ES и SS; © обнуляет указатель команд IP; © засылает шестнадцатеричное число FFFF в ре- гистр сегмента команд. ЦП 8088 начинает работу с обращения к ячейке памяти с адресом FFFFO. В большинстве микро- компьютеров, основанных на 8088, эта ячейка содер- жит команду JMP, которая передает управление про- цедуре инициализации, запускающей микрокомпью- тер. Векторы прерываний служат для идентификации процедур, необходимых для обслуживания требова- ния прерывания. Каждому внешнему требованию на прерывание может быть поставлен в соответствие код а
Таблица 2.1. Таблица векторов прерываний персонального ком> пьютера фирмы IBM SFFtf зге К згвн ЗГ8И 3F7H 3F4K Указатель типа 255 Указатель типа 254 Указатель типа 253 Старший эдрев. 020Н 01СН 0I8H 0I4H ШОН оосн 008Н 004Н ооон Указатель типа S _______(таймер) Указатель типа 7 (резерв? Указатель типа В _______(резерв)__________ Указатель типа S (выдача на экран) Указатель типа 4 (переполнение) Указатель типа 3 (один байт содержит ОСН) Указатель типа 2 (немаскируемые прерыва- ния по HMI)______________ Указатель типа f (пошаговый режим) Указатель типа О (ошибка деления) Новый базовый адрес сегмента команд Новый указатель команд 4-----16 разрядов —Младший адрес прерывания в пределах 0—255. В микрокомпьютере семейства 8088 существует 256 векторов прерыва- ний — по одному вектору на каждый тип прерывания. Таблица векторов прерываний (табл. 2.1) занимает 1024 младших байта памяти — ячейки с физическими 92
адресами от 0 до 03FFH —и имеет 256 входов в со- ответствии с количеством векторов. Каждый вход таблицы является указателем двой- ного слова, содержащего начальный адрес процедуры, которая обеспечивает обслуживание требования на прерывание данного типа. Старшее 16-битовое слово каждого входа таблицы содержит базовый адрес сег- мента, в котором находится процедура. Младшее 16-битовое слово каждого входа содержит перемещае- мый адрес процедуры обслуживания внутри сегмента. Так как каждый вход таблицы занимает четыре бай- та, первая ячейка входа для прерывания данного типа может быть определена простым умножением кода типа прерывания на четыре. Маскируемые прерывания. Это внешние требова- ния, поступающие в микропроцессор по линии INTR. С помощью маскируемых прерываний можно засин- хронизировать с ЦП наибольшее число внешних устройств. При активизации линии INTR микропро- цессор осуществляет различные действия, зависящие от состояния флага прерываний. Реализуемая в этот момент машинная команда всегда выполняется до конца, и только после этого начинается обработка за- проса на прерывание. Если флаг прерываний находится в нулевом состоя- нии (прерывание невозможно), то требование маски- руемого прерывания игнорируется и ЦП продолжает выполнять очередную команду текущей программы. Если состояние флага прерываний единичное (преры- вание разрешено), микропроцессор подтверждает тре- бование прерывания и передает управление той про- цедуре, которая должна обслужить поступившее тре- бование. Для выполнения требования маскируемого прерывания ЦП 8088 автоматически выполняет сле- дующую последовательность действий: • генерируется сигнал подтверждения внешнего пре- рывания. Этот сигнал сообщает внешнему устройству о том, что его требование признано; • считывается код прерывания, поступивший на ин- формационную шину с внешнего устройства; © содержимое регистра флагов записывается в ячей- ку памяти, адрес которой хранится в текущей вер- шине стека, определяемой регистрами SS и SP; 93
® обнуляется флаг прерываний, что предотвращает возможность выполнения любого вновь поступающего маскируемого прерывания; • обнуляется флаг ловушки TF, что делает невоз- можным пошаговый режим; • в указатель команд IP засылается 16-битовое сло- во, находящееся по физическому адресу (TYPE X 4) и (TYPE X 4)+ 1, где TYPE — код типа прерывания; • в регистр сегмента команд CS засылается 16-бито- вое слово, находящееся в ячейках памяти с физиче- ским адресом (TYPEX4)+2 и (TYPE X 4)-И 3. После выполнения операции “шесть” и “семь” управление передается процедуре обслуживания пре- рывания, содержащей машинные команды, необходи- мые для удовлетворения требования маскируемого прерывания. Одной из таких команд, содержащихся в процедуре обслуживания, является команда STI (установить прерывание), которая устанавливает флаг прерываний в единичное состояние и тем самым делает возможным выполнение новых требований, по- ступающих на INTR. Немаскируемые прерывания. Это внешние преры- вания, поступающие в микропроцессор по линии NMI. Обычно ими являются прерывания, сигнализирующие ЦП о внешних событиях особой важности (носящих катастрофический характер), таких, как отключение питания, сбой памяти и т. п. Немаскируемые прерыва- ния признаются микропроцессором всегда независимо от состояния флага прерываний. Таким образом, не- маскируемые прерывания имеют более высокий при- оритет по сравнению с маскируемыми. Им присвоен тип 2. Микропроцессор в ответ на требование нема- скируемого прерывания выполняет следующую после- довательность операций: • содержимое регистра флагов записывается в ячей- ку памяти (адрес которой хранится в текущей верши- не стека), определяемую регистрами SS и SP; • обнуляется флаг прерываний IF, что запрещает вы- полнение всех маскируемых прерываний; • обнуляется флаг ловушки TF, что делает невоз- можным пошаговый режим; • в стек загружается содержимое регистра сегмента команд CS; $4
• в стек загружается содержимое указателя команд IP; © 16-битовое слово из ячейки с физическим адресом 00008Н записывается в регистр IP; • 16-битовое слово из ячейки с физическим адресом 0000AH записывается в регистр CS. После выполнения операций “шесть” и “семь” управление передается процедуре обслуживания пре- рывания, содержащей команды, которые необходимо выполнить для удовлетворения требования, поступив- шего по линии NMI. Внутренние прерывания Эти прерывания обусловливаются прикладными программами, использующими команду INT. Они воз- никают также при некоторых условиях автоматически по сигналам в самом микропроцессоре, например при ошибках деления, переполнении и т. п. Внутренние прерывания аналогичны маскируемым, требования на которые поступают по линии INTR. Отличие заключа- ется только в том, что микропроцессор реагирует на запросы внутренних прерываний независимо от со- стояния флага прерываний IF. Код типа внутреннего прерывания может быть за- дан аппаратно либо представлен частью машинной команды. Если тип прерывания кодируется командой, то оно называется программным прерыванием. По- следние являются удобным средством проверки про- цедур прерывания, составленных для обслуживания внешних устройств. В персональном компьютере фирмы IBM програм- мные прерывания используются для реализации воз- можностей, предоставляемых системным программным обеспечением Basic I/O. Так, например, команда INT 16Н может быть использована для чтения символа из буфера клавишного пульта компьютера. Прерывание из-за ошибки деления. Микропроцес- сор 8088 автоматически генерирует прерывание типа 0 немедленно вслед за операциями DIV (деление) или IDIV (целочисленное деление) при возникновении следующих условий: • деление на 0; 95
'• если результат занимает больше 8 или 16 бит при делении соответственно 8- и 16-разрядных чисел. Адрес процедуры обслуживания прерывания ти- па 0 должен определяться ячейками памяти с физиче- скими адресами с 00000Н по 00003Н (табл. 2.1). Прерывание в точке. Прерывание в заданной точ- ке (месте) программы используется в основном для отладки программы при ее написании или тестирова- нии. Микропроцессор генерирует прерывание типа 3 немедленно по завершении выполнения команды INT 3 (ССН). Шестнадцатеричный машинный код СС ис- пользуется как команда прерывания в точке. Его можно вставить в любое место программы, где необ- ходимо прервать ее нормальное выполнение, и с по- мощью процедуры, обслуживающей это прерывание, отобразить критическую информацию, такую, как со- держимое регистров ЦП и ячеек памяти. Поскольку минимальная смысловая часть команды на языке МП 8088 занимает один байт, машинный код ССН может заменить любую команду, обозначая тем са- мым точку программы, в которой необходимо осуще- ствить прерывание. Пошаговое прерывание. Если флаг ловушки ре- гистра флагов находится в единичном состоянии, то сразу после выполнения текущей команды осуществ- ляется пошаговое прерывание. Этому прерыванию присвоен тип 1, и служит оно для покомандного вы- полнения программы. Прерывание типа 1 происходит автоматически после выполнения каждой машинной команды. При генерации прерывания микропроцессор автоматически загружает в стек содержимое регистра флагов (с единичным флагом ловушки), после чего обнуляет флаги ловушки и прерываний. Таким обра- зом, ЦП не переходит в пошаговый режим, пока вы- полняется сама процедура обслуживания прерывания, которая реализует различные диагностические опера- ции, такие, как отображение содержимого регистра ЦП или определенных ячеек памяти и т. п. Последней машинной командой в процедуре обслуживания долж- на быть команда ШЕТ (выход из прерывания). Этим восстанавливается прежнее единичное состояние фла- га ловушки, и по завершении следующей команды вновь генерируется прерывание типа 1. 95
В микропроцессоре 8088 нет команд, которые не- посредственно изменяли бы состояние флага ловушки. Но содержимое регистра флагов можно загрузить в стек, и состояние флага ловушки может быть измене- но с помощью модификации образа флага, находяще- гося в стеке. Таким образом, для инициации пошаго- вого режима могут быть использованы команды PUSHF (записать флаг в стек) и POPF (считать флаг из стека). 4 Л. Дао
Ill ЯЗЫК АССЕМБЛЕРА МИКРОПРОЦЕССОРА 8088 Язык ассемблера — машинный язык, записанный в символиче- ской форме. В то время как адреса и команды в машинном языке суть числа, язык ассемблера разрешает присваивать адре- сам памяти неповторяющиеся имена, состоящие из букв. Так 'как исполнительные устройства микропроцессоров 8086 и 8088 идентичны, то и язык ассемблера 8088 также оказывается иден- тичным языку ассемблера 8086 и является частью языка ас- семблера микропроцессоров 80186 и 80286, представляющих со- бой улучшенные модификации ЦП 8086. Программа, написанная на языке ассемблера 8088, может быть переведена (транслирована) на машинный язык с по- мощью программы, называемой ассемблером. Ассемблер, описан- ный в данной книге, являётся макроассемблером фирмы Micro- soft, используемым в персональном компьютере IBM с дисковой ‘операционной системой PC-DOS. Существуют и другие версии ассемблеров, приемлемые для семейства микропроцессоров 8086/8088, например ассемблер &SM-86, разработанный фирмой Intel Corporation, который ©ключает стандартные мнемонические команды, в том числе команды арифметических операций для чисел с плавающей за-: пятой в процессоре 8087. Несмотря на имеющиеся различия ме-. жду этими ассемблерами, их структуры и форматы команд язы- ков в значительной степени совместимы. Почему необходим язык ассемблера? Очень неудобно, утомительно, а иногда и трудно писать программы непосредственно на машинном язы- ке. Программист при этом должен выполнить массу кропотливых и рутинных операций: следить за рас- пределением ячеек в памяти микро-ЭВМ для записи команд или программных данных, чтобы затем можно ’было указать или определить эти адреса в программе; Помнить действительные машинные команды, пред- ставляемые в двоичном или в шестнадцатеричном коде, и связанные с ними способы адресации микро- 98
процессора; все данные в программе должны быть преобразованы в двоичный код для того, чтобы их можно было включить в программу на машинном язы- ке. Очевидно, что в результате такой работы может быть допущено много ошибок. Язык ассемблера — способ символической записи программ на машинном языке. Например, код машин- ной команды ЗС02 (шестнадцатеричный) может быть записан в символической форме на языке ассемблера как CMP AL,02 (эта команда сравнивает содержимое регистра AL с шестнадцатеричным числом 02). Таким образом, рутинные преобразования машинных кодов и данных в программе, перечисленные выше, можно максимально переложить на программу—ассемблер. Следовательно, основная цель ассемблера — трансля- ция программ, написанных на языке ассемблера, в машинный язык (машинные коды). Ассемблер следит за использованными ячейками памяти, с тем чтобы команды в программе имели ссылки на эти адреса в символическом виде, исполь- зуя имена и метки, заменяющие действительные зна- чения. Например, машинный код в шестнадцатерич- ной записи С606001201 может быть записан на языке ассемблера как MOV BYTE-COUNT,01, где BYTE-COUNT есть символическое имя адреса памяти 1200Н. Ассемблер допускает символическое представление констант и программных данных и осуществляет все необходимые их преобразования в соответствующие двоичные коды, вычисляет правильное число байтов или слов, необходимых для запоминания, и состав- ляет таблицу имен или меток и соответствующих им адресов. В языке ассемблера программист может написать процедуру (подпрограмму) как независимый и совер- шенно отдельный модуль. Ассемблер генерирует ин- формацию, необходимую для того, чтобы при загрузке объектного модуля процедуры в память микропроцес- сора он мог бы быть объединен с другими модулями, содержащимися в отдельных библиотеках программ. Изменение программ на языке ассемблера осу-, ществляется значительно проще, чем изменение про- грамм, написанных непосредственно на машинном языке. Например, вставка команд может изменить 4* 99
размещение адресов операндов или программных данных в памяти после места вставки. Поэтому, если программа написана в машинных кодах, программист должен изменить адреса всех операндов и програм- мных данных, размещенных после введенной коман- ды. Это очень утомительная и требующая больших затрат времени процедура, не говоря уже о том, что при ее выполнении возможны ошибки. Если вставка выполнена в программе, написанной на языке ассемб- лера, то перенумерация всех адресов операндов в па- мяти осуществляется автоматически в соответствии с новой структурой и размещением данных в изменен- ной программе. Ассемблер может выдать листинг (текст) исходной программы, который содержит первоначальные коман- ды языка ассемблера, соответствующие коды машин- ного языка и данных, результаты диагностики и/или сообщения об ошибках, которые формируются во вре- мя процесса трансляции. Поэтому многие програм- мные ошибки могут быть обнаружены предварительно на этапе трансляции. Листинг программ содержит символы, имена или метки, которые являются симво- лическими представлениями констант или програм- мных данных. Сам листинг представляет собой удоб- ный инструмент для анализа и исправления ошибок, которые могут. появляться во время отладки про- грамм. Формат программы Каждое отдельное так называемое утверждение языка ассемблера, как правило, транслируется в одну машинную команду. В большинстве языков ассембле- ра каждое утверждение имеет четыре однозначно определенных поля, которые описывают различные атрибуты транслируемой команды. Этими полями яв- ляются поле метки, поле операции, поле операндов и поле комментариев. Каждое поле может быть пере- менной длины и должно быть отделено от соседних одним или более пробелами. Первое поле используется для задания имени или символа ячейки памяти, содержащей команду, кон- станту или данные. Адрес этой ячейки содержится в 100
таблице и используется ассемблером для того, чтобы следующие команды могли ссылаться на это имя или символ. Если нет необходимости в использовании сим- волов, поле метки-может быть оставлено пустым. Поле операции должно быть обязательно задано в каждом утверждении. Операция всегда должна быть задана символически и может представлять собой не- которую совокупность машинных команд, директив- ные утверждения или макрокоманды. Машинные команды составляют большую часть кодов в ассемблерной программе. В поле операции может присутствовать префиксная команда. Напри- мер, команда STOSB (Store String Byte — записать строку байтов). может включать префиксную команду REP (Repeat — повторить). В этом случае команды REP STOSB могут быть закодированы в поле опера- ции одного ассемблерного утверждения. Директивные утверждения представляют типы опе- раций, обеспечивающие помощь ассемблеру в процес- се генерации действительных машинных кодов. Опера- ции определения констант и символьных строк, такие, как DB (Define Bytes — определить байты) или DW .(Define Words — определить слова), указывают ас- семблеру участки памяти, отводимые для размещения определенных типов констант или строковых симво- лов. Такие операции, как PROC (Procedure Defini- tion— определение процедуры), SEGMENT (Segment Definition — определение сегмента), ENDP (End Pro- cedure— конец процедуры) или ENDS (End Seg- ment—конец сегмента), используются для указания ассемблеру начальной и конечной точек процедуры или сегмента программы. Эти команды называются также директивными или псевдокодами, так как они не транслируются в действительные машинные коман- ды и используются только для передачи информации и указаний ассемблеру. Некоторые операции могут быть использованы для указания ассемблеру выпол- нить определенные процедуры, такие, как генерация листинга программы со ссылками на адреса и симво- лы в программе. Еще одной формой директивных утверждений яв- ляются макрокоманды, которые расширяются в одно или более ассемблерных утверждений соответсвенно некоторым предварительно определенным условиям. 101
Поле операндов содержит операнды, необходимые, для машинной команды, определенной в поле опера* ции. Операнды в поле разделяются запятыми. В тех случаях, когда в микро-ЭВМ на базе микропроцессо- ра 8088 заданы два операнда, первый из них всегда так называемый приемник, а второй операнд так на- зываемый источник. Первый операнд может содержаться в регистре общего назначения, регистре сегмента или ячейке па- мяти. Второй операнд может храниться в регистре об- щего назначения, регистре сегмента, ячейке памяти или в ПЗУ. Операнды представляются 8- или 16-раз- рядными числами. Имя сегментного регистра может быть использовано как сегментный префикс, который определяет, что перемещаемый адрес в поле операн- дов должен вычисляться относительно сегмента, за- данного сегментным префиксом. Допустимыми сег- ментными префиксами являются CS, DS, ES, SS, ко- торые обозначают командный сегмент, сегмент данных, дополнительный сегмент и стековый сегмент соответственно. ' Поле комментариев не используется в процедуре трансляции программы. Однако комментарии воспро- изводятся в листинге программы для' ее пояснений, Поле комментария ассемблерной команды должно на- чинаться с символа ; . Если точка с запятой — пер- вый символ в строке, она вся воспринимается как комментарий. Таким образом, утверждение языка ас- семблера в общем виде записывается в следующей форме (поля в скобках являются необязательными) 2 (Метка) (Префикс) Операция (Сегментный префикс) (Операнды) (Комментарий). Примеры типовых утверждений языка ассемблера для микропроцессора 8088 приведены на рис. 3.1. Эти примеры отчетливо показывают, что требования син- таксиса языка ассемблера для МП 8088 не такие жесткие, как в большинстве ассемблеров мини- и больших ЭВМ. Для облегчения чтения программы внутри каждого поля могут быть вставлены пробелы. Утверждение не должно начинаться с первой пози- ции строки. Однако максимальное число символов в строке ограничено 132 колонками. Метки и символи- ческие имена могут быть длиной до 31 символа, среди 102.
;Эта строка является строкой комментария MOV MOV NEXT-LINE; DX,[BX] AX, [SI] CLC косвенная адресация ;B записи можно свободно вставлять пробелы ;NEXT-LINE служит меткой этого предложения REP STOSB ;Команда с префиксом MOV ES:[BX + 2],AL Использование сегментного префикса в операндах MOV АХДВХ+ SI] ;Базово-индексная адресация ZERO DW 0 Директива DW (Определить слово) SPECIALS DW 1234h Использование строчных и прописных букв и специальных символов Рис, 3,1, Утверждения (предложения) языка ассемблера 8088,
которых могут быть буквы алфавита как верхнего, так и нижнего регистров, цифры от 0 до 9 включи- тельно и специальные символы: ? (знак вопроса), знак (подчеркивание), $ (знак доллара) и • (точ- ка). Константы с фиксированной запятой Макроассемблер распознает константы, представ- ленные в форме с фиксированной запятой в двоичной, восьмеричной, десятичной или шестнадцатеричной си- стемах счисления. Константы с фиксированной запя- той должны быть целочисленными и умещаться в шестнадцати битах. Таким образом, целочисленная константа может быть любым недробным числом ме- жду 0 и 65535. При определении отрицательного чис- ла макроассемблер будет транслировать его в стан- дартный дополнительный код. Целая константа может также кодироваться в десятичном виде или числом по другому основанию системы счисления. К послед- ней цифре числа добавляют буквы В, Q или Н, кото- рые указывают, что число записано в двоичном, вось- меричном или шестнадцатеричном виде соответствен- но. Восьмеричные числа могут заканчиваться буквой О вместо буквы Q. В определенных случаях для ясности программы десятичное число может тоже заканчи- ваться буквой D. Если используется шестнадцатерич- ная запись, первая цифра числа должна быть цифрой в диапазоне от 0 до 9. Примерами констант на языке ассемблера МП 8088 являются константы 100, 1257D, 11011В, 77Q, 1670, 4В5Н и 1FFFEH. Символьные константы Роль такой константы может выполнять любой символ, включая буквы алфавита, цифры и специаль- ные символы кода ASCII. Символьная строка длиной до 255 символов может быть помещена в одиночные кавычки, что указывает на инициализацию определен? ной области памяти ЭВМ. Макроассемблер занесет слова кода ASCII, соответствующие каждому знаку в строке, в отведенную область памяти. Когда символь- ные константы используются как непосредственные 104
операнды, они должны быть одиобайтовыми или двух- байтовыми соответственно для команд работы с бай- тами или словами. Например, команда СМР АХ, 'АВ* транслируется в шестнадцатеричную последователь- ность 3D4241 в машинном языке. Поскольку эта ко- манда 16-битовая, символьная константа должна быть двухбайтовой. Константы в форме с плавающей запятой Микропроцессор 8088 не имеет аппаратно-реализо- ванных команд для операций над числами с плаваю- щей запятой. Однако в языке ассемблера МП 8088 числа с плавающей запятой могут быть определены либо в стандартной, либо в экспоненциальной форме. Примеры констант в форме с плавающей запятой: 123.45 и 27.25Е-2. Макроассемблер преобразует эти числа в двоичные для того, чтобы с ними могли рабо- тать другие процессоры, такие, как процессор цифро- вой обработки информации 8087. Определение данных и распределение памяти Существует несколько директивных утверждений, которые могут управлять резервированием памяти и занесением в выделенные ячейки констант с фиксиро- ванной запятой, символов или чисел с плавающей за- пятой. Распределение памяти может осуществляться и без занесения каких-либо данных в ячейки. Дирек- тивами для определения данных или резервирования области памяти являются: DB (Define Byte — опреде- лить байт), DW (Define Word — определить слово), DD (Define Doubleword — определить двойное слово), DQ (Define Quadword — определить четыре слова) и DT (Define Tenbyte — определить десять байтов). Использование этих директив для резервирования и инициализации ячеек памяти в языке ассемблера МП 8088 поясняется на рис. 3.2. Знак вопроса в поле операндов указывает, что ячейка только резервирует- ся;^ для повторения одних и тех же начальных значе- ний в поле операндов может присутствовать параметр 105
Переме- таемые адреса Машинные коды Утверждение языка ассемблера 8082 0000 0001 0А ALPHA DB 17 BETA DB 10 ;Однобайтовйя ячейка содержит 17Н ;Однобайтовая ячейка содержит 0002 0007 00 ОА 13 2F 43 GAMMA DB ?? DELTA DB 0,10D,23Q,2FH/C'; Пять байтов ? ;Отсутствует начальное значение 0008 0012 0014 20 20 20 20 20 EPSI DB 20 20 20 20 20 64 00 ONE DW 7F 00 TWO DW 10 DUP(20H) Десять значений "20Н" 100 Двухбайтовая величина 177Q Двухбайтовая величина 0016 00 00 FA 04 2E THREE DW OF 4F 4E 0,1274,0F2EH/N0' ;Четыре двухб штовые величины 1 ;(восемь байтов) 001Е 41 42 43 44 41 FOUR DB 42 43 44 41 42 43 44 3 DUP ('ABCD') Двенадцать байтов 002А 00 40 B5 04 DOUBLE DD 04В54000Н Двойное слово (четыре байта) 002Е 19 04 IE 81 FLOAT DD 1.2345 ;3апись в форме с плавающей ;запятой 0032 68 45 00 12 00 QUAD DQ 00 00 00 12004568Н Досемь байтов 003А 00 00 00 00 00 TEN DT 12 34 56 78 90 1234567890 Десять байтов Рис. 3.2. Задание данных и распределение памяти
Способы адресации В макроассемблере применимы все способы адре- сации микропроцессора 8088. Он генерирует соответ- ствующие формы машинных команд, основанные на информации, определенной в операндах. Ассемблер выполняет также проверку правильности использова- ния операндов команд для выявления ошибок кодиро- вания. Сообщение об ошибке генерируется, например, если записана операция сложения содержимого 8- и 16-битового регистров или операция между содержи- мым регистра сегмента и константой. В определенных ситуациях, например когда в операндах используется константа или смещение, ассемблер может вычис- лить необходимое для их размещения число байтов памяти. В языке ассемблера МП 8088 любые ссылки в ква- дратных скобках на регистры базы (ВХ или ВР) или индексные регистры (SI или DI) интерпретируются как один из косвенных или базово-индексных адресов. При этом ассемблером определяется соответствующий исполнительный адрес ЕА операнда. Ниже приведены примеры кодирования команд программы доступа к регистрам и операндам в памяти на языке ассемблера МП 8088 с использованием макроассемблера. 1. Регистровые операнды, 8-битовые (AL, BL, CL, DL, АН, ВН, CH, DH) или 16-битовые (АХ, ВХ, СХ, DX, SI, DI, ВР, SP, CS, DS, ES, SS), могут быть за- даны так, как это показано на рис. 3.3. 2. Непосредственные операнды в виде констант с фиксированной запятой могут задаваться в двоич- ном, восьмеричном, десятичном, шестнадцатеричном представлении или в виде строки символов, как это показано на рис. 3.4. Для согласования с длиной операнда-приемника ассемблер генерирует соответ- ствующие константы (один или два байта). 3. В языке ассемблера МП 8088 смысловое имя, характеризующее задачу, для которой написана про- грамма, обычно используется в качестве метки или символического имени для адресации ячейки памяти. Все метки или символические имена ячеек памяти, ко- торые могут быть определены или на которые воз- можны ссылки в программе, ассемблер сохраняет в таблице имен. 107
Переме- щаемые адреса Машинные коды Утверждения языка ассембера 8088 0000 02 СЗ ADD AL,BL ;8-разрядные операнд-источник и операнд-приемник 0002 2В С2 SUP AX,DX ;16-разрядные операнд-источник и операнд-приемник 0004 33 С9 XOR CX,CX ;Один и тот же регистр для записи операнда-источника и ;операнда-приемника 0006 8С D8 MOV AX,DS ;Операндом-источником является сегментный регистр 0008 8Е С1 MOV ES,CX ;Сегментный регистр в качестве операнда-приемника 000А FE СВ DEC BL ;8-разрядный операнд ооос 48 DEC AX ;16-разрядный операнд z GOOD 06 PUSH ES ;Операнд задан в сегментном регистре- Рис. 3.3. Примеры кодирования регистровых операндов.
Перемешав- Машинные Утверждения языка ассемблера 8088 мыр ялпега копи г *** г 0000 0002 0005 0008 04 ОС В9 6Е 00 ADD MOV CMP MOV AL ,12 CX,110 AX, —5 DX,-6D ;8-pазрядная десятичная константа ;16-разрядная десятичная константа Десятичная запись Десятичная переменная 3D ВА FB FA FF FF 8 000В 0D 0D 00 OR AX,1101B Двоичная запись 000Е 81 CD 2F 00 OR BR,057Q ;Восьмеричная запись 0012 ВЗ ОС MOV BL, 140 ;Восьмеричная переменная 0014 ВВ FF 0Е MOV BX,0EFFH ;Шестнадцатеричная запись 0017 ЗС 41 CMP AL/A' ;8-разрядная символьная константа 0019 81 F9 42 41 CMP CX/AB' ;16-разрядная символьная константа Рис, 3,4. Примеры кодирования непосредственных операндов,
Каждое имя для однозначности определения пред- ставляемой им ячейки памяти имеет по крайней мере три атрибута: сегмент, перемещение и тип. Сегмент идентифицирует область памяти емкостью 64 Кбайт, содержащую именованную ячейку. Этим сегментом может быть один из четырех сегментов, адресуемых регистрами CS, DS, ES и SS. Перемещение описы- вает перемещаемый адрес именованной ячейки памя- ти относительно начала сегмента. Тип обычно указы- вает размер области памяти по относительному адре- су. Например, тип может иметь значение 1, 2 или 4, что означает размещение по указанному адресу байта, слова или двойного слова. Тип указывает также, где должны быть записаны метка или символическое имя ячейки памяти: только в текущей программе (локаль- ное имя), в других процедурах (внешнее имя) или во всех программах и процедурах (глобальное имя). Во многих ассемблерных программах определение метки или символического имени обычно откладыва- ется на конец программы. Если операнд команды ис- пользует метку или имя до их определения, то ассемб- леру необходимо указать тип символического имени (так как до тех пор, пока не определен тип, ассемблер не знает разрядности операндов, что необходимо для генерации соответствующих машинных кодов). Макроассемблер имеет операторы BYTE PTR, WORD PTR и DWORD PTR, позволяющие точно ука- зать ассемблеру размер памяти, отводимой операн- дам, на символические имена которых имеются ссыл- ки: байт, слово или двойное слово соответственно. При прямой адресации символическое имя, пред- ставляющее ячейку памяти, транслируется в 1б-бито- вый перемещаемый адрес для формирования поля смещения команды. Перемещаемый адрес всегда бе- рется относительно сегмента данных, базовый адрес которого определяется регистром DS. Однако можно приказать ассемблеру генерировать код сегментного префикса, в результате чего относительный адрес бу- дет определяться относительно командного, дополни- тельного или стекового сегментов. Несколько приме- ров кодирования команд, использующих прямую ад- ресацию, приведено на рис. 3.5. В том случае, когда команда ассемблера является командой условного или безусловного перехода, J10
Пере лещае- мые адреса Машинные коды Утверждения языка ассемблера 8088 0000 0000 0001 0003 ?? ?? ?? С6 06 00 00 7В EXTRN NEW:WORD ;NEW является 16-разрядным ;внешним именем ALPHA DB ? ;ALPHA — 8-разрядное локальное ;имя BETA DW ? ;ВЕТА—16-разрядное локальное ;имя MOV ALPHA, 123 ;Однобайтовая операция 0008 000Е С7 06 01 С6 06 2F 00 00 00 F4 00 MOV ВЕТА,ОН Двухбайтовая операция (опера- ;ция со словом) MOV BYTE PTR GAMMA,— 12 ;Задание типа имени GAMMA 0013 С7 06 30 00 78 12 MOV WORD PTR DELTA, 1278H ;3адание типа имени DELTA 0019 2Е С7 06 —— —— 01 00 MOV WORD PTR CS:NEW,01 ;Сегментным префиксом явля- ется CS 0020 26 С7 06 01 00 MOV WORD PTR ESrNEW,01 ;Сегментным префиксом ;является ES 0027 002Е 002F 0030 36 С7 06 СЗ ?? ?? ?? 01 00 MOV WORD PTR SS:NEW,01 ;Сегментным префиксом ;является SS RET GAMMA BD ? ;GAMMA — однобайтовое ;локальное имя DELTA DW - ;DE LT A — двухбайтовое ;локальное имя Рис* ЗД Примеры кодирования, использующие различные типы прямой адресации,
исполнительный адрес метки или символического име-* ни, задаваемых в операндах, будет использоваться для генерации величины смешения, как требуется в режи- ме относительной адресации, или для генерации 32-битового указателя физического адреса при абсо- лютной адресации. Примеры кодирования команд пе- рехода приведены на рис. 3.6. 4. Макроассемблер полностью обеспечивает режим косвенной и базово-индексной адресации со смеще- нием или без него. При использовании регистра ВР исполнительный адрес всегда берется относительно стекового сегмента в памяти ЭВМ. В противном слу- чае исполнительный адрес берется относительно сег- мента данных. Чтобы переназначить исполнительный адрес в любой из четырех сегментов памяти, исполь- зуется сегментный префикс, который может быть за- дан как часть операндов команд. Как показано на рис. 3.7, кодирование операндов в этой группе режи- мов адресации осуществляется очень гибко. Символическое имя может использоваться также для представления величины смещения в операндах. В тех случаях, когда операнды команд не определяют явно, какая операция будет выполнена — 8- или 16-би- товая, ассемблеру должны быть заданы операторы типа BYTE PTR или WORD PTR. 5. Строковые команды, такие, как LODS, STOS, MOVS, CMPS или SCAS, не указывают точно, будут операции выполняться с байтами или словами. Чтобы машинные коды генерировались правильно, в языке ассемблера МП 8088 к строковой команде добав- ляют букву В (байт) или W (слово). Несколько примеров записи строковых команд приведено на рис. 3.8. Префиксные команды, такие, как LOCK, REP, REPE или REPNE, могут записываться в утвержде- нии языка ассемблера вместе со строковой командой. Сегментный префикс может быть задан вместе с лю- бой строковой командой, кроме STOS, чтобы избе- жать искажения информации в ячейке памяти, в ко- торой нельзя изменить сегмент данных, содержащий ячейку памяти, адресуемую регистром SI. В особом случае, при использовании команды STOS, перемещае- мый адрес, заданный регистром DI, берется относи- тельно дополнительного сегмента. 112
Переметае- мые адреса Машинные коды Утверждения языка ассемблера 8088 0000 EXTRN FAR_PROC:FAR ;Имя процедуры типа FAR 0000 EXTRN NEXT-SYMBOL: WORD 0000 74 0D JE NEXT-LINE Относительная адресация 0002 ЕВ ОС JMP SHORT NEXT_CHAR Относительная адресация 0004 ЕА - JMP FAR PTR NEXT-SYMBOL Абсолютная адресация 0009 9А - CALL FAR-PROC Абсолютная адресация . 000Е СЗ RET 000F 90 NEXT-LINE: NOP 0010 90 NEXT-CHAR:NOP Рис. 3.6. Примеры кодирования, использующие адресацию относи!ельного и абсолютен о тиов.
Переме- щаемые коды Машинные коды Утверждения языка ассемблера 8088 0000 02 17 ADD DL,[BX] косвенная адресация •«регистра ВХ с использованием 0002 13 47 02 ADC АХДВХ + 02] ;Косвенная адресация со смещением 0005 ЗВ 9С 21 00 CMP BX,FLAG[SI] косвенная адресация со смещением 0009 С6 04 02 MOV BYTE PTR[SI],02 косвенная адресация регистра SI с использованием ооос 26 F7 15 NOT WORD PTR ES : [DI] ;Косвенная адресация префиксом с сегментным 000F 8В 6Е 02 MOV ВРДВР + 02] косвенная адресация со смещением, ;использующая регистр ВР 0012 0А 46 00 OR AL,[BP] косвенная адресация с использованием регистра ВР 0015 0017 02 30 84 0В ADD DH,[BX+ SI] TEST[BP + DI],CL ;Базово-индексная адресация ;Базово-индексная адресация 0019 36 80 21 01 AND BYTE PTR SS : [BX + DI],01 ;Базово-индексная адресация с сегментным префиксом 001D 0021 22 80 90 47 12 AND AL,[BX + SI + 1247H] FLAG:NOP ;Базово-индексная адресация со смещением Рис. 3.7. Примеры кодирования, использующие косвенную и базово-индексную адресации.
Переме- ! щаемые 1 коды Машин- ные коды Утверждения языка ассемблера МП 8088 0000 АС LODSB Загрузить строку (байтов) 0001 AD LODSW Загрузить строку (слов) 0002 А4 MOVS В ;Переслать строку (байтов) 0003 А5 MOVSW ;Переслать строку (слов) 0004 АА STOSB ;3аписать строку (байтов) 0005 АВ STOSW ;3аписать строку (слов) 0006 F3/AB REP STOSW ;Строковая команда (Записать строку слов) с префиксом REP 0008 F3/A6 REPE CMPSВ ;Строко.вая команда с префиксом REPE 000А F2/AF REPNE SCASW Строковая команда с префиксом REPNE Рис. 3.8. Примеры использования строковой адресации.
Сегменты и процедуры Программы, написанные на языке ассемблера МП 8088, могут быть разделены на один или несколько сегментов. Каждый логический сегмент имеет един- ственным образом определяемое имя и однозначно отображается в сегментах памяти при загрузке про- граммы для ее выполнения. Для определения началь- ной и конечной ячеек логического сегмента в макро- ассемблере предусмотрены директивы SEGMENT и ENDS (End Segment — окончание сегмента). Все команды и/или данные, размещенные между директи- вами SEGMENT и ENDS, образуют логический сег- мент программы. Хорошо составленная и документированная про- грамма на языке ассемблера подразделяется на не- сколько независимых сегментов. Часть программы, со- держащая коды машинных команд, объединяется в кодовый сегмент. Переменные, константы, таблицы и другие данные группируются в другой программный сегмент, эквивалентный сегменту данных. Стековая область для хранения промежуточных данных или связей процедур образует третий сегмент. Четвертый сегмент, который может рассматриваться как допол- нительный сегмент программы, используется для за- поминания выходных данных. Пример типовой программы на языке ассемблера МП 8088, содержащей четыре логических сегмента, приведен на рис. 3.9. Директива ASSUME использует- ся для указания ассемблеру, какому сегменту принад- лежит тот или иной сегментный регистр. Возможно размещение всей программы в одном сегменте памя- ти. В этом случае директива ASSUME указывает ас- семблеру, что все сегментные регистры адресуют один и тот же сегмент (рис. 3.10). Иногда бывает трудно писать или хранить боль- шие программы на языке ассемблера. Для ясности и удобства документирования большие логические сег- менты в программе следует разбить, если это возмож- но, на несколько менее крупных процедур. Процедура должна содержать ту часть кодов сегмента, которая используется для выполнения независимых или специ- альных функций. В процедуру желательно оформлять последовательность кодов, которая неоднократно 116
Приведенная программа содержит четыре логических ;сегмента: командный сегмент с символическим именем MAIN ;сегмент данных с символическим именем DATA-SEG дополнительный сегмент с символическим именем ;EXTRA-SEG ;стековый сегмент с символическим именем STACK-SEG MAIN SEGMENT ASSUME CS : MAIN,DS : DATA.SEC, ; ES:EXTRA-SEG,SS:STACK-SEG ;Начало программы MOV AX;DATA-.SEG MOV DS,AX MOV AX,EXTRA-SEG MOV ES,AX MOV AX.STACK-CEG MOV SS,AX MOV SP,OFFSET TOP-OF-STACK :B этой области должны быть записаны команды основной программы MAIN ENDS Начало сегмента данных DATA^SEG SEGMENT BYTE DB 25 DUP(O) DATE-SEG ENDS Начало дополнительного сегмента EXTRA-SEG SEGMENT DATA-AREA DB 2000 DUP(O) EXTRA-SEG ENDS Далее следует стековый сегмент STACK-SEG SEGMENT DB 64 DUP('STACK ') TOP-OF_STACK DW ? STACK-SEG ENDS END Рис. 3.9, Программа на языке ассемблера 8088 с четырьмя логическими сегментами» 117
co MAIN SEGMENT ASSUME CS : MAIN,DS : MAIN.ES : MAIN, SS : MAIN MOV AX,CS MOV DS,AX ;Совместить (перекрыть) командный сегмент и сегмент данных MOV ES,AX ;Совместить командный и дополнительный сегменты MOV SS,AX ;Совместить командный и стековый сегменты LEA SP, TOP _OF-.STACK » Далее следуют команды программы. DW 25С DUP(O) TOP_OF_STACK DW О MAIN ENDS [Область стека Рис. 3.10. Программа на языке ассемблера 8088 с одним логическим сегментом,
MAIN SEGMENT ASSUME CS : MAIN,DS : NOTHING,ES : NOTHING, SS :NOTHING •Процедура CONVERSION включает в себя три другие процедуры ;CONASC1, CONASC2, и CONVERT, выполняющие преобразование ;шестнадцатеричного числа в код ASCII ;Все эти процедуры определены в сегменте MAIN CONVERSION PROC NEAR ;Первая процедура — CONASC1 CONASC1 PROC NEAR MOV AH,AL преобразовать содержимое AL в 2 байта кода ASCII CALL CONVERT XCHG AL,AH MOV CL,4 SHR AL,CL CALL CONVERT RET CONASC1 ENDP ;Вторая процедура — CONVERT CONVERT PROC NEAR AND AL,0FH CMP AL,9 JBE NEXT ADD AL,7 NEXT: ADD AL,0B0H RET CONVERT ENDP ;Третья процедура — CONASC2 CONASC2 PROC NEAR преобразование содержимого AX в 4 байта кода ASCII. MOV DX.AX CALL CONASC1 XCHG AX,DX XCHG AH,AL CALL CONASC1 RET CONASC2 ENDP CONVERSION ENDP MAIN ENDS Рис. 3.11. Внутрисегментные процедуры,) 119
вызывается командами CALL'. Блок данных, имеющий важное значение для прикладной программы, также следует разбить на процедуры с именами, отражаю- щими их сущность таким образом, чтобы программа была более простой и понятной. Макроассемблерные директивы PROC (Procedu- res— процедуры) и ENDP (End Procedures—конец процедур) предназначены для указания начала и окончания процедуры. Вместе с директивой PROC мо- гут быть заданы параметры FAR и NEAR, которые позволяют ассемблеру следить за тем, является ли процедура внутрисегментной или межсегментной (рис. 3.11). Распространенные ошибки программирования на языке ассемблера Открытая процедура или открытый сегмент Для каждой директивы PROC (Procedure Defini- tion) должна быть записана соответствующая дирек- тива ENDP (End Procedure). Если директива ENDP пропущена или имя процедуры в записи ENDP запи- сано неверно, макроассемблер генерирует предупре- ждающее сообщение, что процедура не закрыта над- лежащим образом. Точно также директива ENDS |(End Segment) должна быть задана для каждой ди- рективы SEGMENT (Segment Definition)-. Если утвер- ждение ENDS пропущено или имя сегмента в нем указано неверно, генерируется предупреждающее со- общение, что сегмент открыт. Наиболее вероятной причиной ошибки является неверная запись име^и сегмента или процедуры. SAMPLE SEGMENT Неверные записи PROC1 PROG NEAR PROC AND RET AL,00 а) Нет соответствующей директивы ENDP для процедуры PR0C1 (Имя PR0C1 в записи ENDP указано невер- ENDP но) PROC2 PROG OR NEAR б) Нет соответствующей директивы ENDS AL,0FFH 120
PR0C2 PET ENDF END Данный вариант является правильной записью предыдущего примера: SAMPLE SEGMENT PROC1 PROG NEAR AND AL,00 RET PROC1 ENDP SAMPLE SEGMENT PROC2 PROC NEAR OR AL.OFFH RET PROC2 ENDP SAMPLE ENDS END Неопределенные символические имена Неопределенные символические имена представ- ляют собой тип ошибок, которые наиболее часто встречаются при программировании. Ассемблер гене- рирует сообщение о такой ошибке, если имя не опре- делено в поле метки какого-нибудь утверждения ас- семблерной программы. Если имя не является локаль- ным (оно определено в другой программе), то его следует определить как внешнее имя директивой EXTRN (External — внешний). Неправильная запись имени является наиболее вероятной причиной такой ошибки, особенно в тех случаях, когда используемые шестнадцатеричные константы записываются без на- чальной цифры. SECOND PROC NEAR Неверные записи MOV AX,CS MOV DS,AX а) Неопределенное имя VALUE MOV ES,AX MOV AX,VALUE б) Некорректная шестнад- цатеричная запись MOV BX,FFF2H 121 Ассемблер воспринимает
MOV CX, CODEI число FFE2H как имя MOV DX.CODE2 MOV SI,CODE в) Неопределенное имя RET CODE CODE1 DW 100 CODE2 DW 200 CODE3 DW 300 SECOND ENDP Ниже приведен образец правильной записи преды- дущего примера. Символическое имя VALUE пред- ставлено 16-битовым внешним именем. Шестнадцате- ричная запись числа начинается с цифры и непра- вильно записанное имя CODE заменено на верное CODE3. SECOND PROC NEAR EXTRN VALUE: WORD MOV AX,CS MOV DS,AX MOV ES,AX MOV AX, VALUE MOV BX.0FFE2H MOV CX, CODEI MOV DX.CODE2 MOV RET SI,CODE3 CODEI DW 100 CODE2 DW 200 CODE3 DW 300 SECOND ENDP Повторное определение символического имени Макроассемблер формирует сообщение об ошибке повторного определения символического имени в тех случаях, когда одно и то же имя или метка два и бо- лее раз повторяются в поле метки ассемблерных ут- верждений программы. CASEl: DEC AX Неверные записи LOOP CASEl AND DX,BX CMP DX,00 CASE1: JE CASEl Имя CASEl уже было определено 122
Правильная запись предыдущего примера: CASE1: DEC AX LOOP CASE1 AND DX.BX CMP DX,00 CASE2: JE CASE1 Ошибки выполнения программы как результат ошибок программирования В языке ассемблера МП 8088 предусмотрена воз- можность определения меток и символических имен в конце программы, чтобы все используемые имена в программе могли быть сгруппированы в одном сег- менте или процедуре. Такая практика программиро- вания делает программы более доступными для пони- мания, так как определение всякого имени в програм- ме можно быстро найти в процедуре или в сегменте, находящихся вблизи конца программы. Если коман- да ссылается на имя, которое определяется в про-: грамме позднее, тип этого имени (байт или слово)' должен быть точно задан ассемблеру для правильной генерации машинных кодов. Если никакой информации об определении типа символического имени нет, то ассемблер присваивает имени тип, который может оказаться некорректным. Это обстоятельство может привести к ошибке в про- цессе выполнения программы, хотя при трансляции' программы сообщений об ошибках не будете MOV NEXT_COUNT, 12 - Другие команды RET : NEXT-COUNT DB ? NEXT-CHECK DB 100 Когда утверждение языка ассемблера * MOV, NEXT-COUNT,12 транслируется в машинные коды, символическое имя NEXT-COUNT еще не определено. Ассемблер должен знать, представляется ли имя NEXT-COUNT байтом памяти или словом, чтобы он мог сгенерировать соответствующую последователь- ность машинных кодов (при этом генерируется 5 байт объектных кодов, если имя NEXT-COUNT, 123
однобайтовое, или 6 байт, если имя двухбайтовое)'. Поскольку информация о символическом, имени 'NEXT-COUNT, которая явно задает его тип, отсут- ствует, ассемблер воспринимает его как двухбайтовое (генерирует 6 байт объектных -кодов), что оказы- вается в данном случае неверным. Во время выполнения программы утверждение MOV NEXT-COUNT, 12 исказит содержимое однобай- товой ячейки памяти NEXT-CHECK. Этот тип ошибки очень труден для определения, поскольку отсутствуют какие-либо сообщения об ошибках при ассемблирова- нии исходной программы. Чтобы быть уверенным в том, что тип имени NEXT-COUNT-определен коррект- но, необходимо использовать директиву BYTE PTR: MOV BYTE PTR NEXT-COUNT, 12 Другие команды RET NEXT-COUNT DB ? NEXT-CHECK DB 100 Использование регистров При использовании регистров для записи операн- дов в ассемблерной программе необходимо соблюдать следующие правила: 1. Нельзя задавать 8- и 16-разрядный регистры для записи двух операндов одной команды. 2. Операции со стеком должны осуществляться только в шестнадцатибитовых кодах. Если 8-разряд- ный регистр указывают для работы со стеком (PUSH/POP), то выдается сообщение об ошибке. 3. Сегментные регистры не могут прямо использо- ваться в арифметических вычислениях, логических операциях или для непосредственной передачи дан- ных. Кроме того, сегментные регистры могут быть использованы только либо как источники операндов, либо только как приемники операндов, но никак не одновременно. ADD AX,DL Неверные записи PUSH BL ADD DS,100 а) Одновременное использование MOV ES,200 8-битового регистра (DL) и 16-бито- вого регистра (АХ) 121
MOV SS.CS б) Сегментный регистр DS исполь- । зуется при сложении. в) Непосредственный операнд переда- ется в регистр ES г) Оба операнда являются сегментными ' регистрами Ниже приведена правильная запись предыдущего примера ADD AX,DX PUSH ВХ MOV СХ.ЮО ADD DX.CX MOV CX.200 MOV ES,CX MOV CX,CS MOV ss.cx Выход из диапазона адресов Все команды условного перехода используют ре- жим относительной адресации с 8-битовым смеще- нием. Если относительный адрес символа, используе- мого в качестве операнда-адреса перехода, выходит за диапазон +127 байт —128 байт от конца команды условного перехода, выдается сообщение об ошибке: AND AL,7FH Неверные записи JE NEXT-PROC END-PROC: RET Более 127 байт между DATA DW 300 DUP(?) символическим адресом NEXT-PROC: NEXT-PROC и END-PROC CLC Ниже приведена правильная запись предыдущего примера AND AL,7FH JNE END-PROC JMP NEXT-PROG END-PROC: RET DATA DW 300 DUP(?) NEXT-PROC: CLC Использование операндов В языке ассемблера для микропроцессора МП 8088 первый операнд всегда используется в качестве при- емника. Операнд’ может быть записан в регистре 125
общего назначения, регистре сегмента или ячейке па- мяти. При использовании непосредственных данных в качестве операнда-приемника макроассемблер генери- рует сообщение об ошибке, как это показано в сле- дующем примере. CMP3,AL Неправильная запись CMPAL,3 Правильная запись Макрокоманды В большой программе на языке ассемблера суще- ствуют определенные последовательности команд, ко- торые часто повторяются с небольшими отклонениями друг от друга. Основные части этих последовательно- стей определяются как макрокоманды; упомянутые не- большие отличия последовательностей могут быть за- даны соответствующими параметрами. Во время трансляции ассемблерной программы макрокоманды преобразуются в последовательности действительных команд языка ассемблера. Таким образом, макрокоман- ды являются удобным средством для генерации по- следовательности утверждений языка ассемблера в различных местах программы, даже если в каждый момент, когда вызывается последовательность, ис- пользуются различные параметры. В макрокоманду обычно входят следующие элементы: • входное имя, определяющее имя макрокоманды. После определения макрокоманды она может быть вызвана в любом месте ассемблерной программы, так же как и обычная машинная команда или псевдокод; • список параметров, который включает специальные данные, необходимые при вызове макрокоманды. Спи- сок может состоять из одного и более параметров, включаемых в последовательность утверждений, ко- торая расширяется макрокомандой в процессе транс- ляции программы; • тело макрокоманды, определяющее основную после- довательность утверждений языка ассемблера, кото- рую генерирует макрокоманда; • конечное утверждение, которое ограничивает мак- рокоманду. 126
Следующий пример является типичным макроопре- делением: SAMPLE MACRO Р1,Р2,РЗ MOV АХ,Pl ADD АХ,Р2 MOV РЗ,АХ ENDM Входное имя в этом макроопределении — SAMPLE, Список параметров состоит из трех аргументов: Р1, Р2, РЗ. Тело макрокоманды включает три утвержде- ния языка ассемблера. Конечным утверждением явля-, ется ENDM (End Macro — конец макрокоманды) < Программа, написанная на языке ассемблера, вызы- вает макрокоманду с помощью следующего утвержде- ния: SAMPLE CASEl,TEST-LOCATION,FLAG Макроассемблер генерирует следующую последо- вательность утверждений макрорасширения SAMPLE: MOV АХ,CASEl ADD АХ,TEST-LOCATION MOV FL AG, AX
IV СИСТЕМА КОМАНД Данная глава содержит подробную информацию о системе команд микропроцесса Intel 8088. Команды описываются в ал- фавитном порядке следования их символических имен. Для пра- вильного понимания используемых сокращений, относящихся к обозначению флагов, следует пользоваться рис. 4.1. Затраты времени в тактах, требуемые на вычисление исполнительного адреса, приведены на рис. 4.2. Таблица перевода машинных команд в машинные коды со- держит как шестнадцатеричное их представление, так и двоич- ное. Поля таблицы указаны на рис. 4.3. AAA-коррекция кода ASCII при сложении Если ((AL)AND OFH) > 9 или (AF) =. 1, то (AL) *-----(AL) + 6 (АН) *-----(АН) 4-1 (CF) *-----1 (AF) *-----1 (AL) ------(AL)AND OFH По этой команде содержимое регистра AL преоб- разуется в число в двоично-десятичном неупакован- ном формате с нулевыми старшими четырьмя битами. Содержимое регистра AL представляет собой резуль- тат сложения двух чисел в двоично-десятичном неупа- кованном виде. Команда воздействует на флаги вспо- могательного переноса AF и переноса CF. Состояния флагов переполнения OF, знака SF, нуля ZF и пари- тета PF не определены. 123
15 14 13 12И 10 9 8 7 6 5 4 3 2 1 О OF DF IF TF SF ZF AF PF CF ; Используемые обозначения: X-воздействует на срлаг U-состояние флага не определено I—Перенос Паритет (четность) —Вспомогатель- ный перенос —Ноль ----Знак ----Ловушка ----Прерывание ----Направление ----Переполнение Рис. 4.1. Состав регистра флагов процессора. Способ адресации Такты* Только смещение 6 Только база или смещение (ВХ,ВР,5Т,01) 5 * База или индекс * + " Смещение 9 «База + Индекс BX + SI, BP+DI BX+DI, BP+SI 7 8 База + Индекс + Смещение BX+SI+Disp BP+Dl+Disp BP + SI+Disp BX+DI+DIsp 11 11 12 12 * Примечание: при сегментном переходе прибавить 2 Рис. 4.2. Вычисление исполнительного адреса. 5 Л. Дао 129
Назначение битового поля REG Назначение битового поля RM 16 бит 8 бит Сегмент ООО АХ ООО AL 00 ES 001 СХ 001 CL 01 CS 010 DX 010 D L 10 SS 01 1 ВХ 011 BL 11 DS 100 SP 100 АН 101 ВР 101 СН НО SI 110 DH 111 DI 111 ВН RM Адрес операнда ООО (ВХ) + (SI) + DISP 001 (ВХ) + (DI) + DISP 010 (ВР) + (81) + DISP 01 1 (ВР) + (01) + D1SP 100 (SI) + DISP 101 (DI) + DISP 1 10 (ВР) + DISP 111 (ВХ) + DISP Назначение битового поля MOD MOD Смещение 00 01 10 11 Байты смещения отсутствуют Если MOD=00 и RM-ПОдо EA=dfsp-low:disp-High Один байт смещения Di$P=Dfop-iow энаковорасширенное до 16 разрядов Два байта смещения D ISP=DIsp-low: Disp-high RM рассматривается как поле „RFC* Рис* 4t3* Поля таблицы перевода команд,
Пример Пусть регистры АХ и CL' содержат коды 0008Н и 04Н соответственно и выполняется следующая после- довательность команд! ADD AL,CL AAA После выполнения команды ADD AL,CL регистр AX содержит число 000CH (десятичное число 12), ко- торое не является правильной записью в двоично-де- сятичном виде. После выполнения команды ААА в регистре АХ содержится двоично-десятичное число в неупакованном формате (0102Н, которое является правильной записью в этом формате десятичного чис- ла 12). .Флаги, затрагиваемые операцией 15 14 13 Н И W 9 8 7 6 5 4 3 ? 4 О OF PF IF TF SF ZF AF PF CF Таблица перевода машинной команды , 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда ч Л37 ООН ОШ операнда нет Пример записи на языке ассемблера машинный код команда ассемблера $ формат । I операнда байты такты 3706 ААЛ I операнда нет 2 60 AAD-коррекция кода ASCII при делении (AL) ------— частное от деления (AL): 10 (АН) *----остаток от деления (AL): 10 Содержимое регистра АХ рассматривается как не- . упакованное двоично-десятичное число. По команде AAD это число перед делением на неупакованный б* 131
делитель преобразуется в нормальное беззнаковое це- лое число для получения частного в правильном не- упакованном двоично-десятичном формате. Для полу- чения правильного результата в последующей команде деления DIV регистр АН должен всегда содержать нуль. Команда воздействует на флаги паритета PF, знака SF, нуля ZF. Состояния флагов вспомогатель-» кого переноса AF, переноса CF, переполнения OF не определены. Пример Пусть регистры АХ и DL содержат коды 0205Н и 06Н соответственно и выполняется следующая после- довательность команд: AAD DIV DL Так как регистр АХ содержит правильное неупако- ванное двоично-десятичное число, команда AAD пре- образует содержимое регистра АХ в число 0019Н (де- сятичное 25), которое является шестнадцатеричным представлением беззнакового целого неупакованного двоично-десятичного числа 0205Н. Поэтому после вы- полнения команды DIV DL в регистре AL будет нахо- диться частное от деления 04Н, а в регистре АН — остаток 01Н, которые представляют собой правиль- ные двоично-десятичные числа. Флаги, затрагиваемые операцией 15 14 13 12 П 10 9876543210 | I х х и X | 71 OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная 2’й байт байты 3, 4, 5, 6, формат операнда . D5 1101 0101 0А операнда нет Пример записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты ‘ DSOA AAD операнда нет 2 60 132
ААМ-коррекция кода ASCII при умножении (AL) ----(AH)X10 + (AL) (АН) •*---О Команда работает с неупакованными двоично-де«. сятичными числами. Содержимое регистра АХ преоб* разуется в правильное двоично-десятичное число. Со-: держимое регистра АХ рассматривается как результат,, умножения двух неупакованных двоично-десятичных' чисел. Для того чтобы коррекция результата про- изводилась правильно, старшие полубайты перемно- жаемых операндов должны быть равны 0. Команда воздействует на флаги SF, ZF и PF. Состояния фла- гов OF, AF и CF не определены. Пример Пусть регистры AL и CL содержат числа 08Н и 09Н соответственно и выполняется следующая после-, довательность команд: MUL CL ААМ После выполнения команды MUL CL регистр AL' содержит число 48Н (десятичное 72), которое не яв- ляется неупакованным двоично-десятичным числом/ (Выполнение команды ААМ приводит к получению в регистре АХ числа 0702Н, которое является правиль- ным двоично-десятичным числом в неупакованном формате (шестнадцатеричное число 0702Н является неупакованным двоично-десятичным представлением десятичного числа 72). .Флаги, затрагиваемые операцией 15141312 1110 9876543210 III ц I X X и Х 0 f. OF OF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, ' формат операнда D4 1101 0100 0А операнда нет 133
Пример записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты D40A ЛАМ операнда нет 2 83 AAS-коррекция кода ASCH при вычитании Если ((AL)AND OFH) >9 или (AF) = 1, то (AL) ч-----(AL) - 6 ;(АН) ч-----(АН) - 1 (CF) ч-----1 (AF) ч-----1 (AL) ч-----(AL) AND OFH Операндами команды являются неупакованные {двоично-десятичные числа. По команде содержимое регистра AL преобразуется в неупакованное двоично- (десятичное число с нулевыми старшими четырьмя би- тами. Содержимое регистра AL рассматривается как результат вычитания двух неупакованных двоично-де- сятичных чисел. Команда воздействует на флаги AF, .CF. Состояния флагов OF, SF, ZF и PF не опреде- лены. Пример Пусть регистры АХ и CL содержат числа 0105Н и 08Н, т. е. двоично-десятичные представления десятич- ных чисел 15 и 8 соответственно, и выполняется сле- дующая последовательность команд: SUB AL,CL AAS После выполнения команды SUB AL,CL в регист- ре АХ находится число 01FDH, которое не является двоично-десятичным представлением. Команда AAS преобразует содержимое регистра АХ в неупакованное двоично-десятичное число 0007Н. Флаги, затрагиваемые операцией 15 14 13 12 II 10 9 8 7 6 5 4 3 2 t О U U U 1 U 7] OF OF IF TF SF ZF AF PF . CF 134
Таблица перевода 1-й байт 16- двоичная ричная 2.-й байт байты 3, 4, 5, 6, формат операнда 3F ООП Ш1 операнда нет Пример записи на языке ассемблера машинный код команда ассемблера з формат операнда байты такты 3F AAS операнда нет 1 4 ADC-сложение с переносом (1-й операнд) *---(1-й операнд)+ + (2-й операнд) + (флаг CF) По команде осуществляется сложение первого и второго операндов и к результату прибавляется зна- чение флага переноса CF (0 или 1). Результат запи- сывается в ячейки хранения первого операнда, а ис- ходное значение первого операнда теряется. Второй операнд остается неизменным. Первый операнд может храниться в регистре или ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти или непосредственным число- вым значением (операндом). Не разрешается зада- вать операнды в регистрах сегментов, а также хране- ние (запись) двух операндов одновременно в ячейках памяти. Операнды могут быть байтами или словами, представлять числа со знаком или без знака. По- скольку команда ADC использует флаг переноса CF, то она может применяться для сложения чисел, дли- на которых превышает 16 бит. Пример Пусть регистр АХ содержит число 4803Н, а ре- гистр флагов процессора содержит код F047H (1111 000001000111), т. е. флаг переноса CF равен 1. После выполнения команды ADC АХ вместо 2517Н в регист- ре АХ будет записано 6D1BH, а в регистре флагов .будет новое значение F006H, 135
Содержимое AX 0100 1000 0000 0011==4803Н 0010 0101 0001 0111=2517Н Флаг переноса CF 1 Новое содержимое АХ ОНО 1101 0001 1O11=6D1BH В младшем байте регистра АХ число единичных битов равно четырем, т. е. оно четное, поэтому флаг паритета (четности) установлен в единицу. Флаги SF и ZF сброшены в нуль, поскольку результат опера- ции — положительное, отличное от нуля число. Флаги переноса CF и переполнения OF также имеют нулевое значение, так как отсутствуют перенос и переполне- ние. Флаг AF равен нулю, поскольку нет переноса из третьего разряда. Флаги, затрагиваемые операцией 15 14 13 12 <1 10 9 8 7 6 5 4 3 2 10' ГТТ'1 |х| I I |,|»1 |.| |«I И OF PF IF TF SF ZF AF PF CF ' Таблица перевода 1-й байт 2-й байт байты 3, 4, 5, 6, формат операнда * 4 16- римная двоичная । 10 0001 0000 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8/Mem8,Reg8 И 0001 0001 Mod-Reg-Rm Disp-Lo,Disp-Hi Regl6/Meml6,Regl6 12 0001 0010 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8,Reg8/Mem8 < 13 0001 ООН Mod-Reg-Rm Disp-Lo,Disp-Hi Reg16,Reg16/Mem16 14 0001 0100 Data8 AL,Immed8 * 15 0001 0101 Data-Lo Data-Hi AX,Immedl6 80 1000 0000 Mod-010-Rm Disp-Lo,Disp-Hi, DataB Reg8/Mem8,Immed8 81 1000 0001 Mod-010-Rm Disp-Lo,Disp-Hi, Data-Lo,Data*Hi Regl6/Meml6,Immedl6 82 1000 0010 Mod-010-Rm Disp-Lo,Disp-Hi, Data8 Reg8/Mem8, Inuned8 83 1000 ООП Mod-010-Rm Disp-Lo,Disp-Hi, Data-SX Regl6/Meml6,Immed8 136
Примеры записи на языке ассемблера машинный код команда ассемблера '"Г™11 *,,, фо р м а т о п ера н да: байты такты 101F A DC Mem8,Reg8 2-4 Хб+ЕА 1006 ADC он.оь Reg8,Reg8 2 3 11540C ADC [SI+UJ.DX Meml6,Regl6 2-4 24+ЕА машинный. код : команда ассемблера формат операнда байты такты 11F2 ADC DX,SI Regl6,Regl6 2 3 120Е002С ADC CL,NEXT_BYTE Reg8,Mem8 2-4 9+EA 1315 ADC DX,[DIJ Reg16,Mem16 2-4 13+EA 1403 ADC AL,03 AL,Immed8 2 4 15FFFF ADC AX,-1 AX,Immedl6 3 4 80D60A ADC DH,10 Reg8,Immed8 3 4 8095230F01 ADC BYTE PTR (DI+0F23H],! Mem8,Immed8 3-5 17+EA 81D51122 ADC BP 2211H Regl6,Immedl6 4 : 4 81150123 ADC WORD PTR (SI],2301H Meml6,Immedl6 4-6 25+EA 82D50A ADC CH,10 Reg8,Immed8 3 4 83D301 ADC BX,01 Regl6,Immed8 3 4 8316000003 ADC WORD PTR NEW,03 Meml6,Iffimed8 3-5 25+EA А DD-сложение (1-й операнд) -*--(1-й операнд) + (2-й операнд) По этой команде осуществляется сложение перво- го и второго операндов. Результат помещается на ме- сто хранения первого операнда. Предыдущее значение первого операнда теряется. Содержимое ячейки вто- рого операнда остается неизменным. Местом хранения первого операнда может быть регистр или ячейка памяти; второго операнда — ре- гистр или ячейка памяти, либо он может быть задан непосредственно операндом. Не разрешается исполь- зовать для записи операндов сегментные регистры, а также ячейки памяти для одновременного хранения двух операндов. Операнды могут быть числами со знаком или без него и представлять собой байты или слова. 137
Пример Пусть регистр DL содержит число 58Н, однобайто- вая ячейка памяти TEST-BYTE содержит 27Н, а в ре- гистре флагов процессора записано число F046H. По- сле выполнения команды ADD TEST-BYTE,DL в ячей- ку памяти будет записано 7FH, а в регистр флагов — код F002H. Содержимое регистра DL 0101 1000 = 58Н Содержимое ячейки TEST-BYTE 0010 0111 =27Н Новое содержимое ячейки TEST-BYTE 0111 1111= 7FH Число единичных битов в ячейке памяти TEST-BYTE после выполнения команды равно семи, т. е. нечетное число, поэтому флаг паритета PF сбра- сывается в нуль. Флаги SF и ZF обнуляются, так как результат операции — положительное, отличное от нуля число. Флаги CF и OF также обнуляются ввиду отсутствия переноса и переполнения соответственно^ Флаг AF имеет нулевое значение, поскольку нет пе- реноса из третьего разряда. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 10 М I I Iх! I I 1х1х1 Ы 1*1 Iх! OFPFIFTFSFZF jr tPF CF Таблица перевода 1-й байт 16. двоичная ричная> 2-й байт байты 3, 4,5, 6, формат операнда* 00 0000 0000 Mod-Reg-Rm Disp-Lo,Disp-Hl Reg8/Mem8,Reg8 ' 01 0000 0001 Mod-Reg-Rm Disp-Lo,Disp-Hi Regl6/Meml6,Regl6 02 0000 0010 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8,Reg8/Mem8 03 0000 ООН Mod-Reg-Rm Disp-Lo,Disp-Hi Regl6,Regl6/Meml6 04 0000 0100 Data8 ; AL,Immed8 05 0000 0101 Data-Lo Data-Hi AX,Immedl6 80 1000 0000 Mod-ООО—Rm Disp-Lo,Disp-Hi, - Reg8/Mem8,Immed8 Data8 81 1000 0001 Mod-000-Rm Disp-Lo,Disp-Hi, Regl6/Meml6,Immedl6 Data-Lo,Data-Hi • X 82 1000 0010 Mod-000-Rm Disp-Lo,Disp-Hi, Reg8/Mem8flnmedS Data8 83 1000 ООН Mod-OOO-Rm Disp-Lo,Disp-Hi, Regl6/Meml6,Immed8 t Data-SX 138
Примеры записи на языке ассемблера машинный код - команда ассемблера формат операнда байты такты 002С , ADD tSIJ.CH Mem8>Reg8 2-4 16+EA. 00F6 ADD DH.DH Reg8,Reg8 2 ;3 014412 ADD [SI+12K],AX Meml6,Regl6 2-4 24+EA 01ЕВ ADD BX,BP Regl6,Regl6 2 3 021Е0020 ADD BL,TEST_BYTE Reg8,Mem8 2-4 9+EA > машинным код команда ассемблера! формат операнда байты такты 0305 ADD АХ,[DI] Regl6,Meml6 2-4 13+EA 0403 ADD AL,03 AL,Immed8 2 4 052589 ADD AX,8925H AX,Inunedl6 3 4 80C40B ADD AH,11 Reg8,Inimed8 3 4 8086230F09 ADD BYTE PTR [BP+OF23H],9 Mem8,Immed8 3-5 17+EA 81C10EFF ADD CX,FFOEH Regl6,Immedl6 4 4 „ 81040010 ADD WORD PTR [SI]>1000H Meml6,Inunedl6 4-6 25+EA 82C41O ADD AH.10H Reg8,Inuned8 - 3 4 83C201 ADD DX,01 Regl6tImmed8 3 4 8306000003 • ADD WORD PTR L0C.3 Meml6,Immed8 3-5 25+EA AN D-логическое умножение (1-й операнд) •*---(1-й операнд) AND (2-й операнд). " ' .(CF) •*-О (OF) *------ О *По этой команде осуществляется логическое умид- жение первого операнда на второй. Предыдущее зна- чение первого операнда при этом теряется, а второй операнд сохраняется неизменным. Первый операнд .может быть записан в регистре или ячейке памяти. /’Второй операнд может быть задан в регистре, ячейке памяти или непосредственно операндом. Нельзя ис- пользовать для хранения операндов сегментные ре- гистры, а также записывать оба операнда одновремен- но в ячейки памяти. По команде можно выполнять 139
операции над байтами или словами. После выполне- ния этой команды флаги CF и OF всегда равны нулю. Пример Пусть регистр ВХ содержит число 024DH, регистр ВР — число F007H, а регистр флагов процессора — число F046H. После выполнения команды AND ВХ,ВР в регистре ВХ будет написано число 0005Н, а в реги- стре флагов — число F006H. Содержимое регистра ВХ Содержимое регистра ВР Новое содержимое регистра ВХ 0000 0010 0100 1101 =024DH 1111 0000 0000 01U=F007H 0000 0000 0000 0101 =0005Н Число единичных битов в младшем байте регистра ВХ равно двум, т. е. число четное, поэтому флаг па- ритета PF установлен в единицу. Так как результатом булевой операции AND является отличное от нуля значение в дополнительно^,^оде, флаги SF и ZF рав- ны нулю. Флаги CF и OF всгда установлены в нуль, поскольку отсутствуют перенос и переполнение соот- ветственно. Флаг AF не определен. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 10 I I. I I 1°1 I. L .1*1*1 ld_№l°l OF DF IF TF SF 2F AF PF CF, Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 20 0010 0000 21 0010 0001 22 0010 0010 23 0010 0011 24 0010 0100 25 ООЮ 0101 80 1000 0000 81 1000 0001 Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Data8 Data-Lo Mod-100-Ra Mod-100-Rm Disp-LotDisp-Hi Disp-LOjDxsp-Hi Disp-LOjDisp-Hi Disp-Lo,Disp-Hi Data-Hi Disp-Lo,Disp-Hi, DataS Disp-Lo,Disp-Hi, Data-Lo,Data-Hi Reg8/Mem8*Reg8 Regl6/Meml61RegI6 RegSjRegS/Mema Regl6,Regl6/Meml6 AL,Immed8 AX,Tnunedl6 Reg8/Mem8,Immed8 Regl6/Meml6,Immedl6 140
Примеры записи на языке ассемблера^ машинный код команда ассемблера формат операнда байты такты 2028 AND [BX+SII.CH Mem8,Reg8 2-4 16+EA 20D3 AND BL,DL Reg8jReg8 2 3 211ЕОО6О AND WORD PTR SUH.BX Meffll6jRegl5 2-4 24+EA 21Е9 AND CX.BP Regl6,Regl’6 2 3 220D AND CL,[DI] Reg8,Mem8 2-4 9+EA 2357ОС AND DX,[BX+I2] Regl6,Meml6 2-4 13+EA 2401 AND AL,01 AL,Immed8 2 4 250748 AND AX.4807H AX,Immedl6 3 4 80Е701 AND BH,01 Reg8tImmed8 3 4 машинный код команда ассемблера формат операнда байты такты 80640200 AND BYTE PTR [SI+2],0 Mem8,Itmned8 3-5 17+EA 81E6FFFP AND SI.OFFFFH Reg 16,limned 16 . 4 4 81260010FFFE AND WORD PTR TEST.OFEFFH Meml6,Immedl6 4-6 25+EA CALL-вызов процедуры Межсегментная передача! (SP) ч-----(SP) — 2 (Вершина стека) *---(CS) (SP) ч-----(SP) —2 (Вершина стека) *---(IP) (CS) ч-----Сегмент процедуры (IP) ч-----Перемещаемый адреа процедуры Внутрисегментная передача: (SP) ч-----(SP) —2 (Вершина стека) ч----(IP) (IP) ч-----Перемещаемый адрес процедуры По этой команде в стандартном виде осуществля- ется безусловная передача управления процедуре Ml
(подпрограмме)'. Адрес возврата записывается в стек (на его вершину), что дает возможность команде про- цедур RET (возврат из процедуры) вернуть управле- ние следующей за CALL команде. Команда CALL имеет четыре различные модифи- кации: внутрисегментная передача управления с прямой адресацией; внутрисегментная передача управления с косвен- ной адресацией; межсегментная передача управления с прямой ад- ресацией; межсегментная передача управления с косвенной адресацией. Внутрисегментная команда CALL осуществляет передачу управления только внутри текущего 64-ки- лобайтового командного сегмента. Другими словами, адрес вызываемой процедуры должен находиться вну- три диапазона от +32 767 байт до —32 768 байт от адреса следующей за CALL команды. Для внутрисег- ментных команд в стеке сохраняется содержимое только регистра IP. Перед записью микропроцессор автоматически изменяет регистр указателя команд IP так, чтобы он указывал адрес следующей за CALL команды. В случае внутрисегментных команд с прямой ад- ресацией для получения адреса вызываемой процеду- ры значение 16-битового смещения прибавляется к со- держимому регистра-указателя команд IP. В этих командах 16-битовый регистр общего назначения (АХ, ВХ, СХ, DX, SI, DI, ВР, SP) или ячейка памяти мо- гут быть использованы для хранения операнда, за- дающего адрес вызываемой процедуры. Межсегментная команда CALL может передавать управление любой процедуре в пределах всего мега- байтового адресного пространства микропроцессора 85088. При выполнении межсегментных команд CALL в стеке сохраняется содержимое регистров CS и IP. Прямые межсегментные команды CALL содержат Значения кодового сегмента и относительного адреса вызываемой процедуры в самой команде, и в процессе выполнения их помещают в регистры CS и IP. В меж- сегментных командах передачи управления с косвен- ной адресацией для записи операндов могут исполь-. 142
зоваться ячейки памяти. В этбМ ёйучаё при выполнен нии команды содержимое двойного слова памяти за- писывается в регистрах CS и IP* / Пример В языке ассемблера микропроцессора 8088 коман- да CALL вызова процедуры NEAR транслируется во внутрисегментную, а процедура FAR^b межсегмент- ную команду: _ Межсегментная CALL Внутрисегментная CALL MOV AL,00 MOV AL,00 CALL FAR PTR CONVERT CALL CHECK Команды вызыва- ющей программы CONVERT PROC FAR Команды вызываю- щей программы CHECK PROG NEAR Команды проце-^ дуры Команды процедуры CONVERT ENDP CHECK м ENDP Таблица перевода 1-й байт 16. двоичная ричная 2-й байт байты .3,4, 5, 6, формат операнда. 1001 1010 Е8 1110 1000 FF 1111 1111 FF 1111 1111 Offset-Lo IP-Inc-U Mdd-010-Rm Mod-011-Ки Offset-Hl •Seg7Lo,Seg~Hi IP-Inc-Hi Far-Pro& Near-Proa Regl6/Meml6 " Сегмента Meml6 only межсегментный Примеры записи на языке ассемблера машинный код команда ассемблера . формат операнда: байты такты 9A001200F0 CALL FAR PTR TICK Far-Proc 5 28(36) E80020 CALL NEXT.PROC Kear-Proe 3 19(23) 143
машинный код команда ассемблера формат операнда байты такты FFD6 } CALL SI Hegl6 (Intra) 2 16(24) FF570C CALL WORD PTR [BX+12] Hempl6 (Intra) 2-4 21(29)+EA FF1D CALL DWORD PTR (DI] Meml6 (Inter) 2-4 37(57)+EA CBW-преобразование байта в слово Если (AL) < 80Н, то (АН) *-О Если (AL)>80H, то (АН) -----FFH По этой команде выполняется перемещение стар-* шего (знакового) бита байта, находящегося в регист- ре AL, в регистр АН. Если знаковый бит в регистре AL равен нулю, нули записываются также и во все разряды регистра АН, с тем чтобы число в регистре АХ было положительным. Если знаковый бит в ре- гистре AL равен 1, то в регистр АН записывается шестнадцатеричное число FF, с тем чтобы число в регистре АХ было отрицательным в стандартном до- полнительном двоичном коде. Команда не воздей- ствует ни на какие флаги и не имеет операндов. При выполнении однобайтового деления команда CBW мо- жет использоваться для преобразования однобайтово- го делимого в двухбайтовое. Пример Если регистр АХ содержал число 02D3H, то после завершения выполнения команды CBW он будет со- держать число FFD3H. Таблица перевода 1-й байт 16“ двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 98 1001 1000 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат Операнда байты такты 98 CBW операнда нет 1 2 144'
CLC-сброс флага переноса (CF) -------О По этой команде осуществляется обнуление фла- га переноса без воздействия на другие флаги и ре- гистры. Пример Если содержимое регистра флагов процессора рав- но F047H, то после выполнения команды CLC оно бу- дет F046H. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 ! О □ I I I I I I I Н Т I I I |.| OF OF IF TF SF ZF AF PF * CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат юперанда F8 1111 1000 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнд; байты такты F8 CLC операнда нет г .CLD-сброс флага направления (DF) ч------0. По этой команде осуществляется установка в нуль флага направления DF без воздействия на другие флаги и регистры. Операнды в команде отсутствуют. Регистры-указатели SI и/или DI работают в режиме автоувеличения в том случае, когда они используются для записи строковыми командами (CMPS, LCDS, MOVS, SCAS, STOS). Содержимое этих регистров увеличивается на 1 или 2 при выполнении однобайто- вых или двухбайтовых операций соответственно. Пример Если регистр флагов процессора содержит число F446H, то после выполнения команды CLD он будет содержать число F046H. 145
Флаги, затрагиваемые операцией 15 <4 13 12 И 10 9 8 7 в 5 4 3 2 1 0 111111°! Ill I I I I I I I OF OF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 56* двоичная рйчная 2-й байт байты 3, 4, 5, 6, формат операнда FC 1111 1100 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера форматоперанда байты такты | FC CLD операнда нет 7 О CLI-сброс флага прерываний (IF) *-----0. По этой команде выполняется установка в нуль флага разрешения прерываний IF без воздействия на другие флаги и регистры. Операнды в команде отсут- ствуют. Когда флаг IF установлен в нуль, микропро- цессор игнорирует все запросы на маскируемые пре- рывания, приходящие на его вход INTR. Разрешены только программные прерывания и немаскируемые прерывания, которые поступают на вход NMI. Коман- да CLI используется в процедурах обработки преры- ваний для запрещения прохождения последующих прерываний, с тем чтобы дать возможность полностью завершить все необходимые операции в этих про- цедурах. Пример Если содержимое регистра флагов процессора рав« но F246H, то после выполнения команды CLI оно бу- дет F046H. Флаги, затрагиваемые операцией 15 14 13 12 И 10 9 8 7 в S 4 3 2 1 О I I I I I I I»! I I I 11 I I I I OF DF IF IF SF ZF' AF PF OF 146
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда FA 1111 1010 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты FA CLI операнда нет 1 . 2 СМС-инверсия флага переноса Если (CF) = 0, то (CF) *-1 Если (CF)= 1, то (CF) *--О По этой команде инвертируется содержимое флага переноса CF без изменения состояний других флагов, и регистров. Операнды в команде отсутствуют. Пример Если содержимое регистра флагов процессора рав?' но F047H, то после выполнения команды СМС оно будет F046H. Флаги, затрагиваемые операцией 15 14 13 12 II 10 9 В 7 6 5 4 3 2 1 С ггтпт'п mill i.fi OF PF IF TF SF 2F AF PF CF Таблица перевода 1-й байт 16’ - ричная двоичная 2-й байт байты 3,4, 5,6, а формат , операнда u F5 1111 0101 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты F\ СМС операнда нет 1 2 147
CMP-сравнение операндов (1-й операнд) — (2-й операнд)1» Содержимое второго операнда при выполнении этой команды вычитается из содержимого первого операнда. Результат операции изменяет флаги AF, CF, OF, PF, SF и ZF. Сами операнды не изменяются. Первый операнд может быть записан в регистре либо в ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти либо непосредственным опе- рандом. Не допускается использовать для записи опе- рандов сегментный регистр или записывать оба опе- ранда одновременно в ячейки оперативной памяти. Команда осуществляет операции как со словами, так и е байтами. Пример Пусть в регистре АХ записано число 024DH, в ре- гистре СХ— 1823Н, а в регистре флагов процессо- ра— число F046H. После выполнения команды СМР в регистре флагов будет записано новое число F083H, ; Флаги, затрагиваемые операцией 15 14 13 12 It 10 9 8 7 6 5 4 3 2 t О I X I | xjx~ X X ~Х~|; OF DF IF TFSF ZF AF PF ' CF/ - \ ~ Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3t 4, 5t 6, формат операнда 38 0010 0000 39 0010 0001 ЗА 0010 0010 ЗВ 0010 ООП ЗС 0010 0100 3D 0010 0101 Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Data8 Data-Lo Disp-Lo>Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Data-Hi Reg8/Mem8,Reg8 Regl6/Meml6,Regl6 Reg8,Reg8/Mem8 Regl6,Regl6/Meml6 AL,Immed8 AX,Immedl6 148
1-й байт 16- двоичная оичная.. ... — 2-й байт байты 3, 4, 5, 6, формат операнда 80 1000 0000 Mod-Hl-Rm Disp-Lo^Disp-Hi» Data8 Reg8/Mem81ImmedS 81 1000 0001 Hod-111-Rm Disp-LojDisp-Hi, Data-LofData-Hi Regl6/Meml6tImaedl6 82 1000 0010 Mod-llWta Disp-LOjDisp-Hi, Data8 Reg8/Mem8,IrranedS 83. 1000 ООП Mod-lll-Ra Disp-LOjDisp-Hi, Data-SX Regl6/Meial6, LmnedS Примеры записи на языке ассемблера машинный код команда ассемблера <j формат операнда байты такты 3828 CMP [BX+SI],CH Mem8,Reg8 2-4 9+EA 38D3 CMP BL,Dlr Reg8,Reg8 2 3 391E0060 CMP WORD PTR SUM.BX Meml6,Regl6 2-4 13+EA 39E9 ? CMP CX.BP Reg16,Reg16 2 3 3A0D CMP CL,(DI)' Reg8,Mem8 2-4 9+EA 3B570C CMP DX,[BX+12] Regl6,Meml6 2-4 13+EA 3C7F CMP AL.7FH ; AL,Immed8 2 4 3D0748 CMP AX,480711; AX,Immedl6 3 4 80FF09 CMP BH.O9 Reg8,Immed8 3 4 807C0200 CMP BYTE PTR [SI+2],0 Mem8jTmmed8 3-5 10+EA 81FE0090 CMP SI.9000H Regl6,Immedl6 4 4 813E00100080 CMP WORD PTR TEST.8000H Meml6,Immedl6 4-6 14+EA 82FA02 ; CMP DL.02 Reg8,Immed8 . 3 4 83FAFE CMP DX,-2 Regl6,Immed8 3 4 ;СМР8-сравнение строк (операнд по адресу в регистре SI) — (операнд по адресу в ре' гистре DI). Если (DF) = 0, то (SI) •*-— (SI) + 1 (байт) (D1) *------ (DI) + 1 (байт), , . . 149
или (SI) 4 (SI) + 2 (слово) (DI) * (DI) + 2 (слово). Если (DF) —1, то (SI) * (SI) — 1 (байт) (DI) * (DI) - 1 (байт), или (SI) -* (SI) — 2 (слово) (DI) •* (DI) — 2 (слово). Содержимое ячейки памяти, адрес которой нахо- дится в регистре DI, вычитается из содержимого ячей- ки памяти, адрес которой находится в регистре SI. По результату вычитания изменяется содержимое ре- гистра флагов процессора, но при этом не меняется информация в ячейках памяти, адресуемых регистра- ми SI и DL В языке ассемблера команда CMPS за- писывается как CMPSB при работе с однобайтовыми величинами и как CMPSW в операциях со словами. Если флаг DF равен нулю, содержимое регистров SI и DI увеличивается на 1 после выполнения команды CMPSB и на 2 после выполнения команды CMPSW. Если флаг DF равен единице, содержимое регистров SI и DI уменьшается на 1 или 2 после выполнения команд CMPSB и CMPSW соответственно. Если команда CMPS содержит префиксную часть REP/REPE/REPZ, то операция повторяется до тех пор, пока содержимое регистра СХ не станет равно нулю и элементы последовательностей не станут рав- ными (в этом случае флаг ZF равен 1). Если префик- сом является выражение REPNE/REPNZ, то повторе- ние осуществляется до тех пор, пока содержимое ре- гистра СХ не станет равным нулю, а элементы строк станут неравными (флаг ZF равен 0). Пример Пусть регистр SI содержит число 7F00H, ячейка памяти с адресом 7F00H — число 41Н, регистр DI — адрес В800Н (содержимое ячейки памяти по этому адресу равно 53Н), а регистр флагов процессора —; число F046H и при этом выполняется следующая по< следовательность команд: CLD ;сбросить флаг направления DF в нуль CMPSB 150
После выполнения этих команд в регистрах SI и PI будет записано 7F01H и В801Н соответственно. Так как результат операции (41Н — 53Н = F0H) есть отрицательное, отличное от нуля число, то флаг зна- ка SF будет установлен в 1, а флаг нуля ZF — в 0. В регистре флагов при этом будет новое значение — F097H. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 £ 5 4 з '2~1 О X X X X X X .OFDF 1FTFSFZF .AF PF CF Таблица перевода 1-й байт 16- двоичная 2-й байт байты 3t 4е 5, 6^ формат операнда Аб 1010 011Q А7 1010 0Ш операнда нет операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера форматоперанда байты такты Аб CMPSB операнда нет 1 22 А7 CMPSW 1 операнда нет 1 30 CWD-преобразование слова в двойное слово Если (АХ) < 8000Н, то (DX) •*-0 Если (АХ)>8000Н, то (DX) ч----FFFFH По команде CWD значение самого старшего (зна-* кового) бита слова в регистре АХ переносится в ре- гистр DX. Если знаковый бит регистра АХ равен 0, то в регистр DX записываются нули, а содержимое ре- гистров становится 32-битовым положительным чис- лом. Если знаковый бит регистра АХ равен 1, то в ре- гистр DX записывается шестнадцатеричное число FFFFH и содержимое пары регистров становится отрицательным 32-разрядным числом. Команда CWD не оказывает влияния ни на какие флаги и не имеет операндов. Она может использоваться для 151
преобразования двухбайтового делимого в делимое двойной длины при делении на слово. Пример Пусть регистр АХ содержит число 9432Н, а ре-< гистр DX — число С241Н. После выполнения коман- ды CWD содержимым регистра DX будет новое число FFFFH, а содержимое регистра АХ не изменится. В паре регистров DX, АХ записано шестнадцатерич- ное число FFFF9432. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 99 1001 1001 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 99 CWD операнда нет I 5- DAA-десятичная коррекция при сложении Если ((AL) AND 0FH)> 9 или (AF)= 1, то (AL) ч------(AL) + 6, (AF) ч------1. Если (AL) > 9FH или (CF)=1, то (AL) ч------(AL) + 60Н, (CF) ч------1. По этой команде выполняется операция над упа- кованными двоично-десятичными числами. Она воз- действует на флаги AF, PF, ZF, SF и CF, Состояние флага OF не определено. Пример Пусть регистры AL и BL содержат 29Н и 13Н — упакованные двоично-десятичные записи десятичных чисел 29 и 13 соответственно и выполняется следую-, щая последовательность команд: ADD AL,BL DAA 152
После выполнения первой команды в регистре AL’ будет записано ЗСН, которое не является правильным двоично-десятичным числом. Команда DAA записы- вает в регистр AL скорректированное число 42Н, ко- торое является правильной двоично-десятичной за- писью десятичного числа 42. Флаги, затрагиваемые операцией 15 14 13 1? Н 10 9 8 7 6 5 4 3 2 1 О I I I I 14 I I |х|х| |х| |х| |х| OF DF IF TF SF ZF AF PF CF ; Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6е формат операнда 27 0010 0111 операнда нет Пример записи на языке ассемблера машинный код команда ассемблера формат операнда1 байты такты 27 DAA операнда нет 1 4 DAS-десятичная коррекция при вычитании Если ((AL) AND OFH) > 9 или (AF) == 1, то (AL) <-----(AL) —6, (AF) *----1. Если (AL) > 9FH или (CF) = 1, то (AL) ч-----(AL) - 60Н, (CF) <-----1. По команде DAS содержимое регистра AL’ заменя- ется правильным двоично-десятичным числом в упа- кованном формате. Команда рассматривает содержи- мое регистра AL как результат вычитания двух упа- кованных двоично-десятичных чисел и воздействует на флаги AF, PF, ZF, SF и CF. Состояние флага пе- реполнения OF не определено. Пример Пусть регистры AL и BL содержат упакованные двоично-десятичные коды 44Н и 27Н десятичных 153
чисел 44 и 27 соответственно и выполняется следую-» щая последовательность команд: SUB AL,BL DAS После выполнения первой команды содержимое регистра AL 1DH не является правильной двоично- десятичной записью. Команда DAA преобразует это числов 17Н — правильную двоично-десятичную за- пись десятичного числа 17. .Флаги, затрагиваемые операцией , 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О I—LJ-1. IN I I I х| Х| | X | |х| | X | OF OF IF TF SF ZF AF PF CF, Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3* 4, 5, 6, формат операнда ? ' 2F 0010 1111 операнда нет Пример записи на языке ассемблера машинный koj команда ассемблера формат операнда байты такты 2F DAS операнда нет 1 4 DEC-декремент (Операнд) •*---(Операнд) — 1 По этой команде исходное содержимое операнда, определенного в команде, уменьшается на 1. Операнд может храниться в регистре общего назначения или ячейке памяти. Не допускается задание операндов в регистрах сегментов. Операция выполняется как над однобайтовыми, так и над двухбайтовыми числами. Операнд рассматривается как беззнаковое число. Команда DEC не воздействует на флаг CF. Пример Пусть в регистре BL записано 00 и выполняется команда DEC BL. Новым содержимым регистра BL будет число FFH. Так как результат является отри- 154
цательным, отличным от нуля числом в дополнитель- ном коде, флаг знака SF устанавливается в 1, а флаг нуля ZF сбрасывается в 0. Поскольку в результате присутствует восемь отличных от нуля битов, т. е. чет- ное число, флаг паритета PF тоже установлен в 1. Флаги, затрагиваемые операцией 15 14 13 12 П 10 9 8 7 в 5 4 3 2 1 О I Iх| Г 1х|X | |х| 1х| | OF OF IF TF SF ZF AF, PF CF Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5t 6, формат операнда ' FE 1111 1110 FF 1Ш 1111 0100 Ireg Mod-001-Rni Mod-001-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8 Regl6/Meml6 Regl6 only* Примечание. Формат команды FF Mod-001-Rm не следует исполь- зовать в том случае, когда операнд содержится в 16-разрядном регистре. Более эффективным в этом случае является формат 0100 IReg. Примеры записи на языке ассемблерах машинный код команда ассемблера форматоперанда байты такты 48 DEC AX Regl6 X 2 FEC3 DEC AL Reg8 2 3 FEOEOOIO DEC BYTE PTR TESTB Mem8 2-4 15+EA FF4C12 DEC WORD PTR [Sl+18] Meml6 2-4 23+EA DIV-деление Для однобайтовых операций выполняется деление содержимого регистра АХ на операнд. При этом, если ((АХ): (Операнд) FFH), генерируется прерывание типа 0. (AL) ч------частное (АН) ч------остаток Для двухбайтовых операций выполняется деление (DX.AX) ; (Операнд). Если ((DX,AX) ; (Операнд) ^ 155
>FFFFH), генерируется прерывание типа 0. (АХ) •*-----частное (DX) •*-----остаток По команде DIV выполняется беззнаковое деление содержимого регистра-аккумулятора на заданный операнд. При однобайтовом делении содержимое ре- гистра АХ рассматривается как беззнаковое 16-раз- рядное делимое. При двухбайтовом делении содержи- мое пары регистров DX,AX рассматривается как беззнаковое 32-разрядное делимое, где регистр DX содержит старшие 16 разрядов. Операнд может быть задан в регистре общего назначения или ячейке памя- ти, при этом операнд рассматривается как беззнако- вый 8- или 16-битовый делитель соответственно при однобайтовом и двухбайтовом делении. При однобайтовом делении частное записывается в регистр AL, а остаток — в регистр АН. При двух- байтовом делении регистры АХ и DX используются для хранения 16-разрядных частного и остатка соот- ветственно, рассматриваемых как беззнаковые числа. После выполнения команды DIV состояния разря- дов регистра флагов процессора не определены. Если значение частного превышает разрядность аккумуля- тора (десятичное число 255 при однобайтовом деле- нии и 65535 при двухбайтовом) или предпринимается попытка деления на нуль, то автоматически генери- руется прерывание типа 0. Если произошло перепол- нение, то частное и остаток не определены. В ячейках памяти с абсолютными адресами 00000Н и 00003H содержится двойное слово, определяющее командный сегмент и перемещаемый адрес процедуры обработки прерывания нулевого типа. Пример Пусть регистр АХ содержит число 0047Н, регистр CL — число 12Н и выполняется команда DIV CL. Частное от деления (ОЗН = 47Н/12Н) записывается в регистр AL, а остаток ПН — в регистр АН. Рассмотрим случай, когда регистры DX и АХ со- держат соответственно коды 0012Н и F043H, пред- ставляющие 32-разрядное шестнадцатеричное число 0012F043H, регистр ВР содержит число 4320Н и вы- полняется команда DIV ВР. Частное от деления 156
(0048Н »«= 12F043H/4320H) записывается в регистр AL, а остаток (0F43H) — в регистр DX, Флаги, затрагиваемые операцией 15 14 13 12 11 10 9876543? f O II I LM I I 1Ф1 M l»T~FI OF DF IF TF SF ZF AF PF , CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда F6 1111 ОНО Mod-100-Rm Disp-Lo,Disp-Hi Reg8/Mea8 F7 1111 0111 Mod-100-Rm Disp-Lo,Disp-Hi Regl6/Meml6 Примеры записи на языке ассемблера машинный ко/ it команда ассемблера формат операнда байты такты F6F5 DIV CH Reg8 2 80-90 F67401 DIV BYTE PTR [ST+01] МешЗ 2-4 (8б-96)+ЕА F7F1 DIV CX Regl6 2 144-162 F736OO2O DIV WORD PTR XNUM Mem 16 2-4 (1S4-172)+EA ESC-выдача Если Mod# 11В, то шина данных *—---(ЕА) Команда ESC обеспечивает получение команд микропроцессора 8088 внешними процессорами, таки- ми, как процессор обработки цифровой информации 8087, а также использование ими способов адресации памяти 8088, МП 8088 выполняет операцию, эквива- лентную действию команды NOP (отсутствие опера- ции) в том случае, когда операнд команды ESC ука- зан в регистре, и операцию псевдочтения, реализую- щую установку на информационных шинах данных из памяти, в случае, когда операнд хранится в ячейке памяти. Пример Рассмотрим команду ESC 0FH.DX. Так как опе- ранд команды хранится в регистре, то МП 8088 157
выполняет операцию NOP, т. е. не производит никаких действий. Если в микрокомпьютерной системе присут-: ствует процессор 8087, он интерпретирует команду ESC как команду операции FSQRT (вычисление квад- ратного корня) в форме с плавающей запятой. Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3,4,5,6, формат операнда 1101 1ххх Mod-yyy-Rnt Opcode,Reg8/Mem8* Opcode,Regl6/Meml6 Примечание. Разряды ххх и ууу в первых двух байтах машинной Команды формируют код операции команды ESC. Примеры записи на языке ассемблера машинный код .команда ассемблера формат операнда байты такты- DED9 ESC 33H.CL Opcode,Reg8 2 2 DED9 ESC ззн.сх 1 Opcode,Regl6 2 2 DB6C0A ' ESC BYTE PTR ЮН, [SI+10] Opcode,Mem8 . 2-4 a DB2F . ESC WORD PTR 1DH,[ВХ] . Opcode, Meml6 2-4 12 HLT-останов После выполнения команды HLT процессор оста- йавливается и остается в этом состоянии до прихода сигнала RESET по управляющей шине. При установленном в 0 флаге разрешения преры- ваний IF МП возобновляет работу только по сигна- лам немаскируемых прерываний, приходящих на его ®ход NMI. Если флаг 1г установлен в 1, работу мик- ропроцессора возобновляют как маскируемые, так и немаскируемые прерывания, поступающие на вход SNT. Команда HLT не воздействует на флаги и не -имеет операндов. - . Пример Во многих микро-ЭВМ предусмотрены средства са- модиагностики для проверки компонентов аппаратно- го обеспечения в начале работы системы. Следующая 158
последовательность команд осуществляет проверку внутренних регистров микропроцессора 8088 и пре- кращает выполнение программы, если он неисправен; MOV SAHF AH.0C5H Подготовить новое зна* чение регистра флагов процессора Остановить флаги SF, ZF, PF, CF в 1 JNC ERROR Проверить флаг пере- носа JNP ERROR Проверить флаг пари- тета JNS ERROR Проверить флаг знака JNE ERROR Проверить флаг нуля NO-ERROR: JMP CONTINUE Продолжить выполнение ERROR: HLT Остановить неисправный процессор Таблица перевода 1-й байт 16-- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда F4 1111 0100 операнда нет Пример записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты F4 HLT операнда нет | 1 2 IDIV-целочисленное деление Однобайтовое деление (АХ): (Операнд) Если ((АХ):(Операнд) >к4-127), то вырабатывается прерывание типа 0 Если ((АХ):(Операнд)<:—127), то вырабатывается прерывание типа 0 , AL) ч------частное ((АН) •*---остаток Двухбайтовое деление (DX.AX): (Операнд)1 Если ((DX.AX): (Операнд) >_ 32767), то вырабатыва- ется прерывание типа 0 159
Если ((DX,AX): (Операнд) <—32767), то вырабаты- вается прерывание типа О (АХ) •*-----частное (DX) *-----остаток По этой команде выполняется знаковое деление содержимого аккумулятора на операнд. При однобай- товом делении содержимое регистра АХ интерпрети- руется как 16-разрядное делимое со знаком. При двухбайтовом делении 32-разрядное делимое со зна- ком находится в паре регистров DX,AX, причем стар- шие шестнадцать битов содержит регистр DX. Опе- ранд может быть записан в регистр общего назна- чения или ячейку памяти, содержимое которых в зависимости от типа операции интерпретируется как 8- или 16-битовый делитель со знаком. В случае однобайтового деления частное записы- вается в регистр AL, а остаток — в регистр. АН. При двухбайтовом делении регистры АХ и DX использу- ются для хранения частного и остатка соответственно. Оба результата рассматриваются как числа со зна- ком. После выполнения команды IDIV состояние ре- гистра флагов процессора не определено. Если значе- ние частного выходит за диапазон [—127, 4-127] при однобайтовом делении и [—32767, -£-32767] при двух- байтовом или при попытке деления на нуль, то авто- матически генерируется прерывание типа 0. В этом случае частное и остаток не определены. В ячейках памяти с абсолютными адресами 00000Н и 00003Н содержится информация, определяющая командный сегмент и перемещаемый адрес процедуры обработки прерывания типа 0. Дробное частное уменьшается до целого числа. Остаток имеет тот же знак, что и дели- мое. Пример Пусть регистр АХ содержит число 0049Н, регистр BL — число 12Н и выполняется команда IDIV BL. Частное от деления (04Н = 49Н/12Н) записывается в регистр AL, а остаток 01Н—-в регистр АН. Рассмотрим случай, когда регистры DX и АХ со- держат коды FFFFH и F043H, рассматриваемые как одно 32-битовое шестнадцатеричное число FFFFF043H, регистр ВР содержит число 0240Н и выполняется
команда IDIV ВР. Частное от деления (FFFAH =1 = FFFFF043H/0240H) записывается в регистр АХ, а остаток (FDC3H) — в регистр DX. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О I I I I М I I 1ЦИ И 1»1 |у| OF DF IF TFSFZF AF PF' CF Таблица перевода 1-й байт 16* двоичная ричная 2-й байт байты 3, 4t 5, 6 формат операнда Гб 1111 ОНО Г7 1111 2111 Mod-010-й» Mod-010-Ли Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8 Regl6/Meml6 Примеры записи на языке ассемблера машинный -КОД команда ассемблера формат операнда байты такты F6FD IDIV CH Reg8 2 101-112 F63D IDIV BYTE PTR [DI] Mem8 2-4 (1O7-118)+EA F7FA IDIV DX Reg 16 2 165-184 F73EOO2O IDIV WORD PTR XNUM Mem 16 2-4 (175-194)+EA IMUL-целочисленное умножение Однобайтовая операция (АХ) --------(AL) • (Операнд) Если (АН) ш знаковое расширение (AL), то (CF) •*------О (OF) •*------О Если (АН)#знаковое расширение (AL), то (CF) •*----1 (OF) ч-------1 Операция со словами (DX,AX) •*-------(АХ) * (Операнд) Если (DX) =s знаковое расширение (АХ), то <CF) •*------О (OF) *-------- О Если (DX) # знаковое расширение (АХ), то (CF) ч-----— 1 (OF) *-------1 По команде IMUL выполняется знаковое умноже- ние содержимого аккумулятора на операнд. Если операнд представлен байтом, то он умножается на содержимое регистра AL и результат (16 бит) запи- 6 л Дао 151
сывается в регистр АХ. Если операнд является ело-' вом, он умножается на содержимое регистра АХ и ре- зультат (32 бит) записывается в пару регистров DX, АХ, причем старшие 16 бит записываются в ре- гистр DX. Операнд может быть записан в регистр об- щего назначения или в ячейку памяти и интерпрети- руется как число со знаком. Если разрядность содержимого регистра АН при однобайтовом умножении не совпадает с разрядно- стью регистра AL или разрядность содержимого ре- гистра DX не совпадает с разрядностью регистра АХ при двубайтовом умножении, то флаги переноса CF и переполнения OF устанавливаются в 0. Состояние флагов AF, PF, SF и ZF после выполнения умножения не определены. Установка CF и OF в 1 означает, что регистры АН или DX содержат значащие разряды результата. Пример Пусть регистр AL содержит число ЗОН, регистр CL — число 02Н и выполняется команда IMUL CL. Результат умножения (60Н = 30Н*2Н) записывается в регистр АХ. Так как содержимое регистра АН яв- ляется расширением знакового бита регистра AL, то флаги CF и OF сброшены в 0. Пусть регистр АХ содержит число 0240Н, регистр ВХ — число F202H и выполняется команда IMUL ВХ. Результат (FFE08480H = 240H*F202H) записывается в регистры DX и АХ. Так как новое содержимое ре- гистра DX (FFE0H) не совпадает с расширением зна- кового бита регистра АХ (8480Н), то флаги CF и ОЕ установлены в 1. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 f О I I I I И I I luM Н I°I 14 OF DF IF TF SF ZF AF FE CF , Таблица перевода }1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, ОрсформагшаЬ операнда F6 1111 0110 Mod-010-Rm Disp-Lo,Disp-Hi Reg8/Mem8 F7 1111 1111 Mod-01О-Rm Disp-Lo,Disp-Hi Regl6/Meml6 162
Примеры записи на языке ассемблера машинный код команда ассемблера * 1 форматоперанда байты такты F6ED IMUL СИ Keg8 2 80-98 F62C IMUL BYTE PTR [SI] ’ Mem8 2-4^(8C-104)+EA F7ED IMUL BP Fegl6 2 '128-154 F72EOO1O IMUL WORD PTR COUNT Meml6 2-4 (138-164)+EA SN-ввод из порта (Аккумулятор) -*-----(Порт ввода-вывода) По команде IN осуществляется передача байта или слова из порта ввода-вывода в регистр AL или АХ .соответственно. Адрес порта /от 0 до 255) может быть указан в виде константы. Если для задания ад- реса порта используется регистр DX, его содержимое позволяет адресоваться к 65536 различным портам. [Команда IN не влияет на содержимое регистра фла- гов. Пример Если байт текущего состояния печатающего ус-? тройства находится в порту ввода 37АН, то микро- ЭВМ может определить готовность устройства к при- ему для печати нового символа. Если признаком го- товности устройства является равенство нулю самого старшего разряда введенного байта состояния, то определить момент передачи символа в порт устрой- ства вывода для печати можно с помощью следующей последовательности команд: MOV DX.37AH ;3аписать адрес порта WAIT: IN AL.DX ;ввода-вывода в регистр :DX ;В вести байт состояния TEST AL.8OH ;из порта проверить готовность JNE WAIT ;печати (7 разряд равен 1) Устройство печати еще READY: CLC 6* 163 ;занято
Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда Е4 1110 0100 Е5 1110 0101 ЕС 1110 1100 ED 1110 1101 Data8 Data8 AL,Inuned8 AX,Immed8 AL.DX AX.DX Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты Е420 IN AL,20H AL,Immed8 2 10 Е52О IN AX,20H AX,Immed8 2 14 EC IN AL,DX AL,DX 1 8 ED IN AX,DX AX,DX 1 12 INC-инкремент (Операнд) ------(Операнд) + 1 По этой команде исходный операнд увеличивается на 1. Операнд может быть задан в регистре общего назначения или в ячейке памяти. Сегментные регист- ры не могут быть использованы для хранения опе- рандов. Команда INC может использоваться как с однобайтовыми, так и двухбайтовыми операндами. Операнды интерпретируются как числа без знака. Команда воздействует на флаги AF, OF, PF, SF и ZF. Пример Пусть регистр ВХ задает двухбайтовую область памяти с содержимым FE00H и выполняется команда INC WORD PTR, [ВХ]. Новым содержимым памяти после выполнения команды будет число FE01H. Так как результатом операции является отрицательное, отличное от нуля число в дополнительном коде, то флаг SF установлен в 1, а флаг ZF — в 0. Наличие только одного отличного от нуля разряда й младшем байте слова обусловливает сброс флага паритета в 0, 164
Флаги, затрагиваемые операцией 15 14 13 12 If 10 9 В 7 € 5 4 3 2 1 0 I I । । м । । ъы мтт OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16 ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда FE 1Ш 1110 FF 1111 1111 0100 Oreg Mod-000-Rm Mod-000-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8 Regl6/Meml6 Regl6 only* Примечание. Формат команды FF Mod-000-Rm не следует исполь- зовать в том случае, когда операнд содержится в 16-разрядном регистре. Более эффективен в этом случае формат 0100 OReg. Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты FEC5 INC СН Reg8 2 3 FE04 INC BYTE PTR (SI] Men>8 2-4 15+EA 45 INC BP Regl6 1 2 FF4701 INC WORD PTR (BX+01J Meml6 2-4 23+EA й NT-программное прерывание (SP) •*----(SP) —2 (Вершина стека) -------(Регистр флагов) (SP) **----(SP) — 2 (Вершина стека) -------(CS) (SP) •«----(SP)—2 (Вершина стека) •*------(IP) (IF) <------0 (TF) ------О (CS) ------(Тип прерывания -X* 4-|-2) (IP) •*----(Тип прерывания -X* 4) По команде INT выполняется передача управления программе обработки прерываний, адрес которой 165
генерируется соответственно типу прерывания. Теку-* щее состояние микропроцессора, а именно содержимое регистра флагов, кодового регистра CS и указателя команд IP, записывается в стек. Это позволяет осу- ществлять выход из процедуры обработки прерыва- ния с помощью команды IRET (выход из прерыва- ния) с последующей передачей управления очередной выполняемой команде. Флаги IF и TF сбрасываются в 0, что предотвращает возможность прохождения маскируемых и пошаговых прерываний. Абсолютное значение адреса вектора прерывания, соответствующего типу прерывания, который опреде- ляется операндом команды INT, вычисляется умно- жением кода типа прерывания на четыре. Содержи- мое двойного слова в этой области памяти передается соответственно в регистры IP и CS. Пример Пусть содержимое регистра CS равно 04В5Н; ре- гистр IP содержит число 32D0H, а регистр SP — чис- ло FFDDH. Ячейки памяти с абсолютными адресами 0048Н и 004АН содержат числа 1000Н и 04С5Н соот- ветственно. При этом выполняется следующая после- довательность команд: INT 12Н NEXT: CLC При входе в программу обработки прерывания со- держимым регистра SP будет число FFD7H, регистра; CS — число 04С5Н, а регистра IP — число 1000Н. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О ГI I I I I l°l°l I I I I I !~П OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й бейт 16- ричная двоичная 2-й байт байты 3, 4* 5, 6, формат операнда СС 1100 1100 CD П00 1101 ТИП ТИПЗ Inuned8* 166
Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты СС INT 3 ТИПЗ 1 52(72) CD21 INT 21Н Inmed8 2 51(71) Примечание. Для прерывания типа 3 более эффективным является машинный код ССН (1100 1100). В скобках указано число тактов для операций со словами. HNTO-прерывание по переполнению (SP) •*------(SP) —2 (Вершина стека) ч--------(Регистр флагов) (SP) ч--------(SP) — 2 (Вершина стека) ч-----(CS) (SP) ч--------(SP) — 2 (Вершина стека) ч-----(IP) (IF) ч-----о (TF) ч-----о (CS) ч-----(12Н) (IP) ч------(ЮН) По команде INTO и вектору прерывания, находя- щемуся в ячейке памяти с абсолютным адресом ООО ЮН, в том случае, если флаг переполнения OF установлен в 1, осуществляется передача управления процедуре обработки прерывания (тип 4). Текущее состояние регистров микропроцессора CS, IP и ре- гистра флагов записываются в стек. Такая организа- ция позволяет осуществить с помощью команды IRET( (выход из прерывания) выход из процедуры обработ- ки и передачу управления следующей за INTO коман- де. Флаг разрешения прерываний IF и флаг TF сбра- сываются в нуль, что позволяет исключить приход ма-. скируемых и пошаговых прерываний. Пример Пусть в регистре AL записано число ЗОН, регистр CL содержит число 20Н и выполняется следующая последовательность команд: MUL CL INTO 167
Поскольку результат умножения устанавливает флаг OF в 1, при выполнении команды INTO генерив руется прерывание четвертого типа. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 В 5 4 3 2 1 О 1111 11 i.i.i in । rm OF DF IF TF SF ZF , AF PF CF , Таблица перевода 1-й байт 16- ричнаядвоичная 2-й байт бейты 3, 4, 5, 6, формат операнда СЕ 1100 1110 операнда нет Примеры записи на языке ассемблера фашинный код команда ассемблера формат операнда байты такты | СЕ INTO операнда нет 1 53(73) or 4 Примечание. Если прерывания не происходят, команда занимает четыре такта. В скобках указано число тактов для операций со сло- вами. - * IRET-возврат из прерывания (IP) ч------(Вершина стека) (SP) -------(SP) + 2 (CS) •*-----(Вершина стека) (SP) -е-----(SP) + 2 (Регистр флагов) •*-----(Вершина стека) (SP) <------(SP) + 2 Команда IRET осуществляет обратную передачу управления в место прерывания, восстанавливая по информации из стека содержимое регистров IP, CS и регистра флагов. Любая процедура обработки преры- ваний должна заканчиваться командой IRET. Флаги, затрагиваемые операцией 15 U 13 12 П 10 9 8 7 6 5 4 3 2 1 0 Illi |х Iх|х|х|хIXI |х| |х| 1x1 OF OF IF TF SF ZF AF PF CF 168
Таблица перевода 1-й байт 16- ричная двоичная? 2-й байт байты 3, 4, 5, 6, формат операнда CF 1100 1111 операнда нет Примеры записи на языке ассемблера машинный ' код команда ассемблера формат операнда байты такты CF IRET операнда нет 1 32(44) Примечание. В скобках указано число тактов для операций со сло- вами. JA/JNBE-переход, если больше/переход, если не меньше или равно Если (CF) = 0 и (ZF) = 0, то (IP) *-(IP) + Disp 8. Команды осуществляют передачу управления по адресу, который задается целевым операндом, при вы- полнении условия одновременного равенства нулю флагов CF и ZF. В противном случае . выполняется следующая команда. Адрес целевого операнда гене- рируется сложением байта смещения с адресом сле- дующей команды. Так как байт смещения представ- ляет собой 8-битовое целое число со знаком, команды могут указывать адрес перехода в диапазоне +127 байт 4--128 байт от последнего адреса команды. Команды удобно использовать при сравнении чисел без знака. Пример Пусть регистр AL содержит число 62Н и выполня- ется следующая последовательность команд: CMP AL,60H JA UPPER RET UPPER: AND AL,5EH Первая команда в этой последовательности осуще- ствляет сброс в нуль флагов CF и ZF. После выпол- нения команды JA UPPER управление передается команде с адресом UPPER и выполняется команда 169
'AND AL.5EH. Это свидетельствует о том, что содер- жимое регистра AL больше шестнадцатеричного чис- ла 60Н. Если регистр AL содержит число 41Н, то в приве- денном , примере в результате выполнения первой команды флаг CF будет установлен в 1 и следующей за командой JA будет выполняться команда RET. Таблица перевода 1 -й байт - - 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда 77 0111 0111 DispS Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7709 JA UPPER-CASE Short-Label 2 4 or 16 77F1 JNBE CONVERSION Short-Label 2 4 or 16 3 A E/J N B/J N С-переход, если больше или равно/переход, если не меньше/переход, если нет переноса Если (CF) = 0, то (IP) <--(IP) + Disp 8. При выполнении условия равенства нулю флага • CF команды передают управление по адресу, задавае- мому целевым операндом. В противном случае выпол- няется следующая команда. Адрес целевого операнда определяется сложением байта смещения с адресом следующей команды. Так как байт смещения есть 8-битовое целое число со знаком, то команды JAE/ JNB/JNC могут передавать управление командам^ с адресом памяти из диапазона -J-127 байтч-128 байт. Команды используются при сравнении чисел без знака.»
Пример Пусть регистр ВХ содержит число D823H и выпол-* няются следующие команды: SUB BXJOOH JAE ERROR CALL NEW RET ERROR: ADD DL.125 Первая команда сбрасывает в нуль флаг CF. По-* еле выполнения второй команды управление переда- ется команде ADD DL.125 с адресом ERROR. Это означает, что содержимое регистра ВХ больше числа 100Н или равно ему. Если в регистре ВХ записано число 0047Н, то в приведенном примере при выполнении первой коман- ды флаг CF будет установлен в единицу и следующей выполняемой командой будет CALL NEW. Таблица перевода 1-й бай* 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, форматоперанда 73 ОШ ООН Disp8 Short-Label Примеры записи на языке ассемблера машинный ^крД — команда ассемблера формат операнда i байты такты 7309 JAE SAVE_DATA Short-Label 2 4 or 16 73F1 JNB PROGRAM Short-Label 2 4 or 16 73ЕО JNC END Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 такто! JB/JNAE/JC-переход, если меныие/переход, если не больше или равно/переход, если есть перенос Если (CF)=1, то (IP) -«-(IP) + Disp 8. Команды передают управление по адросу, задач, ваемому целевым операндом, при условии^ чтр флас 171
переноса CF установлен в 1. В противном случае вы- полняется следующая по очереди команда. Так как байт смещения есть 8-битовое целое число со знаком, то команды JB/JNAF/JC могут передавать управле- ние командам с адресами из диапазона 4-127 байт Н---128 байт от последнего адреса команды пере- хода. Пример Пусть регистр AL содержит 00, однобайтовая ячей- ка памяти TEST-BIT содержит 1 и выполняется сле- дующая последовательность команд! СМР JB AND RET PARITY: HLT AL,TEST-BIT PARITY DL,AL Команда CMP AL,TEST-BIT устанавливает флаг CF в 1. После выполнения второй команды управле- ние передается команде с адресом PARITY, т. е. команде HLT. Это означает, что содержимое регистра AL меньше содержимого ячейки памяти TEST-BIT- Если регистр AL и ячейка памяти TEST-BIT содер- жат одно и то же число 00, то при выполнении первой команды флаг CF будет сброшен в 0 и будет выпол- няться следующая команда — AND AL.DL. Таблица перевода ♦1-й байт 16- ричная1двоичная 2-й байт байты 3, 4, 5, 6, формат операнда 72 ОШ 0010 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7209 JB CHECKJRROR Short-Label 2 4 or 16 72FI JNAE ENDJOW Short-Label 2 4 or 16 , 72Е0 JC .QUIT Short-Label 2 4 or 16 172
J В E/J NA-переход, если меньше или равно/переход, если не больше Если (CF)=1 или (ZF)==1,to (IP) •*----(IP) + Disp 8. Команды передают управление по адресу, задавае- мому целевым операндом, при условии, что флаг пере- носа CF или флаг нуля 2F установлены в 1. В против- ном случае выполняется следующая по очереди команда. Адрес целевого операнда вычисляется сло- жением байта смещения с адресом следующей команды. Так как смещение есть 8-битовое целое чис- ло со знаком, то команды JBE/JNA могут передавать управление командам с адресами из диапазона + 127 байт 4--128 байт от последнего адреса коман- ды перехода. Команды JBE/JNA оказываются Полез-s ными при сравнении целых чисел со знаками. Пример Пусть двухбайтовая ячейка памяти NEW-DATA содержит число 0001Н и выполняются команды CMP WORD PTR NEW-DATA.01 JBE FOUND CLD RET FOUND: AND AL ,00 Так как оба операнда первой команды равны друг другу (оба равны 01), то после ее выполнения будет установлен в единицу флаг ZF. После выполнения второй команды управление будет передано по адресу FOUND, где находится команда AND AL,00, выпол- няемая следующей за JBE FOUND командой. Это означает, что содержимое двухбайтовой ячейки памя- ти NEW-DATA меньше или равно значению второго операнда (в данном случае 1). Если в ячейке памяти NEW-DATA содержится число 0024Н, то произойдет переход к команде CLD. Таблица перевода 1-й байт . 16- ричная двоичная 2-й байт байты 3, 4, б, 6, формат операнда 76 0111 ОНО 'Disp8 Short-Label 178
Примеры записи на языке ассемблера машинный код команда ассемблера1 формат операнда байты такты 7609 JBE SAVEJDATA Short-Label 2 , 4 ©г 16 76F0 JNA PROGRAM Short-Label 2' 4 ©г 16 Примечание» При выполнении перехода команда занимает 16 тактов* UCXZ-переход, если содержимое регистра СХ равно нулю Если (СХ) = 0, то (IP) •*— (IP) + Disp 8. Команда передает управление по адресу, задавае- мому целевым операндом, при условии, что содержи- мое регистра СХ равно 0. В противном случае выпол- няется следующая за JCXZ команда. Адрес целевого операнда вычисляется сложением байта смещения с адресом следующей команды. Так как смещение есть 8-битовое целое чило со знаком, то команда может указывать адрес перехода в диапазоне J-127 байт -п —128 байт от конца команды. Пример Пусть в регистре СХ содержится число 0001Н и Выполняется следующая последовательность команд: . DEC сх JCXZ SKIP-REPEAT CALL REPEAT RET SKIP-REPEAT: STD Первая команда уменьшает содержимое реги- стра СХ до 0. После выполнения второй команды управление будет передано команде STD с адресом SKIP-REPEAT. . Таблица перевода Ьй байт 16- ' ричная двоичная 2'й байт байты 3, 4< 5, 6, формат операнда ЕЗ 1110 0011 Disp8 <• Short-Label 174
Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты E3DO JCXZ SKIPJjOOP Short-Label 2 • 6 or 18 Примечание. При выполнении перехода команда занимает 18 тактов# JE/JZ-переход, если равно/переход по нулю Если (ZF)=1, то (IP) ч----(IP) + Disp 8. Команды передают управление по адресу, задавае- мому целевым операндом при условии равенства еди- нице флага ZF. В противном случае выполняется следующая команда. Адрес целевого операнда опреде-. ляется сложением байта смещения с адресом следую- щей команды. Так как смещение есть 8-битовое целое число со знаком, то команды могут указывать адрес перехода в диапазоне +127 байт-h—128 байт от кон- ца команды. Пример Пусть в регистре АХ записано число FFFFH и вы* полняется следующая последовательность команд: OUTPUT: INC JE ADD RET CLD AX OUTPUT AX,4000H Первая команда устанавливает флаг ZF в I. По- сле выполнения команды JE OUTPUT управление пе- редается по адресу OUTPUT, в котором находится команда CLD. Это означает, что новое содержимой регистра АХ равно нулю. Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда ‘ 74 ОШ 0100 Disp8 Short-Label 475
Примеры записи на языке ассемблера » машинный код — , команда ассемблера Формат операнда байты такты 7420 JE NO_ERROR Short-Label 2 4 or 16 74D1 JZ NOTJWRANING Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. {JG/JNLE-переход, если больше чем/переход, если не меньше чем или равно Если ((SF) = (OF) AND (ZF) = 0), то (IP) ч---(ip) 4. DiSp8. Команды передают управление по адресу, задавае- мому целевым операндам, при условии одновременного равенства значений флагов SF и OF и равенства нулю флага ZF. В противном случае выполняется следую- щая по очереди команда. Адрес целевого операнда вычисляется сложением байта смещения с адресом следующей команды. Так как смещение есть 8-битовое -целое число со знаком, то команды JG/JNLE могут указывать адрес перехода в диапазоне +127 байт+ Н---128 байт от конца команды. Команды полезны при сравнении чисел со знаком. Пример Пусть регистр SI содержит число 0020Н, регистр DX — число FF23H и выполняется следующая после- довательность команд: CMP SI.DX JG SAME STD RET SAME: CLD После выполнения первой команды все три флага SF, ZF и OF сбрасываются в нуль. После выполнения команды JG SAME управление передается, команде CLD по адресу SAME. Это означает, что содержимое регистра SI (положительное шестнадцатеричное чис- ловой) больше, чем содержимое регистра DX (отри- цательное шестнадцатеричное число FF23H) , 176
Таблица перевода 1-й байт 16- ричнаядвоичная 2-й байт байты 3, 4, 5, 6, формат операнда 7F 0111 1111 Disp8 Short-Label Примеры записи на языке ассемблера машинный 1 код команда ассемблера формат операнда байты такты 7F0C JC шт_ихв Short-Label . 2 4 or 16 7FB0 JNLE NEXT-ARGUMENT Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. OGE/JNL-переход, если больше или равно/переход, если не меньше чем Если (SF) = (OF), то (IP) •*-(IP)4-Disp8. Команды осуществляют передачу управления по адресу, задаваемому целевым операндом, при. усло- вии, что значения флагов SF и OF не равны. В про- тивном случае выполняется следующая по очереди команда. Адрес целевого операнда вычисляется сло- жением байта смещения с адресом следующей коман- ды. Так как смещение есть 8-битовое целое число со знаком, то команды JGE/JNL могут указывать адрес перехода в диапазоне 4-127 байт ч-128 байт от кон- ца команды. Эти команды полезно использовать при сравнении чисел со знаком. Пример Пусть регистр АХ содержит число 0020Н и выпол-' няется следующая последовательность команд; DEC АХ JGE UNSIGN CLC RET UNSIGN: INC ВР : После выполнения первой команды в регистре АХ будет находиться положительное, отличное от нуля, .число. Следовательно, флаги SF и OF будут сброшены . 177
в 0. После выполнения команды JGE UNSIGN управ- ление будет передано по адресу UNSIGN и начнется выполнение команды INC ВР. Это означает, что со- держимое регистра АХ не меньше нуля. Пусть регистр АХ содержит число FF00H. Тогда в приведенном примере после выполнения первой коман- ды будет установлен в 1 флаг SF и в отличие от пре- дыдущего варианта после команды JGE UNSING бу- дет выполнена команда CLC. ' Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 70 ОШ 1101 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат Операнда байты такты 7D0C JGE NOW Short-Label г 4 or 16 7DB2 JNL NEXTARGUMENT Short-Label 2 ' 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов# JL/JNGE-переход, если меньше/переход, если не больше или равно Если (SF)#(OF), то (IP) <---(IP) + Disp8. Команды передают управление по адресу, задавае- мому целевым операндом, при условии, что флаги SF и OF не равны. В противном случае выполняется сле- дующая по очереди команда. Адрес целевого операн- да вычисляется сложением байта смещения с адресом следующей команды. Так как смещение есть 8-бито- вое целое число со знаком, то команды JL/JNGE могут указывать адрес перехода в диапазоне 4-127 байт-;--128 байт от конца команды. Эти команды полезно использовать при сравнении чисел со знаком. 178
’Пример ’ Пусть регистр гистр DX — число команды: СМР JL CLC RET CHECK; AND АХ содержит число FFFFH, ре- 0002Н и выполняются следующие AX.DX CHECK АХ, 00 Первая команда устанавливает флаг SF в 1, а флаг OF в 0. После выполнения команды JL CHECK упра- вление передается по адресу CHECK и выполняется команда AND АХ.00. Это означает, что содержимое регистра АХ меньше содержимого регистра DX. Если регистр АХ содержит число 0124Н, а регистр DX — число 0020Н, то после выполнения первой команды флаги SF и OF будут сброшены в 0 и вме- сто перехода по адресу CHECK будет выполняться следующая за JL команда CLC. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4t 5, 6, ' формат операнда 7С ОШ 1100 DispS Short-Labe! Примеры записи на языке ассемблера машинный код команда ассемблера формаг операнда байты такты 7CD2 JL LASTJ3PT10N Short-Label 2 4 or 16 7С05 JNGE NEXTSECTI01T Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. 3LE/JN G-переход, если меньше или равно/переход, если больше Если (SF)#(OF) или (ZF)=1, то (IP) ----(IP) + Disp8. Команды передают управление по адресу, задавае- мому целевым операндом, при условии, что флаги SF и OF не равны или если флаг ZF установлен в 1. В про- тивном случае выполняется следующая по очереди. 179
команда. Адрес целевого операнда вычисляется ело* жением байта смещения с адресом следующей команды. Так как смещение представляет собой 8-би- товое целое число со знаком, то команды JNE/JNG могут передавать управление по адресу в диапазоне + 127-i—128 байт от конца команды. Эти команды полезно использовать при сравнении чисел со знаком. Пример Пусть в регистре СХ записано число D700H, в ре- гистре ВР — число 0124Н и выполняется следующая последовательность команд: NEXT: СМР СХ,ВР JLE NEXT AND AL, 00 RET ADD AX, 127 Первая команда устанавливает флаг SF в 1 и сбрасывает флаг OF в 0. После выполнения второй команды управление передается по адресу NEXT и выполняется команда ADD АХ, 127. Это означает, что содержимое регистра СХ не больше содержимого ре- гистра ВР. Если регистр СХ содержит число 0125Н, регистр ВР — число 0124Н, то первая команда сбросит в 0 оба флага SF и OF и вместо передачи управления по ад- ресу NEXT следующей выполняемой командой будет AND AL,00. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 7Е ОШ 1110 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты - 7Е25 JLE LAST_CHAR Short-Label 2 4 ог 16 - 7ED3’ JNG NEXTLETTER Short-Label 2 4 or Примечание; При выполнении перехода команда занимает 16 тактов,- 180'
JMP-безусловныи переход Межсегментный переход: (CS) •*--сегмент целевого операнда, 0Р) ч----перемещаемый адрес целевого операнда При внутрисегментном переходе: 0Р) ч----перемещаемый адрес целевого операнда. Команда осуществляет безусловную передачу уп- равления в одном из пяти различных форматов: вну- трисегментном прямом, внутрисегментном прямом укороченном, внутрисегментном косвенном, межсег- ментном прямом и межсегментном косвенном. Внутрисегментная команда выполняет передачу управления по целевому адресу внутри текущего 64-килобайтового командного сегмента. Другими сло- вами, целевой адрес должен быть расположен в диа- пазоне +32767 байт 4--32768 байт от команды JMP, Межсегментная команда с прямой адресацией мо- жет передавать управление по любому адресу внутри всего мегабайтового адресного пространства микро- процессора 8088. При внутрисегментной команде с прямой адреса- цией адрес целевого операнда получается сложением содержимого регистра IP с величиной 16-битового смещения, задаваемого в команде. В том случае, когда целевой операнд находится в диапазоне + 127 байт 4--128 байт от команды JMP, можно ис- пользовать вариант команды JMP укороченного фор- мата с прямой адресацией. В этом формате к содер- жимому регистра IP прибавляется значение 8-битово- го смещения, которое задается в команде. В межсегментных командах JMP с косвенной адре- сацией в качестве операндов, содержимое которые задает адрес целевого операнда, используются 16-би- товые регистры общего назначения (АХ, ВХ, СХ, DX, SI, DI, ВР, SP) или двухбайтовая ячейка памяти. Межсегментные команды JMP содержат адрес ко- мандного сегмента и значение перемещаемого адреса целевого операнда как часть команды, которая при выполнении команды JMP переписывается в регист- ры CS и IP. Предыдущее содержимое этих регистров теряется. В межсегментных командах JMP с косвен- 181
ной адресацией для записи операнда может быть1 использована ячейка памяти. В этом случае при выпол- нении команды JMP в регистры CS и IP переписыва- ется содержимое двойного слова памяти. Пример В языке ассемблера микропроцессора 8088 опера-' торы FAR PTR или DWORD PTR используются для обозначения межсегментных команд JMP с прямой адресацией и косвенной соответственно. Если в опера- торе не заданы атрибуты, то ассемблер генерирует машинный код, соответствующий формату внутрисег- ментной команды. Для явного определения внутрисег- ментной команды JMP укороченного типа с прямой адресацией используется команда SHORT4 Межсегментные команды JMP MOV AL,00 JMP FAR PTR NEXT-PAGE Другие команды JMP DWORD PTR [BX] Другие команды NEXT-PAGE: CMP AX,00 Другие команды Внутрисегментные команды MOV AL,00 JMP SHORT NEXT-LINE Другие команды NEXT-LINE: CLC Другие команды SAME-LINE: AND AL,00 Другие команды JMP SAME-LINE Таблица перевода 1-й байт 16- дво- ричная ичная 2-й байт байты 3, 4, 5, 6 формат операнда Е9 Ш0 1001 IP-Inc-Lo IP*Inc-Hi Near-Label ЕА. 1110 1010 Offset-La Offset-Hi Fat-Label Seg-Lo,Seg-Hi ЕВ 1110 1011 IP-Inc8 Short-Label FF 1111 1111 Mod-100-Ки Regl6/Me.l6 vet Men 1 Ct FF 1111 1111 Mod-101-Rm Меи1б only межсегментный 182
Примеры записи на языке ассемблера машинный код команда ассемблера: формат операнда байты такты Е9ОО2О JMP NEXT_PROC Near-Label 3 15 , машинный код команда ассемблераi • формат- .операнда: байты такты * EAOO12OOFO .JMP FAR PTR.nCR Far-Label 5 15 ЕВ22 JMP SHORT ШТ Short-Label 2 15 FFE3 JMP BX Regl6 (Intra) 2 11 FF6404 JMP VORD PTR. ISI+04] Меяр1б (Intra) 2-4 18+EA FF6EO1. JMP DWORD PTR [BP+1] МеирХб (Inter) 2-4 24+EA JNE/JNZ-переход по неравенству/переход, если не нуль Если (ZF) = 0, то (IP) *-(IP) + Disp8. Команды осуществляют передачу управления по .адресу, задаваемому целевым операндом, при усло- вии, что флаг ZF равен 0. В противном случае выпол- няется следующая команда. Адрес целевого операнда определяется сложением байта смещения с адресом следующей команды. Поскольку байт смещения пред- ставляет собой 8-битовое целое число со знаком, эти команды могут выполнять передачу управления по ад- ресам в диапазоне -f-127—128 байт от конца команды. Пример Пусть регистр ВХ содержит число 0457Н и выпол-. ияется следующая последовательность команд; DEC ВХ JNE OUTPUT ADD АХ.4000Н RET OUTPUT; CLD Первая команда сбрасывает в 0 флаг ZF. После выполнения команды JNE OUTPUT управление пере- дается по адресу OUTPUT, по которому расположена следующая выполняемая команда CLD. Это означает, .что содержимое регистра ВХ не равно нулю, 183
Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда 75 0111 0101 DispO Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7508 JNE ERR0RJ30DE Short-Label 2 4 or 16 75Е2 JNZ ERRORJCHECK Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. J NO-переход, если нет переполнения Если (OF) = 0, то (IP) •*--(IP) + Disp8. Команда передает управление по адресу, задавае- мому целевым операндом, при условии равенства нулю значения флага OF. В противном случае выпол- няется следующая команда. Адрес целевого операнда определяется сложением байта смещения с адресом следующей команды. Поскольку байт смещения пред- ставляет собой 8-битовое целое число со знаком, то команда JNO может осуществлять передачу управ- ления по адресам в диапазоне 4-127 байт 4 128 байт от конца команды. Пример Пусть содержимое регистра АХ равно 6800Н, ре- гистра ВХ — 1000Н и выполняется следующая после- довательность команд: ADD AX,BX JNO NOT-YET ADD AX, 256 RET NOT_YET: CLD Первая команда сбрасывает в 0 флаг OF. После выполнеия команды JNO NOT-YET управление передается по адресу NOT-YET, где расположена команда CLD, Это означает, что результат сложения, 184
выполненного по команде ADD АХ,ВХ, не выходит за разрядную сетку регистра АХ. Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда 71 0111 0001 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7190 JNO SUMCHECK Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. JNP/JPO-переход при отсутствии четности Если (PF) = 0, то (IP) *-(IP)4-Disp8. Команды осуществляют передачу управления по адресу, задаваемому целевым операндом, при усло- вии, что флаг PF равен 0. В противном случае выпол- няется следующая команда. Адрес целевого операнда определяется сложением байта смещения с адресом следующей команды. Поскольку смещение представ- ляет собой 8-битовое целое число со знаком, то коман- ды JNP/JPO могут передавать управление командам с адресами в диапазоне + 127 4^,—128 байт от конца команды перехода. Пример Пусть в регистре ВР содержится шестнадцатерич- ное число 7Е07Н (0111 1110 0000 0111 в двоичном представлении) и выполняется следующая последова- тельность команд: СМР ВР,00 JNP NEXT-WORD CLC RET NEXT-WORD: CALL ROTATE-BIT При выполнении команды CMP BP,00 флаг PF сбрасывается в 0. После выполнения следующей команды управление передается команде CALL RO- 185
TATE-BIT, находящейся по адресу NEXT-WORD. Это обстоятельство указывает на то, что число единичных битов в младшем байте регистра ВР нечетное (в дан- ном примере три таких бита). Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 7В ОШ 1011 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7В47 JNP BADPARITI Short-Label 2 4 or 16 7BF2 JPO СНЕСГВ1Т Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов.- UN S-переход, если нет знака Если (SF) = O, то (IP) ч---(IP) + Disp8. Команда передает управление по адресу, задавае- мому целевым операндом, при условии, что флаг знака SF установлен в нуль. В противном случае выпол- няется следующая по порядку команда. Адрес це- левого операнда вычисляется сложением байта сме- щения с адресом следующей команды. Поскольку смещение есть 8-битовое целое число со знаком, то команда JNS может осуществлять передачу управле- ния по адресам в диапазоне +127 байт+,—128 байт от конца команды. Пример Пусть в регистре АХ содержится число 7800Н и выполняется следующая последовательность командз СМР АХ,оо JNS POSITIVE CLD IRET POSITIVE: STD 186
Команда CMP АХ,00 в этом примере сбрасывает флаг SF в нуль. После выполнения команды JNS PO- SITIVE управление передается по адресу POSITIVE, где находится команда STD, которая является сле- дующей выполняемой командой. Значение флага SF указывает на то, что старший бит числа в регистре Ах равен улю, т. е. содержимое регистра АХ есть по- ложительное двоичное число. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат’операнда 79 ОШ 1001 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблерах формат операнда байты такты 7945 JNS PEAL-ADJUST Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов* JO-переход по переполнению Если (OF)=1, то (IP) ч-----(IP) + Disp8. Команда осуществляет передачу управления по адресу, задаваемому целевым операндом, при усло- вии, что флаг переполнения OF установлен в едини- цу. В противном случае выполняется следующая команда. Адрес целевого операнда определяется ело-, жением байта смещения с адресом следующей коман- ды. Так как смещение представляет собой 8-битовое целое число со знаком, то команда может передавать управление по адресу в диапазоне ^-127 байт-*7' 4---128 байт от конца команды. Пример Пусть регистр АХ содержит число 7800Н, регистр ВХ — число 7627Н и выполняется следующая после- довательность команд: ADD JO AX,BX NEXT-FRAME AND DL.00 RET NEXT-FRAME: ADD AX,4000H 187
Первая команда в этом примере . устанавливает флаг OF в единицу. После выполнения команды JO NEXT-FRAME управление передается по адресу NEXT-FRAME, где находится команда ADD АХ,4000Н, которая является следующей выполняемой командой. Это обстоятельство указывает на то, что результат, сложения не умещается в разрядную сетку регистра АХ, т. е. превышает 16 бит. Таблица перевода 1-й байт 16- „ Двоичная ричнан 2-й байт байты 3,4^ формат операнда 70 ОШ 0000 DispS Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 7023 JO JKHJTET Short-Label 2 4 of 16 Примечание. При выполнении перехода команда занимает 16 тактов. JP/JPE-переход по четности Если (PF)= 1, то (IP) ч----(IP) + Disp8. Команды осуществляют передачу управления по адресу, задаваемому целевым операндом, при усло- вии, что флаг паритета PF равен 1. В противном слу- чае выполняется следующая команда. Адрес целевого операнда определяется сложением байта смещения с адресом следующей команды. Так как смещение пред- ставляет собой 8-битовое целое число со знаком, то команды могут передавать управление по адресам в диапазоне +127 байт-;------128 байт от конца команды. Пример Пусть содержимое регистра АХ равно 0007ЕН ’(0000 0000 0111 1110 в двоичном представлении) и вы- полняется следующая последовательность команд: СМР АХ,00 JP NEXT-BIT CLC RET NEXT-BIT: CALL ROTATE-BIT 188
В этом примере первая команда устанавливает в !1 флаг PF. После выполнения второй команды управ- ление передается команде CALL ROTATE с адресом ROTATE-BIT. Это обстоятельство указывает на то, что число отличных от нуля битов в младшем байте регистра АХ четное (в этом примере оно равно 6). Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 7A 0111 1010 Disp8 Short-Label Примеры записи на языке ассемблера пашинный код 1 команда ассемблера формат операнда байты такты 7Л2О JP GOODJARITT Short-Label 2 4 or 16 7 ADO JPE PARITYjCHECK Short-Label 2 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов- US-переход по знаку Если (SF)= 1, то (IP) ч---(IP) + Disp8. Команда осуществляет передачу управления по адресу, задаваемому целевым операндом, при условии, что флаг SF равен 1. В противном случае выполняет- ся следующая команда. Адрес целевого операнда вы- числяется сложением байта смещения с адресом сле- дующей команды. Так как смещение представляет собой 8-битовое целое число со знаком, то команда JS может передавать управление по адресам в диапа- зоне + 127 байт 4—128 байт от конца команды. П ример Пусть однобайтовая ячейка памяти с адресом FIRST-BYTE содержит 0 и выполняется следующая последовательность команд: DEC BYTE PTR FIRST-BYTE JS COMPLETE STD RET COMPLETE: ADD AX.4000H 183
Первая ' команда изменяет содержимое ячейки FIRST-BYTE на FFH и устанавливает флаг SF в 1. После выполнения команды JS COMPLETE управле- ние передается команде ADD АХ,4000Н с адресом COMPLETE. Последнее означает, что содержимое ячейки памяти является отрицательным двоичным числом ’(старший бит байта в ячейке FIRST-BYTE равен 1). Таблица перевода 1-й байт 16- двоичная ричнав 2-й байт - -байты 3,4, 5, 6, формат операнда 78 ОШ 1000 Disp8 Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты ’ 7890 JS SIGNJiUMBERS . Short-Label 2 • 4 or 16 Примечание. При выполнении перехода команда занимает 16 тактов. LAHF-загрузка регистра АН из регистра флагов (АН) •*---(Младший байт регистра флагов) Младший байт регистра флагов процессора при выполнении этой команды записывается в регистр АН. Этот байт содержит флаги знака SF, нуля ZF, вспо- могательного переноса AF, паритета PF и переноса CF. Содержимое регистра флагов при этом не изме- няется. Команда LAHF используется в основном для обеспечения совместимости микропроцессора 8088 и его предшественников микропроцессоров 8080/8085. Пример Если регистр АХ содержит число 4420Н, а регистр флагов — F046H, то после выполнения команды LAHF регистр АХ будет содержать новое число 4620Н. Со- держимое регистра флагов сохраняется неизменным. 190
Таблица перевода 1-й байт 16-/ двоичная ричная • 2-й байт байты 3,4, 5, 6, форматоперанда 9Е 1001 1110 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты LAHF операнда нет 1 4 * JLDS-загрузка указателя в регистр DS (1-й Операнд) •*---(Исполнительный адрес), (Регистр DS) ------(Исполнительный адрес+ 2) Младшее слово двойного слова памяти ЭВМ, за* даваемого вторым операндом, передается в 16-разряд- ный регистр общего назначения, задаваемый первым операндом. Старшее слово этого двойного слова пере- дается в регистр DS. Первый операнд команды запи- сывается в 16-разрядный регистр общего назначения, а второй операнд — в ячейку памяти. Сегментные ре- гистры для этого не используются. Команда LDS не влияет на содержимое регистра флагов. Она весьма удобна для инициализации указателей памяти исполь- зуемых в строковых операциях, таких, как LODS (Load String — загрузить строку), MOVS (Move String — передать строку), CMPS {Compare String—; сравнить строку). Пример Пусть регистр DS содержит код 04В5Н, в регистре SI записано число 2400Н и ячейки памяти с абсолют- ными физическими адресами 6F50H и 6F52H содер- жат F000H и 04С5Н соответственно. Пусть при этом выполняется команда LDS AX,[SI]. После выполнения команды в регистрах АХ и DS будут находиться но* вые числа F000H и 04С5Н соответственно, 191
Таблица перевода 1-й байт 16 ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда С5 1100 0101 Hod-Reg-Re* Disp-Lo,Disp-Hi Regl6fMenl6 Примечание, Операция не определена, если поле Mod равно 11« Примеры записи на языке ассемблера машинный код , команда ассемблера формат/операнда байты такты C51F IDS ВХ,[ВХ]' Reg16,Мет16 2-4 24+ЕА C56D17 LDS ВР,[01+23] Regl6tMeml6 2-4 24+ЕА С50Е0020 LDS CX.LJPOINTER Regl6,Meml6 2-4 24+ЕА LEA-загрузка исполнительного адреса (1-й Операнд) «--г Исполнительный адрес 2-го операнда По этой команде 16-битовый перемещаемый адрес второго операнда передается в регистр первого опе- ранда. Первый операнд хранится в 16-битовом реги- стре общего назначения, а второй операнд — в ячейке памяти. Регистры сегментов для хранения операндов не используются. Команда LEA на флаги не воздей- ствует. Пример Рассмотрим случай, когда однословная ячейка па- мяти TEST-WORD с перемещаемым адресом 8200Н содержит число 124Н и выполняется следующая по- следовательность команд: MOV AX,TEST_WORD LEA SI,TEST_WORD После выполнения команд регистры АХ и SI бу- дут содержать числа 124Н и 82Q0H соответственно, U92
Таблица перевода 1-й байт 16. двоичная оичная 2-й байт : байты 3, 4, 5, 6, формат операнда 8D 1000 1101 Mod-Reg-Ra* piap-LojDisp-Hi>. ReglSrMeal6 Примечание. Операция не определена, если 41дле Mod рацио IL Примеры задней на языке ассемблера \ ’ машинный код команда ассемблера форматоперандг байты такты 8D07 8D6F0C 8D1.6091F LEA АХ,[ВХ] LEA ВР,[ВХ+12) LEA LOC Reg16rMem16 Reg16гМеш16 Regie rMem16 2-4 2-4 2-4 2+ЕА 2+ЕА 2+ЕА LE S-загрузка указателя с использованием регистра ES V * (1-й Операнд) —— (Исполнительный адрес . 2-го операнда), (Регистр ES) *-----(Исполнительный адрес 2-го операнда + 2) Команда LES передает младшие 16 бит двойного слова второго операнда из памяти в 1 байтовый ре- гистр общего назначения. Старшие 16 бит двойного слова передаются в регистр ES. Первый операнд команды должен храниться в 16-разрядном регистре общего назначения. Нельзя использовать для хране- ния операндов регистры сегментов. Второй операнд должен задаваться в ячейке памяти. Команда LES не воздействует на флаги. Эта команда оказывается удобной для инициализации указателей памяти в тех случаях, когда используются команды строкового типа, такие, как MOVS (Move String), SCAS (Scan String), CMPS (Compare String), STOS (Store String). 7 Л. Дао 193
Пример - Если -регистр DS содержит число 04В5Н, регистр ES — число 04G5H, регистр SI — число 2400Н, а ячейки памяти с абсолютными адресами 6F50H и 6F52H —числа В800Н и F000H соответственно, то в -результата-выполнения команды LES DI,[SI] в регист- ; pax DI и ES будут записаны новые значения — В800Н и F000H соответственно. Содержимое регистра DS при ‘этом сохраняется неизменным. Таблица перевода - 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6 формат операнда 04 . 1100 0100 Mod-Reg-Rm* Disp-Lo,Disp-IIi Regi6,Meml6 Примечание. Операция яе определена, если поле Mod равно 11. Примеры записи на языке ассемблера машинный ко^ команда ассемблера) формат операнда байты такты С407 LES Л,(ВХ] Regl6 ,М«ц16 2-4 24+ЕА C455OF - LES DX,(DI+15) Regl6,Menl6 2-4 24+ЕА C43EFE1O LES BI,D_POirrER Regie, Memi6 2-4 24+Е1 LOCK-захват шины Команда является однобайтовым префиксом, по ко- торому микропроцессор в многопроцессорной системе вырабатывает Сигнал LOCK до tex пор, пока выпол- няется следующая команда. Это позволяет обеспечить микропроцессору доступ к памяти без риска вмепга-. тельства других процессоров системы. Команда LOCK не имеет операндов и не воздействует на флаги. Пример В языке ассемблера '8088 команда LOCK может, использоваться как префиксная команда, которая за-, писывается в одном общем с другими командами Вы-, ражении, например: ... s < LOCK XCHG AL,TEST_LOCATION 194
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда F0 Ш1 0000 операнда нет Примеры записи на языке ассемблера г— 1 машинный код команда ассемблера формат операнда байты такты | | ГОС606001000 LOCK МОТ ВНЕ PTR Х,0 операнда нет 1 3 | LODS-загрузка строки (Аккумулятор) — (Операнд по адресу в SI) Если (DF) = 0, то (SI) •*--(SI) + 1 (байт) или (SI) •*--(SI) + 2 (слово) Если (DF) = 1, то (ST) — (SI) — 1 (байт) или 4SI) <------ (SI) - 2 (слово) , По этой, команде содержимое памяти по адресу, находящемуся в регистре SI, передается в регистр AL г ; или АХ в зависимости от характера выполняемой one-« рации: над байтами или словами. В языке ассембле- ра команда LODS записывается как LODSB при опе- рациях над байтами и LODSW при операциях над словами. Содержимое регистра SI при выполнении этих команд увеличивается на 1 или 2 в том случае, когда флаг направления DF равен нулю, и уменьша- ется на 1 или 2, когда флаг DF установлен в I. Команда не имеет операндов и не воздействует на флаги. Пример Пусть регистр S1 содержит код ВОООН, однобайто- вые ячейки памяти с адресами ВОООН и В001Н— чис- ла 41Н и 53Н соответственно, регистр АХ — число 02ЕН и выполняется следующая последовательность команд: CLD; сбросить флаг направления DF в 0. LODSW 7* 493
После- выполнениякоманды LQDSW в регистрах АХ и SI будут записаны числа 5341Н. и В002Н соот- ветственно. . Рассмотрим! случай; когда в регистре S1 находится число B000H, однобайтовая ячейка вамятисадресом B000H содержит код 52Н, регистр AL содержит FFH и выполняется следующая последовательность команд:” STD; установить флаг направленияDF в 1. lodsb ' ''я: После -выполнения команды LODSВ в регистрах AL н SI будут записаны числа 52Н и AFFFH соответ- ственно; 1 к ? • .. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда АС' 1010 1100' AD 1010 1101 операнда нет операнда нет К . - ** г ” ' • •**' 'Л- ' Примеры записи на языке ассемблера машинный код команда ассемблера формат 5 . операнда байты такты АС LODSB операнда нет 1 ' 12 AD LODSV операнда нет 1 16 LdOP-цикл (СХ) *— (СХ) - 1. Если (СХ) ф 0, то (IP) «—- (IP) + Disp8. При выполнении этой команды исходное содержи- мое регистра СХ уменьшается на 1. Если содержимое регистра СХ не равно нулю, управление, передается по адресу, заданному целевым операндом. В против- ном случае выполняется следующая по порядку, команда. Адрес целевого операнда вычисляется сло- жением байта смещения с адресом следующей коман- ды. Так как смещение представляет собой однобайто- вое целое число со знаком, то команда LOOP может передавать управление по адресам в диапазоне -1-127 байт-h —128 байт от конца команды. Поскольку 196
содержимое регистра СХ интерпретируется как целое число без знака, то команда может быть, использо- вана для повторения выполняемой последовательно-? сти кодов до 65 536 раз, причем регистр СХ .испбль- зуется как счетчик итераций.- ; •; - . Пример- ;: ' ' ':' Следующая последовательность команд сбрасы- вает в нуль старший бит в каждом байте 1000-байто- вого массива ячеек памяти, начиная с яЧёйкй с адре- сом ARRAY-ONE. MOV СХ,1000 инициализировать учетчик итераций LEA SI, AR RAY-ONE начальный адрес •.массива CLEAR-LOOP: LODSB, ^загрузить байт ;массива ; AND AL,7FH ; ’" ;сбросить в нуль < ;7 разряд ~ LOOP CLEAR-LOOP ;выйолнить 1000 раз Таблица перевода < 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда Е2 ШО 0010 Dispd Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты E2D4 LOOP NEXTLOOP Short-Label 2 5 or 17 Примечание. При переходе к следующей по порядку команде за- трачивается 5 тактов. LOOPE/LOOPZ-цикл если равно/цикл если нуль (СХ) +-----(СХ)—1 Если ((СХ) #0 AND (ZF)=1), то (IP) +--(Ip) + Disp8 При выполнении команды исходное содержимое регистра СХ уменьшается на I. Если содержимое 197
регистра СХ яе равно 0 и 'флат ZF установлен в Г, осу- ществляется передача управления по адресу, зада- ваемому целевым операндом. В противном случае выполняется следующая по порядку команда. Адрес целевого операнда определяется сложением байта сме- щения с адресом следующей команды» Так как байт смещения представляет собой однобайтовое целое число со знаком, то команды LOOPE, LOOPZ мо- гут передавать упоавление по адресам в диапазоне ’4-127 байт 4--128 байт от конца команды. Посколь- ку содержимое регистра СХ интерпретируется как целое число без знака, эти команды могут использо- ваться для повторения выполняемой последователь- ности кодов, до 65 536 раз, причем регистр СХ исполь- зуется как счетчик итераций. Пример Следующая последовательность команд выполняет поиск первого, отличного от пробела символа в стро- ме символов, начинающейся -с ячейки памяти, адрес которой находится в регистре SI: .МОУ СХ, 128 ;Максимал*гНое число символов в строке SEARCH: •' LODSB Загрузить символ At.WI ^Определить пробел . . ’ . Х«ОД ASCH . ;п₽ебела—S0H) LOOPE SEARCH ^Пропустить все начальные ;пробелы NON_BLANK: MOV DI,SI Таблица перевода . 1-й байт .Ш- двоичная * ричная 2-й байт , байты 3, 4, 5,6, • формат операнда Е1 1110 0010 DispQ Short-Label Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты E1D2 LOOP CONVERSION Short-Label 2 6 or 18 Примечание: Прй переходеv к следующей но порядку команде за} Фрачнкается 6 тактов. Г98
LOOPNE/LOOPNZ-цикл если не равно/цикл если не нуль (СХ) *----(СХ) - I Если ((СХ) # О AND (ZF) = 0), то (IP) «--(IP) + Disp8. При выполнении -команды исходное содержимое регистра СХ уменьшается на 1, Если содержимое ре- гистра СХ не равно 0 и флаг ZF установлен в 0, то осуществляется передача управления но адресу, зада- ваемому целевым операндом. В'противном случае, выполняется следующая по порядку команда. Адрес целевого операнда определяется сложением байта сме- щения с адресом следующей команды. Так как сме- щение представляет собой однобайтовое целое число со знаком, команды LOOPNE, LOOPNZ могут переда- вать управление по адресам в диапазоне 4-127 байт 4-] ----128 байт от конца команды. Поскольку содержи- мое регистра СХ интерпретируется как целое число без знака, эти команды могут использоваться для по- вторения выполняемой последовательности кодов до 65 536 раз, причем регистр СХ используется как счет- чик итераций. Пример - Следующая последовательность команд преобра- зует строку символов нижнего регистра (начиная с адреса памяти, находящегося в регистре SI) в симво- лы верхнего регистра, причем преобразование додж-- но прекратиться при обнаружении в последователь-- ности символа 0: ; MOV CX.10& ^Максимальное число символа» ;в строке MOV DI, SI Указатели строки символов GETC: LODSB Загрузить символ нижиего ^регистра AND AL,5FH ;Преобр азование 199
stBsb4 LOOPNE-— GETC RET ^Запись символа верхнего регистра в строку ;Остан6в по окончании цикла иили при обнаружении О Таблица перевода 1 -й бдит 16* двоичная ричная г > 2-й байт байты 3, 4,- 5, формат операнда EQ 1110 0010 ;. Disp8 ' Short.-Lahel Примеры записи на языке ассемблера > машинный код команда ассемблера формат операн да байты такть) -E0D2 ЕООб IpOPflS CONVERSION LOOPNZ NEXT BYTE _J5ho^rt-Label.. Short-Label 2 *2 ' or 1.9. 5 or 19 Примечание. При переходе к следующей по порядку команде за- трачивается 5 тактов. MOV-пересылка р-й Операнд) ------(2-й Операнд) Второй операнд при выполнении команды MOV ; занимает место хранения первого операнда. При этом первый операнд, теряется. Первый операнд может быть задан в регистре об- ’ щего. назначения, регистре сегмента (кроме регистра CS) или ячейке памяти. Второй операнд, кроме того, может быть еще и непосредственным операндом. Команда MOV работает как с однобайтовыми, так и с двухбайтовыми словами. Пример Пусть регистр СХ содержит слово 04С5Н, а ре- гистр ВР — слово 2312Н. После выполнения команды 200.
MOV CX,BP содержимым регистра СХ будет слов*» 2312Н, а содержимое регистра ВР не изменится. Таблица перевода - ; . 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 88 1000 1000 . 89 1000 1001 8А 1000 1010 8В 1000 1011 8С 1000 1100 8Е 1000 1110 АО 1010 0000 А1 1010 0001 А2 1010 0010 Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Mod-OSR-Rm Mod-OSR-Rm Disp-Lo Disjp-Lo . Disp-Lo Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Hi Disp-Hi Disp-M ' ; Reg8/Mem8,Reg8 Regl6/Meol6,ReglD - Reg8, Reg8/Mem8 ‘ . Re$16,Regl6/Mleml6 Regl6/Meml6,Segreg Segreg,Regl6/Meml6 AL,Mem8 ЛХ,Ме«16? * - .\;.- МейДь П * ~ *' 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6 формат операнда АЗ 1010 ООН Disp-Lo Disp-Hi Meml6>AJD 1011 OReg Data8 Reg8,Immed8 1011 IReg Datal6 Regl6,tmmedl6 С6 1100 ОНО Mod-000-Rm Disp-Lo,Disp-Hi Reg8/Mem8,Immed8 Data8 С7 1100 0111 Mod—000—Rm Disp-Lo,Disp-Hi• ' Regl6/Meml6,Immedi& Data-Lo,Data-Hi Примечание. Если операндами команды MOV являются аккумулятора и абсолютный перемещаемой адрес, то эффективны фор- маты AL,Mem8, AX,Meml6, Mem8,AL или Мепйб^АХ. Если при ис- пользовании формата 8Е Mod-OSR-Rm содержимое поля SR равна двоич- ному коду 001, то операция не определена, Есл» содержимое поля Mod не следует пользоваться форматами С6 Mod-000-Rm или С7 Более эффективными . в этом-случае являются форматы 8011 OReg или 1011 IReg. 201
. Примеры записи на языке ассемблера машинный ; t код команда ассемблера формат операнда байты такты 8817 NOV IBXJ.DL Mem8,Reg8 2-4 9+EA 38ЕА mov dl,ch Reg8,Reg8 2 2 894412 MOV ISI+12H1.AX Meml6,Regl6 2-4 13+EA 89EI ' MOV CX,SP Regl6,Reg16 2 2 8А1Е3500 MOV M.TESTBYTB Reg8,Mea8 2-4 8+EA 8В35 MOV SI Л DI1 . Regl6,Meml6. 2-4 12+EA -f 8ED8 MOV DS,AX Segreg,Regl6 2 2 8ЕО6380О MOV ES.NEW $egreg,Mefl>16 2-4 8(12)+EA 8СС8 MOV AI.CS Regl6,Segreg 2 2 8С1ЕЗА00 MOV OLDSEG.DS Meml6,Segreg . 2-4 9(13)4£A А03500 MOV AL.TESTB AL,Meo8 3 10 А13600 MOV AX.TESTW AX,Meml6 3 14 А235ОО MOV testb.al Mem8,AL 3 10 машинный код команда ассемблера формат операнда байты такты A33600 MOV TESTWMX Memi6,AX 3 И. B40B MOV AH,11 Reg8,Immed8 2 4 B9FBFF MOV CX,-5 Regl6tImmedl6 3 4 C686230F09 MOV BYTE PTR (BP+0F23H],9 Mem8, leaned 8 3-5 10+EA C7O4OO1O MOV WORD PTR (SIL1000H Meo16,lamed16 4-6 14+EA Примечание. Число тактов в скобках указано для двухбайтовых операндов. MOVS-пересылка строки (Операнд по адресу в регистре DI) — (Операнд по адресу в регистре SI) Если (DF) = 0, то <SI> *---(SI) + 1 (байт) (DI) *----(DI) + 1 (байт) ИЛИ (S1) <*----г- (SI) + 2 (слое») (Ы) «------- (DI) + 2 {слово) 202
Если (DF) — 1, то (SI) *— (Sty — 1 (байт) .. . - ' (DI) -------(DI) — 1 (байт) J j ИЛИ ’ (SI) •*-1— (Sty—2 (слово) - (DI) *-----(DI) — 2 (слово) ; В зависимости от обрабатываемых данных (одно- байтовых или двухбайтовых) при выполнении коман- ды MOVS содержимое ячеек памяти, адресуемых регистром SI (относительно сегмента данных), переда- ется в область памяти, адресуемую регистром DI (отно- сительно дополнительного сегмента). Содержимое об- ласти памяти, адресуемой регистром SI, не изменяет- ся. В языке ассемблера команда MOVS записывается как MOVSB для операций с байтами и MOVSW — для операций со словами^ При сброшенном в 0 фла- re DF содержимое регистров SI и DI увеличивается на 1 или 2 при выполнении команд MOVSB й MOVSW ; соответственно, а при единичном флаге DF содержи- мое этих регистров уменьшается Автоматически на ту же самую величину. Команда MOVS не имеет операн- дов и не воздействует на флаги. Пример; Пусть регистр SI содержит число 7FOOH, по адре- су памяти 7F00H Зайисано число 0D0AH, регистр DI содержит число В800Н, двухбайтовая ячейка памяти с адресом В800Н — число 2020Н и выполняется сле- дующая последовательность команд: CLD — сбросить флаг направления DF в 0. MOVSW После выполнения команды MOVSW в регистрах SI и DI будет записано 7F02H и В802Н соответствен- но. Двухбайтовая ячейка памяти с адресом В800Н будет содержать новое значение 0D0AH. Пусть теперь SI содержит число 2400Н, ячейка памяти с адресом 2400Н— число 41Н,' регистр DI число В800Н, ячейка памяти с адресом В800Н — чис- ло ООН и выполняется следующая последовательность команд: STD — установить флаг.ОР в 1. MOVSB 20В
После выполнения команды MQVSB в регистрах SI и DI будут находиться 23FFH и B7FFH соответ- ственно, а’в ячейке памяти с адресом В800Н будет записано новое значение 41Н. Таблица перевода - 1-й бейт ричная•д®°ичНая 2-й байт баиты З, 4; 5, 6, формат операнда А4 1010 0100 А5 1010 0101 операнданет операнда нет Примеры записи на языке ассемблера машинный код ко манда ассембл ера формат операнда байты тактьГ А4 MOVSB операнда нет 1 18 А5 MOVSW " операнданет V - 26 ’ , MUL-умножение Для однобайтового умножения (АХ) •*----(AL) * (Операнд) - Если (АН)=±0, то (€F) •*-*-*—1 О (OF)-*----О Если (АН)# 0, то (CF) •*--1 < - j- (OF)-*---—1 • - • Двухбайтовое умножение 4 . (DX,AX) •*-—' (АХ) * (Операнд) ’Если (DX)==0, то (CF) •*--- О (OF) ----О Если (DX)#0, то (CF) **----- 1 (OF) •*—- 1 . ,По команде MUL выполняется беззнаковое умно- жение содержимого аккумулятора и операнда-источ- ника. Если операнд является байтом, то он умножает- ся на содержимое регистра AL и результат двойной ; длины (слово) записывается в регистр АХ. Если опе- ранд — слово, то он умножается на содержимое ре- гистра АХ и результат (двойное слово) записывается в пару регистров DX и АХ, причем регистр DX содерг \204/
жит старшие разряды результата. Операнд может быть задан ц регистре общего назначений или-ячейке памяти и интерпретируется как *число без знака; » > ! Если содерж'имое регистра АН После однобайтбво- го умножения или содержимое регистра DX после двухбайтового умножения не равны ну^ю, флйгй CF и OF -устанавливаются в1.-Впротивномслучае.они. 1 сбрасываются в| От Состояние; флагов AF, PFZSF й ZE ; после выполнения-.командыJM.UL Пример • ; ' • -* ь j Пусть регистр AL содержит число ЗОН, однрбацто- i вая ячейка памяти,ЫЕХТ-1^д^^т £2Н^имв’ыполня- ? ется команда MUL NEXT-L? Результат умножения (12Н X ЗОН =ч? 360Н) записывается в регистр АХ. Поскольку содержимое регистра АН отлично от О, флаги CF д OF установлены в,1/'" \\"•'; Пусть теперь, регистр АХ содержит, число. 1000H,. ,‘ регистр ВХ — число 5.50Н. Тогда поело выполнения I команды MUL ВХ результат умножения (1000Н X ; X 550Н = 550000Н) будет записан в пару регистров : DX и АХ. Так как новое значение регистра DX(0055H) отлично от нуля, то флаги CF и OF устанавливаются в 1- :. •• V Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 8 4 3 2 ГО L1 I I I х I I I |u| О Г I о 1 luj |х| OF PF IF IF SF ZF. . 8F PF CF Таблица перевода I 1-й байт I 16- ричная двоичная 2-й байт байты 3, 4, 5, 6 формат операнда F6. 1111 ОНО F7 1111 0111 Mod-101-Rm Mod-101-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8 Regl6/Meml6 Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты F6E5 MUL СИ Reg8 2 70-77 F6A70012 MUL BYTE PTR [ВХ+1200Н] Меи8 2-4 (76-83)+ЕА F7E5 MUL ВР Regl6 2 118-133 F7260037 MUL WORD PTR COUNT Мев16 2-4 (128-143)+ЕА 205
№Е'6-отрйцаиив (Операнд) —(Операнд). ЛПо этой команде заданный операнд вычитается из нуля, а результат записывается по -адресу операнда, Который 'стирается. Операнд может быть задан в ре- гистре общегопавиачения или ячейке памяти в фор- мате байта или ?слс®а. Команда NEG воздействует на флаги AF, fQF, OF, PF, SF h ZF. Пример Пусть ® регистре ЖХ записано яисло 2. /После вы- полнения’ команды NES -новым содержимым регистра ВХ/будет FFFEH, <ито является записью -числа —2 в дополнительном коде. ' Флаги, ватраТиваемые -онарацией 15,14 13 12 И 10 9 8 7 a S 4 3 2 1 В ; ;1ТТП^Г;П11хкГ|х| |х;гн . ... ,;а₽. /pH аж. Таблица перевода 16- двричиая ричная :2-йбвйт байты З, C 5. fi. j Орсформатгяах i операнда ' F6 1111 ОНО F7 1111 1111 * моа-ого-к® ; ' МоИ4(Ш)-йв ? Disp-Lo,Disp-Hi . ' 1 Ивр-1д^^р4Н1 Де88/Меа8 Regl6/Me»16 Примеры записи на языке ассемблера 4*й^айт ? 16- Двойная ричная i-йШ ’’ ШЫй'В'ЧЗЭ/Ф/ f р формат операнда | -i F6 1Ш. ОНО F7 шт / №ШЬ з г 8eg8/H«8 NOP-,отсутствие операции По команде NOP -микропроцессор :не производив никаких действий. -Команда -не -влияет -на -флаги -и -не имеет операндов. Она используется для организации циклов управляемой задержки ц тех /слунаях, -когда центральный ^процессор .должен на определенное вре- мя перейти в состояние ожидания перед выполнением, некоторых определенных команд. Машинный «од
команды NOP полностью совпадает с кодом команды XCHG АХ,АХ, по которому также на производится никаких операций. Пример Следующая последовательность: команд отражает типичный прием организации временной? задержки: MOV СХ,0 Инициализация счетчика задержки DELAY: NOP ;Не производить никаких действий? LOOP DELAY t ‘.Выполнить 65 536 раз команду NOP Таблица перевода 1-й байт 16- двоичная , ричная 2-й байт байты 3, 4, 5, 6, !' л ; > формат операнда « 96 1001 0000? - операнда нет Примеры записи на языке ассемблера? Машинный код " команда ассемблера? : формат операнда байты ? такты ? операнда нет Г 1Г? [Г у ' . N ОТ-логическое отрицание (Операнд) •*—— Инверсия всех разрядов (Операнд). По этой команде выполняется:? инверсия? всё», раз-; рядов операнда.. Операнды могут быть ааданыг в ре-( гистрах общего назначения-, либо одно?; или.-двухбай- товых ячейках памяти. Команда» NOT не воздействует на .флаги.. ... Пример . . _ д Пусть содержимое регистра BL равно нулю. Но- вым значением BL после выполнения команды NOT будет FFH. Таблица перевода 1-й байт ^наядвоичная 2-йбайт ; Шй«гЗ'.< 5/6 формат операнда К НИ ОНО’ ; М<хко1о-вв ' JHep-L6,IH.i>p-HL' ; Beg8/Mee8 Е7 1Ш ПИ Мо4-010-й« г Msp-Lo.Biep-Hi КвЙ6/Мва1б 207
,s. Призеры .записи на языке ассемблера ' машинный > КОД ' команда ассемблера форматоперанда' байты такты F6D2 FotfOAOO ; ПВ2 F714 вот и. нот иге m тгзтв вот и NOT W0RD PTK [$1] Jte88 3 Mes8 - п Regl6 Meal 6 ’ 2 ; 3 2-4 16+ЕА 2 . .з: 2-4 24+ЕА OR-логическое ИЛ И , (1-й Операнд) — (1-й Ойеранд) ИЛИ (2-й Операнд). L(CF).*^-a U ~ ' - ~ < ; (OF) <—- 0 • : ’ По этой команде выполняется операция логическо- го сложения обоих операндов. Результат записывает- i ся вместо первого операнда' предыдущее состояние которого стирается. Второй операнд не изменяется. Первый операвд может быть задан в регистре или ячейке памяти. Второй операнд может быть также и непосредственным операндом.. Не допускается исполь- ; зовать для записи операндов регистры сегментов, а также задавать оба операнда одновременно в ячейках памяти. Операнды могут быть заданы одно- или двух- байтовыми числами. Команда OR всегда сбрасывает в 0 флаги CF и OF. Пример .... Пусть содержимое регистра АХ равно 1468Н, ре- гистра DX — 8553Н и регистра флагов—F046H. По- еле выполнения команды OR AX;DX новыми значе- нйями регистра.АХ и регистра флагов будут 957ВЙ “ и F086H соответственно. Содержимое 0001 0100 0110 1000= 1468Н регистра АХ : Содержимое 1000 0101 0101 0011 = 8553Н регистра DX Новое значение 1001 0101 0111 1011=957ВН регистра АХ Поскольку число отличных от. нуля разрядов млад? шего байта регистра АХ четно, флаг паритета PF установлен в 1. Так Как результат операции ИЛИ—г отрицательное, отличное от нуля число в дополни- тельном коде, флаг SF установлен в 1, a ZF.— в О, 208
Флаги CF и OF также имеют нулевое значение из-за отсутствия -переноса и 1^едаоЛ1ПянИ^р&Стоя^н(е-фла- га АРгне определено. '< " ?.?*’ Флаги, затрагиваемые операцией : 15 U 11,11 И <0 9 8 7 ts»u i‘a t'- o ' т' i ; I I I 1.1 И I lx |x I |V| |x| OF tjF IF TF SF Xf,„я& 'J*-'' Г~ ! Таблица перевода ~ ~ ..............——- ~ - 1-й байт 16? двоичная ричная 2-й байт байты 3, 4, 5, 6, .формат операнда : 08 0000 1000 09 0000 1001 ОА 0000 1010 ОБ 0000 1011 ОС 0000 1100 0D 0000 1101 80 1000 0000 81 1000 0001 Mod-Reg-Ra Mod-Reg^Ra Mod-Reg-Rm Mod-Reg-Rm Data8 ? Data-Lo Mod-001-Rm Mod-001-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo^Disp-Hi Disp-Lo,Disp-Hi Data-Hl Disp-Lo,Disp-Hi, DataB Disp-Lo,Disp-Hi, Data-Lo,Data-Hi Reg8/Mem8,Reg8 Regl6/Meml6,Hfegl6 Heg8,Reg8/M6i8 3 R^gl6^RegL6^16 AL,Immed8 — AX,Inaedl6 Reg8/Mea8,Innned8 \ Regl6/Me®16,lmmedl6 Примеры записи на языке ассемблера машинный код «• команда ассемблера ; формат Операнда байты такты 0823 OR [BP+DIJ.AH Mea8,Reg8 2-4 Г6+ЕА 08F6 OR DH.DS Reg8,Reg8 2 3 090E0010 OR WRlRPTR SUM,CX Meal6,Regl6 2-4 24+EA 09F8 OR ДХ,DI Regl6,Regl6 З OA8D000I OR CL,[DI+1OOH1 Reg8,Mea8 , 2-4 9+EA OB5COC OR JBX,[SX+12] Regl6,Meal£ 2-4 13+EA OCFF OR AL.-L AL,Iamed8 2 4 0DFF7F OR AX.7FFFH AX,bttedl6 3 4 80CB01 OR BL,01 Reg8,Iomed8 3 4 804C0290 OR BYTE PTR [SI+2J.90H Mea8,Ianed8 3-5 17+EA 209
машинным командаассемблера . формат операнда байты, такты V 81CEFF7F г . 810E0020FFFE а ,,SI»?FFFH _ .J „ WORD PTR TEST.OFEFFH Reg Illumed 16 Meml6,IjBeedl6 4 4-6 25+ЕА. OUT-вывод в порт (Порт ввода-вывода) *--(Аккумулятор). По этой команде байт или слово передается в порт ввода-вывода из регистра AL или АХ соответственно. Адрес порта может быть указан либо в самой коман- де в виде байтовой константы, определяющей порты? с адресами от О до 255,' либо с помощью адресов, раз» мещенных в регистре РХ, позволяющих обращаться к 65 536 различным портам перезаписью содержимого регистра DX. Команда не воздействует на флаги. Пример Пусть Порт с адресом 3D5H является портом вво- да в буферную память алфавитно-цифрового печатаю* щёго усТрбйсТйа. Вывод р буфер кода ASCII BSC происходит по следующей последовательности команд! MOV MOV сиг DX.3D5H Загрузить адрес порта в регистр DX AL.1BH ;Код ASCII ESC AL,DX {Вывести код в буферную память Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда Еб 1110 0110 Е7 1110 0111 ЕЕ 1110 1110 ЕР *1110 1111 Data8 Data8 г ) AL,Immed8 AXgXiMiedS AL,DX AX,DX 210
Примеры записи на языке ассемблера г- ,,и” машинный ко; команда ассемблера формат - операнда баЙТЫ такты E62D OUT AL.2DH AL,Im»d8 r ' - ~ M , Е72Е OUT АХ.2Е8 АХДявеЗв J 2 ЕЕ CUT AL.DX AL,DX 1 / e EF our и,и AX.DX 1 ь. * 12 PUS HF-запись в стек содержимого регистра флагов (SP) •*----(SPJ-2 (Вершина стека) -—* (Регистр флагов) По этой команде содержимое регистра указателя стека SP уменьшается на 2, после чего на вершину стека записывается текущее состояние регистра фла- гов. Команда не воздействует на флаги и может ис- пользоваться для сохранения текущего состояния цен- трального процессора 8088. Пример Пусть содержимое регистра флагов равно F046H, регистра SP — FFC2H. Тогда после выполнения команды PUSHF содержимое указателя стека станет равным FFC0H, а шестнадцатеричное число F046H будет находиться на вершине стека, что иллюстрирует следующий пример. Млад- ший байт Стар- ший байт 0А 0D Младший адрес памяти ООООН 0002Н Млад- Стар- ший байт 00 0D ший байт ОА 0D ООООН 0002Н 00 GD FFBEH 80 10 -. - - FFBEH 80 10 FFC0H 20 20 Новое FFC0H 46 F0 Вершина стека FFC2H 41 52 значение вершины стека FFC2H 41 52 •♦ 211 - - _ —г г .-.-.-г-
FFFEH 00 28 FFFEH 00 28 Старший адрес памяти . Перед командой-PUSHE . После команды . - PUSHF '*• - j * •* । Л-5”* * » Таблица перевода 1-й байт 16- ричная двоичная; 2-й байт байты Зэ 4» 5, 6 , формат ' операнда 9с горх 11ЗД. 1 ’ г.,1 операнда нет Примеры записи'на языке ассемблера машинный код кр май да ассемблера формат операнда байты такты 9С PUSHF ! операнда нет 1 14 POPF-чтение из стека содержимого регистра флагов _ , (Регистра флагов) ---(Вершина стека) (SP) *—---(SP) + 2 При выполнении команды POPF число с текущей вершйны" СТёка йереддетсяг'в регистр флагов процесс сора. Содержимое регистра SP возрастает на 2. Та- ким образом, команда, воздействует на все флаги,, Включая флаг TF. Она может использоваться для вое-. - становления предыдущего состояния центрального процессора при возврате в вызывающую процедуру. Пример Пусть содержимое регистра флагов процессора равно F046H, регистра SR—FFC0H, содержимое па- мяти с перемещаемым адресом FFC0H, взятым отно- сительно стекового сегмента, равно F047H. После вы- полнения команды POPF содержимое регистра SP будет равно FFC2H, а регистра флагов — F047H; Младший Млад- Стар- Млад- Стар- адрес ший ший ший ший памяти Байт Байт Байт Байт ООООН 00 0А ООООН 00 0А 0002Н 0D 0D 0002Н • • 0D 0D FFBEH 80 10 FFBEH 80 10 212
Новое Вершина стека FFC0H 47 : F0 значение вершины FFC0H 47 FFC2H 41 52 стека— FFC2H 41 • • «* ; FFFEH Oik 28 FFFEH 00 Старший адрес памяти ‘28 Перед командой PUSHF FG 52 После выполнения команд» PUSHF Флаги, затрагиваемые операцией 15 14 13 1? 11 10. Я 8 Z & 5 4 3 2 1 О . OF OF IF TF $F ZF AF PF CF Таблица перевода’ : 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 9D 1001 1101 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 9D POFF операнда нет 1 ; 12 PUSH-запись в стек (SP) ------(SP)—2 (Вершина стека) <—-—*• (Операнд) Операнд команды PUSH может быть задан в 16-битовом регистре или ячейке памяти, допускается также использование любых регистров общего назна- чения или сегментных регистров. При выполнении этой команды содержимое регистра уменьшается на 2. Затем операнды записываются в стек на его вершину. Команда не воздействует на флаги и часто используется для сохранения в стеке промежуточных данных. Пример Пусть содержимое регистра DS равно 04В5Н, а ре- гистра SP — FFC2H. После выполнения команды 213
PUSH DS новым содержимым регистра SP станет FFC0H, а на вершине стека будет записано шестна- дцатеричное число 04В5Н, что иллюстрирует следую- щий пример. Младший Млад- Стар- Млад- Стар- адрес ший ший ший ший памяти Байт Байт Байт Байт ООООН 00 0А ООООН ОО ОА 0002Н 0D 0D 0002Н 0D 6Ь : • • • • FEBEN 80 10 FFBEH 80 10 FFC0H 20 20 Новое FFC0H В5 04 Вершина значение стека вершины - : FFC2H 41 52 е стека FFC2H 41 52 (;FFFEM 00 28 FFFEH - 00 2% Старший адрес памяти т - До выполнения команды После выполнения - PUSH DS команды PUSH DS Таблица перевода T-й байт 16*? двоичная ричная 2-й байт байты Зг 4г 5* 6, формат операнда FF Ш1 ЦП 0101 OReg OOORegllO 'Mod-lio-Rm ; р" * ' * Disp-Lo ^Disp-Hi Meml6/Reg!6* Regl6 Segreg . > Примечание. Для задания 16-разрядного регистра общего назначе- ния не следует пользоваться форматом FF Mod-UG-Rm. Более эффек- тивным в этом случае является формат 0101 OReg. Примеры записи на языке ассемблера машинный код команда ассемблера - ’ ' '1 1 < формат операнда байты такты 52 PUSH DX Regl6 , 1 \ IE PUSH DS Segreg 1 f4 FF77O3 PUSH WORD PTR (BX*O3J Head 6 . 2-4 .24+ЕЛ 214,
POP-чтение из стека (Операнд) ----(Вершина стека) * (SP) ----- (SP) + 2 Операнд команды POP может быть задан в 16-би- товом регистре или ячейке памяти, а также в любом регистре общего назначения или сегментном регистре (кроме регистра CS). По этой команде содержимое вершины стека передается в операнд, а содержимое регистра SP увеличивается, на 2. Команда не воздей- ствует на флаги и часто используется для чтения из стека промежуточных данных, предварительно запи- санных в стек по команде PUSH. Пример Пусть содержимое регистра АХ равно 000FH, ре- гистра SP—FFC2H и слово ячейки памяти с переме- щаемым адресом FFC2H, взятым относительно стеко- вого сегмента, равно 04С5Н. После выполнения команды POP АХ регистры SP и АХ будут содержать числа FFC4H и 04С5Н соответственно. Младший Млад- Стар- Млад- Стар* адрес ший ший ший ший памяти Байт Байт Байт Байт ООООН 00 0А ООООН 00 0А 0002Н 0D W 0002Н оЬ 0D . • • * FFBEH 80 10 FFBEH 80 10 FFC0H Вершина 20 20 FFC0H 20 . 20. стека FFC2H С5 04 FFC2H С5 04 Новая FFC4H 42 00 вершина стека— FFC4H 42 00 FFFEH 00 28 FFFEH 00 28 Старший адрес памяти До волнения команды После выполнения . jrvr ал команды POP АХ 215 < ~ - .. г - _
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты; 3> 4, 5, 6, формат операнда 8F , 1111'1111 " 6101 IReg - OOOReglll W-00^Rnr 4 i Meml6/Regl6* £egl6 Segreg Примечание. Для записи данных в ,16-разряДный; регистр общего назначения не следует пользоваться, форматом 8F Mqd:-000-Rm. Более эффективным в этом случае является формат 0101 IReg. Примеры загаси на языке ассемблера ' машинный код команда ассемблера формат операнда байты такты j 5В "Ж ? ВХ\ Reg 16 1 12 1F POP DS V' Segreg 1 12 8F060B00 POP WORD PTR TEST Meml6 2-4 25+EA RCL-циклический сдвиг влево с переносом (Временныйбит) (CF)’ • . .?• (CF) (Старший бит операнда) ’ (Операнд) *-(Операнд) *2 + (Времен- . - ный бит) - . ' . По &т'ой команде выполняется циклический сдвиг ’ разрядов в байте цли слове операнда. При использо- вании формата Reg/Mem,l производится сдвиг только на 1 разряд. Если используется формат Reg/Mem,CL, то число сдвигов задается содержимым регистра CL. Флаг CF также участвует в операциях сдвига, его значение заносится в младший значащий бит операн- да-приемника, а” на его место заносится значение са- мого старшего значащего бита этого операнда. В ре- жиме сдвига на один бит (без регистра CL) флаг OF- устанавливается в 1 в том случае, если значение фла- га CF отличается от самого старшего значащего бита операнда-приемника. Состояние флага OF не опреде- лено при сдвиге на число разрядов, большее единицы,. Операнды в этой команде могут быть заданы в ре- гистрах общего назначения или ячейках памяти. Пример Пусть содержимое регистра ВХ равно 4231Н, ре- гистра CL —04Н, значение флага CF равно 0-и со» 216
движимое регистра флагов равно F046H„. Выполнение команды RCL BX.CL иллюстрируется следующим лри=.. мером: I L Флаг CF Содержимое регистра ВХ О 0100 0010 ООН 0001 =4231Н Исходное содержимое х О 1000 0100 ОНО 0010 = 8432НПосле Нго сдвига 1 0000 1000 1100 0100 = 08С4Н После 2-го сдвига i О 0001 0001 1000 1001 =» Н89Н После 3-го сдвига О 0010 ООН 0001 0010=^2312Н После 4-го сдвига После выполнения команды содержимое, регистра ВХ будет равно 2312Н, флаг CF сброшен в 0, а в ре- гистре флагов записано F046H. Флаги, затрагиваемые операцией ....... 15 14 13 12 11 Ю 9 а .7 6 5 4 3 j J JI ; OF BF JF'Tf SF ZF AF PF CF Таблица перевода . . . . > 1 1-й байт 16- двоичная [ ричная_ 2-й байт байты 3, 4, 5, 6, формат рперанда | DO 1101 0000 ' D1 1101 0001 D2 Н01 0010 D3 1101 0011 Mod-010-Rm Mod-010-Rm Mod-010-Rnt Mod-010-Re л Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi . Disp-Lo,Disp-Hi • Reg8/tyea8,l Regl6/Me»16,l Reg?/Mea8,CL Regt6/HeB16,CC Примеры записи на языке ассемблера машинный код команда ассемблера 7 формат операнда байты такты DODO RCL AL,1 Reg8tl 2 2 D05701 RCL BYTE PTR [BX+01],1 Mend,! 2-4 J5+E* DIDO RCL AX,1 Reg16,1 2 2 ’ D1160020 RCL WORD PTR TEST,01 Heml6,l 2-4 23+EA. D2D2 RCL DL,CL Reg8,CL 2 8+4/bit D214 RCL BYTE PTR [SI],CL Mem8,CL 20+ЕА+4/ЫЛ D3D3 RCL BX,CL Reg16»CL 2 &+4/bi^ D315 RCL WORD PTR [DI],CL Mem8,Ct 2-4. 28+EA+4/bit 217
RCR-циклический сдвиг вправо е переносом (Временный бит) --:— CF l (CF). *----- (Младший бит операнда) (Операнд) •*-—-(Операнд)/2 (Старший бит операнда} *--(Временный бит} По команде выполняется циклический сдвиг раз* : рядов в байте или слове операнда. При использовании формата Reg/МетД выполняется сдвиг только на I разряд. Если используется формат Reg/Mem,CL, то число сдвигов задает содержимое регистра CL. Флаг CF также используется в операциях сдвига, его зна- чепие передается в ячейки хранения старшего бита операнда-приемнийка, а на его место заносится значе- , ние младшего значащего бита исходного значения этого операнда. При сдвиге на t бит (без регист- ! pa CL) флаг OF устанавливается в 1 в том случае, если значения двух старших битов результирующего ; операнда не равны. При сдвиге на число разрядов, ; большее Г, состояние флага OF не определено. Опе- * ранды могут; быть однобайтовыми или двухбайтовы- ми й задаваться в 'регистрах общего назначения или ячейках памяти. • Пример Пусть содержимое регистра ВХ равно 7F86H, ре- гистра CL—ОЗН, регистра флагов.— F046H, и флаг CF сброшен в 0. Выполнение команды RCR BX,CL происходит следующим образом: Флаг GF Содержимое регистра ВХ Г 0111 1111 1000 0110 = 7F86H Исходное содержимое а «ИТ 1ШЛ1В Cm—3FC3H Поела 1-го сданюа . , | 8001 1111 111® 0081—1FE1H После сдвига 1 100Q И11 1111 000G—8FF0H После 3-го сдвига После выполнения команды RCR ВХ,СЕ содержи- мое регистра ВХ будет равно 8FF0H, а регистра фла- гов—Р847Н,где флаг CF равен 1. Флаги, затрагиваемые операцией 15 U 13 12 П 10 9 8 7 6 5 4 3 2 1 О III 1.14.11 III1ПТИ OF DF IF IF SF ZF M FF GE
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4,5, В/ формат операнда DO 1101 0000 D1 1101 0001 D2 1101 «610 D3 1101 «011 Mod-011-Rn> ' Mod-011-Rn ttod-W-Ъ • Mod-Ш 1-Tta Disp-Lo,Disp-Hi Disp-Lo/Disp-Hi Disp-Lo,Disp-Hi j Disp-Lo^.Disp-Hi j 1tegB/MeB8,l fegWWealS,! Reg8/He®8,CL Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты D0D8 J D05F01 D.1D8 D11E0020 D2DA D21C : D3DB D31D ICR AL ,1 RCR BYTE PTR [BX+01J.1 RCR АХД RCR WORD PTR TEST.CU RCR DL.CL RCR BYTE PTR (SI],CL RCR BX,CL RCR "WORD PTR [Dll,CL Reg8,l Mem8,l ReglM ИейИД Reg8,CL Mem8,CL Regl6,CL MercB,CL ' i 2 ,;t. 2-4 1S+EA ; 1 2 2 ' ’ । 2-4 23+EA' 2 8+4/bit 3-4 20+№4/b& 2-4 28+EA+4/blt REF/WEP Е/КЕРХ-повторение/повторениеес ли равно/повторение если нуль Команда REP обычно используется как префикс- ный байт для строковых команд, таких, как MQVS, STOS. Содержимое регистра СХ задает число повто- рений строковых операций. Таким образом, префикс REP, связанный со строковыми командами, можно интерпретировать как “повторение строковой опера- ции до тех пор, пока содержимое регистра СХ не ста- нет равно нулю”. Для облегчения программирования предусмотрены альтернативные команды REPE и REPZ. Они, как правило, используются в качестве префиксных байтов в таких строковых командах, как CMPS и SCAS. Пе- ред их повторением необходимо установить в 1 флаг нуля ZF. Повторение последовательности заканчива- ется по признаку равенства нулю флага ZF, даже
еслй содержимое регистра СХ Отлично от нуля. Пре- фиксы повтЪррнйЯ могут быть прерванъ! по признакам прерываний', поэтому их не следует использовать ни с кайийи'другими командами, кроме стандартных стро- ковых команд." Пример ; \ : < . . Следующая последовательность команд задает начальные значения буферной памяти объемом 4096 байт, начиная с адреса INPUT-BUFFER. Зада- ваемое'значение: символ ASCH— пробел (20Н). LEA DI,INPUT-BUFFER ;начйльньгй адрес буфера MOV СХ.4096 ;4096 повторений MOV AL,20H ;код ASCII пробела CLD направление вперед REP STOSB повторить запись пробелов Таблица перевода 1-й байт 16- двоичная ричная 1 24й байт байты 3, 4, 5,' 6» формат операнда ' fl. Ш1 ООН операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты F3/AB REP STOSW операнда нет* .. 1 ; 2 F3/A7 REPE CMPSW операнда нет 1 2 F3/AE REPZ SCASB операнда нет 1 4 2 RET-возврат из процедуры (IP) •*---(Вершина стека), (SP) <—--(SP)4-2 f Межсегментная процедура - (CS) -----(ВершиНа стека), (SP) — (SP) + 2 При наличии смещения (SP) —..(SP) -hсмещение. . , 220.
Команда RET возвращает управление .от лроцедуя ры следующей за CALL'команде. Макроассемблер ге- нерирует внутрисегментную команду RET в-„том случ‘ чае, если процедура определена .как NEAR, и меж? сегментную RET, когда она определена .как, FAR. " При внутрисегментной операции возврата от процеду- ры команда осуществляет чтение из стека .(задавае- мого регистром SP) слова и запись его.в регистр IP- Содержимое регистра SP при этом увеличивается' на 2. По межсегментной команде слово из стека запи- сывается в, регистр CS, причем содержимое регистра SP тоже увеличивается на 2. ' . ; В команде может быть использовано 16-битовое1S' смещение, которое прибавляется к содержимому ре- гистра 5Р. для обхода параметров и промежуточных,, данных, помещенных в стек после выполнения коман- ды CALL. Пример Запись межсегментного й внутрисегментного воз- ? врата на языке ассемблера для микропроцессора 8088. ' Межсегментный RET Внутрисегментный RET TESTI PROC FAR TEST2 PROG NEAR --------- Команды процедуры RET; межсег- ; ментный Команды процедур RET 10, межсег- ментный TESTI ENDP Команды процедуры RET; внутри^еТ-'*' местный Команды процедур RET4; внутрисег- ментный TEST2 ENDP - Таблица перевода t-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда СЗ 1100 ООП С2 1100 0010 СВ 1100 1011 СА 1100 1010 * Data-Lo Data-Lo Data-Hi Data-Hi операнда нет С внутоисег») мента Displ6 ( внутрисегмента операнда нет (межсег j ментный Displ6 (межсегментный 221
Примеры записи иа языке ассемблера машинный i код команда f ассемблера форматоперанда байты Такты СЗ RET внутри операнд* нет сегмента 1 20 С20400 Э1зр1б внутри F сегмента 3 24 СВ RET операнда нет межсег ^ ментныи 1 32 сшоа КЕГ1О Pispl6 межсег . ментный . 3 31 RO L-циклический сдвиг влево (CF) -« (Старший бэт операкда> (Операнд) •*---(Операнд) *2‘+(CF) По этой команде осуществляется циклический сдвиг разрядов в байте или слове операнда. При ис- ; пользовании формата Reg/МетД выполняется сдвиг только на один разряд. Если используется формат Reg/Mem,CL, то число сдвигов задается содержимым регистра CL. Старший бит исходного операнда сдви- гается в ячейку . младшего бита операнда-приемника.. При сдвиге на 1 бит (без регистра CL) флаг OF уста- ; навливаегся в 1 в том случае, когда значение флага ; .CF отличается от значения старшего бита операнда- ' приемника. Состояние флага OF при сдвиге на произ- вольное число разрядов, большее L, йе определено.! Операнд команды ROL может быть задан в регистре , общего назначения или ячейке памяти. Используются: как «бднобайтовйе, так й двухбайтовые операнды. • Пример ' <; . Пусть регистр DL содержит число 74Н, регистр; CL — число 06Н, содержимое регистра флагов равно ; F046H, а флаг СР.устанрвлен в 0. Выполнение команд ды ROU DL..CL происходит следующим образом;. . Флагг CF Содержимое регистра DL 0 0111 0100 = 74Н Исходное значение а Ш0 1000 = Е8Н После 1-го сдвига 1 1101 0001==DlH После 2-го сдвига 1 1010 0011 = АЗЫ После 3-го сдвига 1 0100 0111 =47Н После 4-го сдвига 0 I000 1П0«8ЕН После 5-го сдвига 1 0001 Ш1 1DH После 6-го сдвига 222
После выполнения команды ROL DL,CL содержи- мое регистра DL равно 1DH, флаг CF установлен в ], флаг OF установлен в 0 и содержимое регжтрафла- гов равно F847H. Флаги, затрагиваемые операцией 15 U 13 12 11 10 9 8 7 6 5 4 3 2 1 О ЕШЛКЕШШТЕШ OF 5F IF TF SF ZF AF ?F CF Таблица перевода ~ 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда DO 1101 0000 М 1101 0001 . D2 1101 0010 1 D3 1101 ООН Mod—000—2ш Mod-000-Rm Mod-000-Rm Mod-000-Ra Disp-XotDisp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8,l Regl6/MemI6,l ; Reg8/Me»8,CL JRegl6^eiBi6tCL Примеры записи на языке ассемблера машинный . код < команда ассемблера Формат операнда байты такты doco жад Keg8,l 2 ,:л ' B04701 ROL BYTE ИЛ {№ЮЦ Д .Me»M : 2^4 мео ' BOL АХ,1 WM 2 2 B1O6OO2O ИМ. ЮМ) PTRTEST.Ol Hernial 2-4 23+EA D2C2 KOL Ш^С!. Reg8,CL 2 8+4/bit . D204 ROL BYTE HR [SI],Ct, . Mem^CL ,2-4 20fEA+4/bit D3C3 ROL BX.CL Regl6|CL 2 е+4/bit 0305 ROL WORD HR [DI],CL Mem8,CL 2-4 28+EA+4/bit RO R-циклический сдвиг вправо (CF) ч———- (Младший бит операнда) (Операнд) ч-----(Операнд)/2 < ; ДСтаршай бит операнда).ч**--<СГ) 223
По команде ROR выполняется операция цйклйче-. _..ского_сддига1>.р.азрядай .в.Дайте или. слоне. операнда.'. . При использовании формата Reg/Mem,l выполняется сДвЙГ тойййо даа‘оДий разрйд. Если используется фор?- мат Reg/Merti,CL,^ то. число сдвигов задается. сйдер- I жимым регистра CL* При :;этом младший бйт' исход- ; ного операнда сдвигается, в ячейку старшего бита i операнда-приемника.При сдвиге на 1 разряд (без ре- гистра СЕХ Флаг OF устанавливается .в-1 при условии, что значение флага переноса CF не совпадает со зна- чением старшего разряда операнда-приемника. Со- стояние флага OF при операциях сдвига на произ- fвольное -рнсло-разрядов, большее 1,-не определено, ( Операнда команды; ROR могут быть заданы в регйст- ‘ рах общего назначений или ячейках памяти. - Пример < : : - : - _ ’ Пусть, содержимое регистра ВХ равно 2F74H| флаг CF установлен в'0 й содержимое регистра фла- гов равно F046H. Процесс выполнения команды ROR ВХ,1 выглядит следующим образом: Флаг CF Содержимое регистра ВХ О 0010 1111 0111 0100 = 2F74H Исходное число 0 0001 0111 1011 1010«=17ВАН После сдвига После выполнения команды содержимое регистров флагов и ВХ будут равны F046H и 17ВАН соответ- ственно, а значения флагов CF и OF будут равны 0. Флаги, затрагиваемые операцией 15 U 13 П 11 ТО я 8 7 6543240 LL.J.I bLI. I I 1111-.| I Iх! 0FDFIFTFSF2F Af? PF CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда D0 1101 ОООО D1 1101 0001 D2 1101 0010 D3 1101 ООН Mod-101-Rm Mod-101-Rm Mod-101-Rm Mod-101-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8,l Regl6/Meml6,l Reg8/Mem8,CL Regl6/Meml6,CL 224
Примеры записи на языке ассемблера машинный код 1 " 1 " команда ассемблера < f формат операнда ибайты такты D0C8 ROR AL.1 Keg8,I 2 2 D04F01 ROR BYTE Ш [ВХ+01],1 Mem8,l 2-4 15Ш D1C8 ROR AX,1 Regl6J 2 2 D10E0020 ROR WORD PTR TEST,OX Meml6yl 2-4 23+EA D2CA ROR DL.CL Reg8tCL 2 &f4/bit D20C ROR BYTE PTR [SI],CL Mem8,CL 2-4 20fEA+4/bit D3CB ROR BX.CL Regl6,CL 2 8+4/bit D30D ROR WORD PTR [DI],CL Mem8,CL 2-4 28+EA+4/bit REPNE/REPNZ-повторение если равно/повторение если нуль Команды используются с командами строковых опе- раций, такими, как CMPS и SCAS. Содержимое ре- гистра СХ задает число повторений выполнения команды. Перед началом следующего повторения флаг нуля ZF должен быть сброшен в 0. Повторение прекращается, если флаг ZF установлен в 1, даже если при этом содержимое регистра СХ отлично от нуля. Поскольку выполнение префиксных команд мо- жет прерываться, их не следует использовать с дру- гими командами, кроме стандартных строковых команд. Пример Следующая последовательность команд выполняет поиск первой запятой в строке символов, начиная с ячейки памяти CHAR-STRING. LEA DI, CHAR_ ST RING MOV CX, 64 MOV AL.2CH REPNE SCASB ;использовать DI как указатель ;символов ;число символов в строке ;код ASCII запятой ;двигаться к концу строки до тех ;пор, пока не будет найдена ;запятая 8 Л. Дао 225
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байт 3, 4, 5, 6, формат операнда F2 1111 0010 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты* такты F2/A6 REPE GMPSB операнда нет 1 2 F2/AF REPZ SCASW- । операнда нет 1 2 SAHF-запись содержимого регистра АН в регистр флагов (Младший байт регистра флагов) *----(АН). Содержимое регистра АН при выполнении этой команды переписывается в младший байт регистра флагов, который включает в себя флаги SF, ZF, AF, PF и CF. На остальные флаги команда не влияет. Команда SAHF используется в основном для обе- спечения совместимости микропроцессоров 8088 и 8080/8085. Пример Пусть содержимое регистра АН равно С7Н, ре- гистра флагов — F046H и выполняется команда SAHF. После выполнения команды содержимое ре- гистра АН не изменится, а содержимое регистра фла- гов станет равно F0C7H. Флаги, затрагиваемые операцией 15 14 13 12 1.1 10 9 » 7 6 5 4 3 2 1 0 11 ш 111 i«hi ы i-»m OF PF JF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- . двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 9Е 1601 ИЮ операнда нет 226
Примеры записи на языке ассемблера машинный код команда ассемблера q Формат •операнда байты такты SAHF 4 SAL/SHL-арифметическнй сдвиг влево/логическмй сдвиг влево (CF) •*---(Старший бит операнда), (Операнд) ч----(Операнд) * 2. По этим командам выполняются сдвиги в байте или слове операнда. При использовании формата Reg/Mem,l выполняется сдвиг только на 1 разряд. Если используется формат Reg/Mem,CL, то число сдвигов задается содержимым регистра CL. Младшие разряды байта или слова при -сдвиге заполняются ну- лями. Если знаковый бит результирующего операнда не изменяет своего значения, флаг переполнения OF сбрасывается в 0. Состояние флага OF после сдвига на произвольное число разрядов, большее 1, не опре- делено. Операнды команд SAL и SHL могут быть за- даны в регистрах общего назначения или ячейках па- мяти. Формат операндов — байт или слово. Команды воздействуют на флаги CF, OF, PF, SF и ZF. Состоя- ние флага AF не определено. Пример Пусть содержимое регистра ВХ равно 4231Н, ре- гистра флагов — F046H, т. е. флаг CF установлен в 0. Команда SHL ВХ,1 выполняется следующим образом: Флаг CF Содержимое регистра ВХ 0 0100 0010 ООП 0001=4231Н Исходное значеиие 0 1000 0100 ОНО 0010 = 8462Н После сдвига После выполнения команды содержимое регистра флагов равно F882H, регистра ВХ — 8462Н, флаг CF сброшен в 0, а флаг OF установлен в 1, поскольку из- менилось состояние знакового бита. С помощью команды SHL можно быстро вычислять значения сте- пеней 2", где п — число разрядов сдвига. Результат последнего примера может быть получен прямым ум- ножением на 2. 8* 227
Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 О _Lk X X и X X OF OF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная_ 2-й байт байты 3, 4, 5, 6, формат операнда DO 1101 0000 D1 1101 0001 D2 1101 0010 D3 1101 ООП Mod-01O-Rm Mod-010-Rm Mod-010-Rm Mod-010-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8,l Regl6/Meal6,1 Reg8/Mem8,CL Regl6/Meml6,CL Примеры записи на языке ассемблера машинный код .команда ассемблер? формат, операнда байты такты DOEO SHL AL,1 Reg8,l 2 2 D06701 SHL BYTE PTR [BX+01],l, Mem8,l 2-4 15+EA D1E0 SHL AX,1 Reg16,I 2 2 DI 263900 SHL WORD PTR TEST,01 Meml6,l 2-4 23+EA D2E2 SHL DL,CL Reg8,CL 2 8+4/bit Д224 SHL BYTE PTR (SIJ,CL Mem8,CL 2-4 2CM-EA+4/bit -D3E3 SHL BX.CL Reg16,CL 2 8+4/bit D325 SHL WORD PTR (DI),CL Mem8,CL 2-4 28+EA+4/bit SAR-арифметический сдвиг вправо ? (SF) *------ (Младший бит операнда), (Операнд) *-----(Операнд)/2. По команде выполняется сдвиг в байте или слове операнда. Старший значащий бит при этом сохраняет свое значение. При использовании формата Reg/Mem,l выполняется сдвиг на 1 разряд, а в формате 228
Reg/Mem,CL — на произвольное число разрядов, ко- торое определяется содержимым регистра CL. Если после сдвига значения двух старших битов результата совпадают, то флаг OF сбрасывается в 0. Флаг OF сбрасывается в 0 при произвольном числе сдвигов, большем 1. Операнды команды SAR могут быть за- даны в регистрах общего назначения или ячейках па- мяти. Формат операндов — байт или слово. Команда воздействует на флаги CF, OF, PF, SF и ZF. Состоя- ние флага AF не определено. Пример Пусть двухбайтовая ячейка памяти BIT-PATTERN' содержит число A62FH, регистр CL — 04Н, регистр флагов — F046H и выполняется команда SAR WORD PTR BIT-PATTERN,CL. Команда выполняется сле- дующим образом: 0 1010 ОНО 0010 HH=A62FH Исходное значение 1 1101 ООН 0001 01H=D317H После 1-го сдвига 1 1110 1001 1000 1011 =Е98ВН После 2-го сдвига 1 НИ 0100 1100 0101==F4C5H После 3-го сдвига 1 ПН 1010 ОНО 0010 = FA62H После 4-го сдвига После выполнения команды в ячейке BIT-PAT- TERN будет записано число FA62H, флаг CF установ- лен в 1, флаг OF — в 0 и содержимое регистра фла- гов будет равно F083H. Флаги, затрагиваемые операцией 15 14 13 12 It 10 9 8 7 6 S А 3 2 » 0 Г1 I I 1-1 I I 1Ф1 Ы |х| |,| OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда DO 1101 0000 D1 1101 0001 D2 1101 0010 D3 1101 ООН Mod—ООО—Rm Mod-000-Rm Mod-000-Rm Mod-000-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8,l Regl6/Meol6,l Reg8/Mem8,CL Regl6/Meml6,CL 229
Примеры записи на языке ассемблера [машинный код команда ассемблера |с |)орматоперанда {байты такты DOF3 SAR AL,1 Reg8,L 2 2' D07F01 SAR BYTE PTR ГВХ+01],1 Mem8,1 2-4 15+EA D1F8 SAR АХ.1 Regl6,1 2 2 D13E39C0 SAR WORD PTR TEST,01 Meml6,l 2-4 23+EA D2FA SAR DL,CL Reg8,CL 2 8+4/bit D23C SAR BYTE PTR (SI},CL Mem8,CL 2-4 2O+EA+4/bit D3FB- SAR BX.CL Regl6,CL 2 8+4/bit D33D SAR WORD PTR (DI),CL Mem8,CL 2-4 28+EA+4/bit SBB-вычитание с заемом (1-й операнд) •*-(1-й операнд) — (2-й операнд) — — (флаг переноса CF). По команде SBB выполняется вычитание значе- ния флага CF и второго операнда из первого опе- ранда. Результат помещается на место первого опе- ранда, предыдущее значение которого теряется. Со- держимое второго операнда не изменяется. Первый операнд может быть задан в регистре или ячейке памяти. Второй операнд, кроме того, может быть задан непосредственно. Не допускается исполь- зовать для записи операндов сегментные регистры или задавать оба операнда в ячейках памяти. Операнды могут быть однобайтовыми или двухбайтовыми чис- лами со знаком или без знака. Возможность заема позволяет использовать команду SBB для организа- ции вычитания чисел с разрядностью, превышающей 16 бит. Пример Пусть регистр АХ содержит число 4803Н, регистр флагов—F047H, флаг CF установлен в 1, После вы- 230,
полпенни команды SBB АХ.1500Н в регистре АХ бу- дет записано 3302Н, а содержимое регистра флагов будет равно F002H. Фляги, затрагиваемые операцией 15 14 13 12 И 10 9 8 7 б 5 4 3 2 1 0 1 k X xl и X: X OF PF IF TF SF ZP AF PF CP Таблица перевода I 1-й байт И6- двоичная ’ричная 2-й байт байты 3, 4, 5, 6, формат операнда 18 0001 1000 Mod-Reg-Rm Disp-Lo,Disp-HL Reg8/Mem8,Reg8 19 0001 1001 Mod-Reg-Rm Disp-Lo,Disp-Hi Regl6/Meml6,Reg16 IA 0001 1010 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8,Reg8/Mem8 IB 0001 1011 Mod-Reg-Rm *Disp-Lo,Disp-Hi Regl6,Regl6/Meml6 1G 0001 1100 . Data8 AL,Immed8 ID 0001 1101 Data-Lo Data-Hi AX,Immedl6 80 1000 0000 Mod-011-Rm Disp-Lo,Disp-Hi t Reg8/Mem8,Immed8 Data8 81 1000 0001 Mod-011-Rm Disp-Lo,Disp-Hi t Regl6/Meml6,Immedl6 Data-Lo,Data-Hi 1-й байт L6- двоичная ричная 2-й байт байты 3, 4, 5, 6, ’ формат операнда 82 1000 0010 ’ 83 1000 ООН Mod-011-Rm Mod-01I-Rm .Disp-Lo,Disp-Hit ; Da.ta8 "Disp-Lo,Dis p-Hi, ; Data-SX Reg8/Mem8, Immed8 Reg 16/Me®16, IfloedS 231
Примера записи на языке ассемблера М~' 11ИННЫЙ КО/] команда ассемблера формат операнда -- байты такты 181F SBB brar,KgS 2-4 16+EA 1CD6 SBB DH.DL Reg8,Reg8 2 3 19540С SBB [SI+12],DX Mem16,Reg16 2-4 24+EA 19F2 SBB DX,SI Regl6,Regl6 2 3 1ЛОЕОО2О SBB CL.NEXTJBYTE Reg8,Mem8 i-4 9+EA 1В15 SBB DX,(DI] Regl6,Meml6 2-4 13+EA 1СОЗ SBB AL,03 AL,Immed8 2 4 1DFFFF SBB AX,-1 AX,Immedl6 •3 4 80DE0A SBB DH,1O Reg8,Inuned8 3 4 809D230F01 SBB BYTE PTR [DI+0F23H],! Mem8,Immed8 3-5 17+EA 81DD1122 SBB BP.2211H Regl6,Immedl6 4 4 811С0123 SBB WORD PTR [SIL2301H Meml6,Immedl6 4-6 25+EA 82DD0A SBB CH,10 Reg8,Immed8 3 4 83DBO1 SBB BX,01 Regl6,Imnted8 3 4 831Е000003 SBB WORD PTR NEW,03 Meml6,Immed8 3-5 25+EA SCAS-сканирование строки (Аккумулятор) — (Операнд по адресу в DI) Если (DF) = 0, то (DI) •*-(DI) + 1 (байт) или (DI) •*---(DI) + 2 (слово) Если (DF)=1, то (DI) •*---(DI) - 1 (байт) или (DI) •*---(D1) — 2 (слово) По этой команде содержимое ячейки памяти, ад- рес которой находится в регистре DI в зависимости от размера операндов: одно- или двухбайтовых, вычи- тается из содержимого регистра AL или АХ соответ- ственно. Результат операции воздействует на регистр флагов, но не изменяет содержимого аккумулятора. В языке ассемблера для операций с байтами команда записывается как SCASB, а для операций со слова- ми— как SCASW. Если флаг DF сброшен в 0, то со- 232
держимое регистра DI увеличивается на 1 или 2 при выполнении команд SCASB и SCASW соответственно.. _ Если флаг DF установлен в 1, то при выполнении этих команд содержимое регистра DI уменьшается на- . 1 и 2 соответственно. Команда SCAS используется : вместе с префиксами REPE/REPZ для поиска в стро- : ке элемента, отличного от заданного значения, или с префиксами REPNE/REPNZ для поиска заданных значений. Пример LEA DI, INPUT _CHAR загрузить адрес 1-га байта s Di CLD направление вперед MOV AL.20H ;код ASCII пробела MOV CX,6 ;число символов в строке REPNE SCASB искать 1-й пробел в строке JE FOUND-BLANK ;если пробел найден^ перейти ;на FOUND__BLANK STC Пробелов нет в строке Последовательность REPNE SCASB устанавливает ’ флаг ZF в 1, когда регистр СХ содержит число 0002Н, регистр DI содержит число 2404Н и выполняется пе- ; реход по адресу FOUND-BLANK: Строка Адрес INPUT-CHAR 41Н 2400Н 42Н 2401Н 43Н 2402Н 20Н 2403Н 41Н 2404Н 20Н 2405Н Флаги, затрагиваемые операцией 15 14 13 12 It 10 .9 876543210 | |*| XX X X X OF OF IF TF SF ZF AF PF CF Таблица перевода 1-й йайт 16- двоичная _ричная 2-й байт I байты 3, 4, 5, и, ! | формат операнда АЕ 1010 1110 AF Ю10 1111 операнда нет операнда нет 233
Примеры записи на языке ассемблера машинный К°Д команда ассемблера формат операнда i байты. такты AE SCASB •операнда нет 15 AF SCASW операнда нет 1 Ю SHR-логический сдвиг вправо (CF) •*----(Младший бит операнда), (Операнд) •*----(Операнд)/2. По команде SHR выполняются сдвиги в байте или слове операнда. При формате Reg/Mem,l выполняется сдвиг только на 1 разряд. Если задан формат Reg/Mem,CL, то пиело разрядов сдвига задается со- держимым регистра CL. Старшие разряды результата заполняются нулями. Если после сдвига знаковый бит результата сохраняет свое первоначальное значение, то флаг OF сбрасывается в 0. При произвольном чис- ле сдвигов (большем 1) состояние флага OF не опре- делено. Операнды команды SHR могут быть заданы в регистрах общего назначения или ячейках памяти. Команда изменяет флаги CF, OF, PF, SF и ZF. Со- стояние флага AF не определено. Пример Пусть регистр BL содержит число 77Н, содержи- мое регистра флагов равно F046H и выполняется команда SHR BL,1. Команда выполняется следующим образом: Флаг CF Содержимое регистра BL 0 0111 0111 =77Н Исходное состояние 1 ООП 1011 = ЗВН После сдвига После выполнения команды SHR BL,1 содержимое регистра BL будет равно ЗВН, флаг CF установлен в 1 и в регистре флагов будет записано число F003H. Поскольку бит знака в результате операции сдвига не изменил своего первоначального состояния, флаг OF сбрасывается в 0. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 10 I I I I Iх! I I 1Ф1 Н |XI I х| OF DF IF TF SF ZF AF PF CF 234
Таблица перевода Г 1-й байт 16’ двоичная ричная 2-й байт байты 3, 4, 5, б. формат операнда DO 1101 0000 D1 1101 0001 D2 1Ю1 0010 D3 1101 ООН Mod-010-Rm Mod-010-Rm Mod-010-Rnt Mod-О10-Rm Disp-Lo,Disp-Hi Disp-LatDisp-Hi Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Jteg8/Men»8,l Regl6/Meml6,l Keg8/Mem8,CL Kegi6/Meml6,CL Примеры записи на языке ассемблера машинный команда ассемблера 4 >орматоперанд£ (байты •' такты DOES SHR AL,1 RegO,1 2 2 D06F01 SHR BYTE PTR [BX+01J.1 Меш8,1 2-4 15+EA D1E8 SHR. AX.l Reg16,1 2 . * D12EOO2O SHR WORD PTR TEST,01 iMemlM 2-4 23+EA D2EA SHR DL.CL .Reg8.CL 2 8+4/bit D22C SHR BYTE PTR. [SI],CU Merna,CL ,2O+EAi4/bit *D3EB J she BX.CU Regl6,CL 2 8+4/blt D32D SHR WORD PTR tDILCL Mem8,CL ! 2-4 28+EA+4/Mt STC-установить флаг переноса (CF) ч----1. Команда устанавливает в единичное состояние флаг CF и не воздействует на остальные флаги и ре- гистры. Операнды в команде отсутствуют. Пример Пусть содержимое регистра флагов равно F046H. После выполнения команды STC новым содержимым регистра флагов будет F047H. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 6 5 4 3 2 7 0 Ш . .1 I I I I I I I I I I LLd OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16* двоичная ричная 2-й байт байты 3, 4, 5t 6, формат операнда F9 пп loot операнда нет 235
Примеры записи на языке ассемблера машинный код команда ассемблера форматоперанда байты такты F9 STC операнда нет 1 2 STD-установить флаг направления (DF) *-----1. Команда устанавливает в единичное состояние флаг DF и не воздействует на остальные флаги и ре- гистры. Команда операндов не имеет. При использо- вании строковых команд (CMPS, LODS, MOVS, SCAS, STOS) содержимое регистров SI и DI умень- шается на 1 или 2 для однобайтовых и двухбайтовых чисел соответственно. Пример Пусть содержимое регистра флагов равно F046H. По- сле выполнения команды STD его содержимое станет равно F446H. . Флаги, затрагиваемые операцией 15 14 13 12 II 10 9 8 7 6 5 4 3 2 I О ' I I—I 1 I | Г""1 (1 должна соответство» III | 1| | | | | вать флагу DF.) OF DF IF TF SF ZF AF PF CF Таблица перевода 1-й байт -16- двоичная ричная 2-й байт байты 3, 4t 5Z 6, формат операнда Я) 1111 1101 операнда нет Примеры записи на языке ассемблера машинный код команда ассемблера форматоперанда । байты такты FD STD операнда нет 1 2 STI-установить флаг прерывания (IF) «----1 Команда устанавливает в единичное состояние флаг IF и не влияет на остальные флаги и регистры. Команда операндов не имеет. При единичном флаге IF микропроцессор разрешает программные прерыва- ния и любые маскируемые или немаскируемые внеш- ние прерывания, приходящие на входы INTR и NML 236
Пусть содержимое регистра флагов равно F046H. После выполнения команды STI его новым содержи- мым будет F246H. Флаги, затрагиваемые операцией 15 14 13 12 И 10 9 8 7 6 5 4 3 2 I О L 1 1 11 OF OF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда FB 1111 1011 операнда нет./- ' Примеры записи на языке ассемблера машинный код команда ассемблера форматоперанд? байты такты FB STI операнда нет 1 2 STOS-запомнить строку (Операнд по адресу в регистре DI) <-----------(Аккуму- лятор). Если 1DF) = 0, то (DI) *----(DI) + 1 (байт) или • . (DI) 4------(DI) + 2 (слово). . Если (DF) = 1, то (DI) *----(DI) — 1 (байт) - . или (DI) -------(DI) — 2 (слово).. . По этой команде содержимое регистров AL или АХ переписывается в ячейку памяти, соответственно однобайтовую или двухбайтовую, адрес которой на^' ходится в регистре D1. В языке ассемблера для опе- раций с байтами эта команда записывается как STOSB, а для операций со словами как STOSW. Если флаг направления сброшен в 0, то содержимое ре- гистра DI увеличивается на 1 при выполнении коман- ды STOSB и на 2 при выполнении команды STOSW. Если флаг DF установлен в 1, при выполнении этих команд содержимое регистра DI уменьшается на 1 или 2 соответственно. Команда не имеет операндов и не влияет на флаги. Перемещаемый адрес, указы- ваемый регистром DI в этой команде, всегда опреде- 237
ляется относительно базового адреса дополнительного сегмента, который находится в регистре ES. Испои ь- вованне префикса переназначения сегмента с коман- дой STOS недопустимо. Пример Пусть содержимое регистра DI равно B000H, ре- гистра АХ — 4J42H и выполняется следующая после- довательность команд: CLD — сбросить флаг DF в О STOSW После выполнения команды STOSW в регистре DD будет записано число В002Н, а в ячейках памяти о адресами ВОООН и В001Н — 42Н и 41Н соответ- ственно. Пусть теперь содержимое регистра DI равно В800Н, а содержимое регистра AL — FFH и выпол- няется следующая последовательность команд: STD — установить флаг DF в 1 STOSB После выполнения команды STOSB содержимым регистра будет B7FFH, а в ячейке памяти с адресом В800Н будет записано FFH. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда АА 1010 1010 АВ 1010 1011 операнда нет операнда нет Примеры записи на языке ассемблера ^машинный код команда ассемблера формат операнда байты такты АА АВ STOSB STOSW операнда нет операнда нет 1 11 1 15 S U В-вычитание (1-й операнд) *-(1-й операнд) — (2-й операнд). Содержимое второго операнда при выполнении команды вычитается из содержимого первого операн- да и результат помещается на место первого операнд да. Первый операнд при этом теряется, а второй со- храняется неизменным. 238
Первый операнд может быть задан в регистре или ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти или непосредственно. Не до- пускается использование сегментного регистра или одновременная запись обоих операндов в ячейках па- мяти. Операнды могут быть как знаковыми, так и беззнаковыми числами. Возможно выполнение 8- и 16-разрядных операций. Пример Рассмотрим случай, когда регистр DL содержит число 58Н, регистр DH — число 20Н и регистр фла- гов процессора — число F046H. После выполнения команды SUB DL,DH в регистре DL будет записано число 38Н, а в регистре флагов — число F002H. Флаги, затрагиваемые операцией 15 14 1? 12 П 10 9 8 7 6 5 4 3 2 1 0 пт х| | | |х|х Iх! ? : ^7 0FDF1FTFSFZF AF PF CF Таблица перевода 1В-1Й римнг ''байт двоичная )Я 2-й байт байты 3, 4, 5, 6, формат операнда 28 0010 1000 Hod-Reg-Rm Disp-Lo,Disp-Hi Reg8/Mem8,Reg8 29 0010 1001 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg16/Mem16,Reg16 2А 0016 1010 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8,Reg8/Mem8 2В 2С 0010 1011 0010 1100 Mod-Reg-Rm Data 8 Disp-Lo,Disp-Hi Reg16,Reg18/Meml6 AL,Immed8 2D 0010 1101 Data-Lo Data-Hi AX,Immedl6 80 1000 0000 Mod-101-Rm Disp-Lo,Disp-Hi, Data8 Reg8/Mem8,Immed8 81 1000 0001 Mod-IOL-Rm Disp-Lo,Disp-Hi, Data-Lo, Data-Hi Reg16/Mem16,1smed16. 82 1000 0010 Mod-101-Rm Disp-Lo,Disp-Hi, Data8 Reg8/Mem8,Immed8 83 1000 ООН Mod-101-Rm Disp-Lo,Disp-Hi, Data-SX ' Regl6/MemL8,Immed8 233
Примеры записи на языке ассемблера машинный —-код команда ассемблера формат операнда байты такты 282С 28F6 SUB ISIJ.CH SUB DH,DH Mem8,Reg8 > RegB,Reg8 2-4 1 2 16+ЕА 3 машинный код команда ассемблера формат, операнда* байты такты 2944ОС SUB [SI+12],AX Meml6,Regl6 2-4 24+EA 29ЕВ SUB ВХ,ВР Regl6,Regl6 2 3 2А1ЕОО2О SUB BL,TEST_BYTB Beg8,Mem8 - 2-4 9+EA 2В05 SUB AX,(DI) Begl6tMeml6 2-4 13+EA 2С03 SUB AL,03 AL,Iinmed8 , 2 4 2D2589 SUB AX,8925H АХДмеШ ’ 3 4 80ЕС0В- SUB AH,11. Beg8fImine<13 3 4 80АС002405 SUB BYTE PTR [SI+2400H],5 Mem8,Immed8 3-5 17+EA 81E90EFF SUB CX.OFFOEft Begl6|Tnuoedl6 4 4 812СОО1О SUB WORD PTR [SI],1000H Meml6>Teunedl6 4-6 25+EA 82ЕСОА SUB AH,10 Reg8fTffimed8 3 4 83ЕА01 . . SUB DX.Ol 7 Regl6,Immed8 3 r 4 832E0900F7 . SUB WORD PTR LOC,-9 Meml6,Immed8 3-5 25+EA TEST-тес ((Первый операнд) AND (Второй операнд). (CF) ч— О (OF) *------ 0. По этой команде осуществляется логическое умно- жение первого и второго операндов. Результат изме- няет состояние флагов, но не меняет самих операндов. Первый операнд может быть задан в регистре или ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти или непосредственно. Недо- пустимо для любого из операндов использовать сег- ментный регистр или одновременно задавать их в 'ячейках памяти, Операнды могут быть знаковыми и \240
беззнаковыми числами. Возможно представление 8- и 16-разрядных команд. При выполнении операции из- меняется состояние флагов переноса CF, переполне- ния OF, паритета PF, знака SF и нуля ZF. Состояние флага вспомогательного переноса AF оказывается не- определенным. Команда TEST весьма удобна при те- стировании определенных разрядов байта или слова. Пример Пусть регистр АХ содержит число 9DE0H. Сле- дующая последовательность команд проверит, содер- жит ли 1 старший бит слова: TEST АХ.8000Н JNE BIT_ONE — бит равен I BIT-ZERO: CLD — бит равен 0. Поскольку результат выполнения команды TEST 'АХ,8000Н не равен нулю, флаг нуля ZF сбрасывается в 0. Затем управление передается по символическому адресу BIT-ONE, что указывает на то, что самый старший разряд слова в регистре АХ содержит 1. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 1 е 5 4 3 2 1 0 1 X X X X _Е OF OF JF TF SF ZF AF PF ’ CF Таблица перевода 1-й байт 16- ричная двоичная 2-й байт байты 3, 4, 5, 6, формат операнда 84 1000 0100 Mod-Reg-Rm Disp-Lo,Disp-Hi Reg8/Mem8,Reg8 . 85 1000 0101 Mod-Reg-Rm Disp-Lo,Disp-Hi Regl6/Meml6,Regl6 А8 1010 1000 Data8 AL,Immed8 А9 1010 1001 Data-Lo Data-Hi AX,Immedl6 F6 1111 ОНО Mod-000-Rm Disp-Lo,Disp-Hi, Reg8/Mem8,Immed8 Data8 F7 ИЦ 0111 Mod-000-Rm Disp-Lo,Disp-Hi, Regl6/Meml6,Immed16 Data-Lo,Data-Hi 241
Примеры записи на языке ассемблер# машинный код команда ассемблера формат операнда байты такты 840F TEST [ВХ),СЕ Mem8,Reg8 2-4 9+EA 84ЕЗ TEST АН,BL Reg8,Reg8 2 3 85542Q TEST [SX+20HJ.DX Meml6,Regl6 2-4 13+EA 85СВ TEST СХ,ВХ Regl6,Regl6 2 3 84AF4523 TEST [BX+2345H],GH Mem8,Reg8 2-4 9+EA 852D TEST [DI],BP Meml6,Regl6 ’ 2-4 13+EA А880 TEST AL,80H AL,Immed8 2 4 А90100 TEST AX.0001H AX,Immedl6 3 4 F6C2O1 TEST DL.Ol Reg8,Immed8 3 5 :F7C10080 TEST CX,8QQ0M Regl6,Immedl6 4 i 5 F606090001 TEST BYTE PTR L0C,01 Mem8,Immed8 3-5 11+EA F7060A000200 TEST WORD PTR WRD.02 Mem 16,1 earned 16 4-6 11+EA .WAIT-ожидание . Команда переводит микропроцессор в состояние ожидания, в котором он находится до тех пор, пока не будет активизирована линия TEST. Команда WAIT не воздействует ни на какие флаги и используется для обеспечения синхронизации микропроцессоров 8088 и 8087. Пример Рассмотрим выполнение следующей последователь- ности команд: ESC OFH,DX ;команда ESQRT для 8087 WAIT ;ожидание, пока 8087 выполнит ESQRT ESC ОАНДВХ] ;команда FST для 8087. Команда ESC OFH,DX означает для МП 8088 вы- полнение команды NOP, занимающей всего два такта. Для процессора 8087 предложение ESC означает команду FSQRT (извлечение квадратного корня из содержимого регистра, находящегося на вершине сте- ка 8087}. Выполнение такого задания займет в МП 8087 примерно 180 тактов. Заставляя микропроцессор 8088 ждать от микропроцессора 8087 сигнала завер* 242
шения команды FSQRT (активизации линии TEST в МП 8088), команда WAIT синхронизирует тем самым оба микропроцессора. Затем микропроцессор 8088 выполняет команду ESC ОАН, [ВХ], являющуюся следующей командой для МП 8087: записать результат извлечения квадрат- ного корня в ячейку памяти, определяемую содержи- мым регистра ВХ. Отсутствие команды WAIT приве- дет к тому, что команда ESC ОАН, [ВХ] выполнится немедленно, что приведет к неправильному разультату. Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6„ формат сперанда 9В 1001 1011 операнда нет Пример записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 9В WAIT операнда нет 1 Примечание, п — число Циклов (по 5 тактов) ожидания микропро- цессором активизации линии TEST. Каждые 5 тактов ЦП опрашивает свою шину TEST. Таким образом, эффективное время выполнения коман-» ды WAIT может изменяться от 3 тактов до бесконечности. ХСН G-замена (Временное хранение) *----(Первый операнд) (Первый операнд) •*----(Второй операнд) (Второй операнд) +----(Временное хранение). По этой команде первый и второй операнды меня- ются местами. Операнды могут быть заданы только в регистрах или ячейках памяти. Команда не воздей- ствует на флаги. Пример Пусть регистр АХ содержит число 2347Н, а ре- гистр СХ — число FF22H и выполняется команда XCHG АХ.СХ. Новым содержимым регистра АХ бу- дет FF22H, а регистра СХ — 2347Н. . 243
Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 86 1000 ОНО 87 1000 ОШ 1001 Ireg Mod-Reg-Rm Mod-Reg-Rm Disp-Lo,Disp-Hi Disp-Lo,Disp-Hi Reg8,Reg8/Me»8 Regl6,Regl6/Meml6 AX,Regl6* Примечания. В тех случаях, когда операнды являются 16-разряд- ными словами и хранятся в регистрах, причем одним из них является регистр АХ, не следует пользоваться форматом Mod-Reg-Rm. Более эф- фективным в этом случае является формат 1001 IReg. Команды XCHG АХ.АХ и NOP имеют один и тот же машинный код (90Н). Примеры записи на языке ассемблера машинный код команда ассемблера формат операнда байты такты 86C3 XCHG AL,BL Reg8,Reg8 2 4 867401 XCHG DH,[SI+01] Reg8,Mem8 2-4 17+EA J 87CB XCHG CX.BX Regl6,Regl6 2 4 B72E0G10' XCHG BP,TEST_L0CATI0N Reg16,Mem16 2-4 25+EA 92 XCHG AX.DX AX,Regl6 1 3 XLAT-передача из таблицы (AL) •*---((BX) + (AL)). Команда использует содержимое регистра AL как смещение относительно начала 256-байтовой таблицы, перемещаемый адрес начала которой задается ре- гистром ВХ. Байт таблицы, определяемый этим сме-т щением, заменяет исходное содержимое регистра AL. Смещение 0 определяет начальный байт таблицы. Команда не использует операнды и не воздействует на флаги. Она очень удобна для выборки данных из таблицы для других команд. Пример Пусть таблица, содержащая коды ASCII ряда шестнадцатеричных цифр, задается областью памяти JABLE. Следующая последовательность команд пере- 244
дает коды соответствующих шестнадцатеричных чи сел в регистр AL: TRANS MOV AL ,03 CALL TRANS CLC ’.Регистр AL содержит 33H Другие команды PROC NEAR LEA BX,TABLE ^Загрузить адрес таблицы ;в регистр ВХ XLAT ;В регистре AL содержится ;код ASCII TABLE RET DB 30H,31H,32H,33H,34H,35H,36H,37H,38H, 39Н, 41Н. 42Н, 43Н, 44Н ,45Н. 46Н TRANS ENDP Таблица перевода | 1-й байт 1 1б« двоичная I двоичная 2-й байт байты 3. 4, 5, 6, формат операнда | D7 1101 0111 операнда нет Пример записи на языке ассемблера ^шинный код команда ассемблера формат операнда байты такты D7 XLAT операнда нет 1 11 ХОR-исключающее ИЛИ (Первый операнд) •*----(Первый операнд) XOR (Второй операнд). (CF) <-----О (OF) +-----О По этой команде выполняется логическая опера- ция исключающего ИЛИ с первым и вторым операн- дами. Результат помещается на место •хранения пер- вого операнда, й он теряется. Второй операнд сохра- няется. Первый операнд может быть задан в регистре 245
или ячейке памяти. Второй операнд может быть за- дан в регистре, ячейке памяти или непосредственно. Недопустимо использовать для записи любого из опе- рандов сегментные регистры или записывать их одно- временно в ячейки памяти. Операция производится как над 8-, так и над 16-разрядными числами. Флаги переноса CF и переполнения OF всегда сбрасываются в 0. Пример Пусть регистр АХ содержит число 7FFFH, регистр DX — число 8000Н, а регистр флагов — число F046H. После выполнения команды XOR AX,DX регистр АХ будет содержать число FFFFH, а регистр флагов — F086H. Содержимое регистра АХ Содержимое регистра DX Новое содержимое регистра АХ 0111 1111 1111 1111=7FFFH 1000 0000 0000 0000=8000Н 1111 1111 1111 1111=FFFFH Поскольку младшие восемь разрядов регистра АХ содержат восемь единичных битов, т. е. четное количе- ство, флаг паритета PF устанавливается в 1. Так как результат является отрицательным, отличным от нуля числом в дополнительном коде, флаг знака SF уста- навливается в 1, а флаг нуля ZF сбрасывается в 0. Поскольку при выполнении этой команды никогда не бывает переноса и переполнения, флаги переноса CF и переполнения OF всегда сбрасываются в 0. Состоя- ние флага дополнительного переноса AF является не- определенным. Флаги, затрагиваемые операцией 15 14 13 12 11 10 9 8 7 б 5 4 3 2 1 0 0 X X И X 0 OF PF IF TF SF ZF AF PF CF Таблица перевода 1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 30 ООН 0000 31 ООН 0001 ' 32 ООН 0010 Mod-Reg-Rm Mod-Reg-Rm Mod-Reg-Rm Disp-Lo,Disp-Hi Disp-Lo f Disp-Hi Disp-Lo,Disp-Hi Reg8/Mem8,Reg8 Regl6/Meml6,Regl6 Regft, Reg8/Mem8 246,
1-й байт 16- двоичная ричная 2-й байт байты 3, 4, 5, 6, формат операнда 33 ООП ООП 34 ООП О1ОО 35 ООП 0101 80 1000 0000 81 1000 0001 Mod-Reg-Rm Data 8 Data-Lo Mod-110—Rm Mod-ПО—Rm Dis p-Lo, Dis p-Hi Data-Hi Disp-Lo,Disp-Hit Data8 Disp-LotDisp-Hi Data-Lo,Data-Hi Reg16,Reg16/Mem16 AL,Immed8 AX,Immedl6 Reg8/Mem8,Immed8 Reg 16/Mem 16,1 mined 16 Примеры записи на языке ассемблера 1 машинный код команда ассемблера формат операнда байты такты 3023 XOR [BP+DI],AH Mem8,Reg8 2-4 16+EA 32F6 XOR DH.DH Reg8,Reg8 2 3 310E0010 XOR WORD PTR SUM,CX Meml6,Regl6 2-4 24+ЕЛ 33C7 XOR AX,DI Regl6,Regl6 2 3 328D0001 XOR CL,(DI+100HJ Reg8,Mem8 2-4 9+EA 335C0C XOR BX,[SI+12] Regl6fMeml6 2-4 13+EA 34FF XOR AL.-l AL,Immed8 2 4 35FF7F XOR AX.7FFFH AX,Immedl6 3 4 80F301 XOR BL,01 Reg8,Immed8 3 4 80740290 XOR BYTE PTR [SI+2J.90H Mem8,Immed8 3-5 17+EA 81F6FF7F XOR SI.7FFFH Regl6,Immedl6 4 4 81360020FFFE XOR WORD PTR TEST.OFEFFH Meml6,Immedl6 4-6 25+EA
V АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ НАД ЦЕЛЫМИ ЧИСЛАМИ В дайной главе рассматривается группа команд, предназначен- ных для проведения арифметических действий с целыми двоич- ными или десятичными числами. Арифметические команды В эту группу входят такие команды, как: ADD (сложение), ADC (сложение с переносом), INC (ин- кремент), ААА (коррекция кода ASCII при сложе- нии), DAA (десятичная коррекция при сложении), SUB (вычитание), SBB (вычитание с заемом), DEC (декремент), NEG (отрицание), СМР (сравнение), AAS (коррекция кода ASCII при вычитании), DAS (десятичная коррекция при вычитании), MUL (умно- жение), IMUL (умножение целых чисел), ААМ (кор- рекция кода ASCII при умножении), DIV (деление), IDIV (деление целых чисел), AAD (коррекция кода ASCII при делении), CBW (перевод байта в слово), CWD (перевод слова в двойное слово). ADD (сложение): определяет двоичную сумму двух указанных операндов. Результат помещается на место операнда-приемника, второй операнд остается без изменения. Команда работает как с байтами, так и со словами. Оба операнда могут быть знаковыми или беззнаковыми двоичными числами. ADD изменяет состояние флагов AF, CF, OF, PF, SF и ZF. ADC (сложение с переносом): определяет двоич- ную сумму двух указанных операндов и содержимого флага переноса CF. Результат помещается на место операнда-приемника, второй операнд остается без из- менений. Команда работает с байтами и со словами, 248
со знаковыми и беззнаковыми двоичными числами. Она полезна при сложении целых чисел (смотри при- меры 32-битовой арифметики в этой главе). ADC из-, меняет состояние флагов AF, CF, OF, PF, SF и ZF. INC (инкремент): увеличивает содержимое опе- ранда на 1. Операнд может иметь длину 8 или 16 бит и рассматривается как беззнаковое двоичное число. Состояние флагов AF, OF, PF, SF и ZF изменяется, флага перенос CF остается без изменений. ААА (коррекция кода ASCII при сложении): по этой команде в регистр AL записывается двоично-де- сятичный код действительного числа в распакован- ном формате. Состояние флагов AF и CF изменяется, а флагов OF, PF, SF и ZF становится неопределен- ным. DAA (десятичная коррекция при сложении): пред- полагает, что регистр AL содержит результат сложе- ния двух действительных двоично-десятичных чисел неупакованного формата. Затем этот результат в реги- стре AL переводится в упакованный формат; DAA из- меняет состояние флагов AF, CF, PF, SF и ZF, а со- стояние флага переполнения OF становится неопреде- ленным. SUB (вычитание): определяет разность уменьшае- мого и вычитаемого. Результат помещается на место уменьшаемого, вычитаемое остается без изменений.. Команда работает со знаковыми и беззнаковыми дво- ичными числами. Операнды могут представляться байтом или словом. Команда изменяет состояние фла- гов AF, CF, OF, PF, SF и ZF. SBB (вычитание с заемом): определяет разность двух операндов, и, кроме того, по ней из уменьшаемо- го вычитается содержимое флага переноса. Результат помещается на место уменьшаемого. Вычитаемое остается без изменений. Оба операнда могут быть знаковыми и беззнаковыми двоичными числами в виде байта или слова. Команда полезна при вычита- нии целых чисел, длина которых может перекрывать байты умножения (смотри примеры 32-битовой ариф- метики в этой главе). SBB изменяет состояние флагов AF, CF, OF, PF, SF и ZF. DEC (декремент): уменьшает содержимое операн- да на единицу. Операнд может занимать 8 или 16 бит и рассматривается как двоичное число без знака. 249
DEC изменяет состояние флагов AF, OF, PF, SF и ZF. Флаг переноса остается без изменения. NEG (отрицание): вычитает содержимое указан- ного операнда из нуля. Операция используется для перемены знака на противоположный у двоичного числа со знаком, записанного в стандартном допол- нительном коде. NEG изменяет состояние флагов AF, CF, OF, PF, SF и ZF. CMP (сравнение): производит вычитание операн- дов. В результате изменяется состояние флагов AF, CF, OF, PF, SF и ZF, а содержимое операндов остает- ся без изменений. AAS (коррекция кода ASCII при вычитании): пред- полагает, что регистр AL содержит результат вычи- тания двух действительных двоично-десятичных чисел в распакованном формате. Команда переводит содер- жимое регистра AL в распакованный формат. AAS изменяет состояние флагов AF и CF. Флаги OF, PF, SF и ZF становятся неопределенными. DAS ^десятичная коррекция при вычитании): предполагает, что регистр AL содержит результат вычитания двух действительных двоично-десятичных чисел в упакованном формате. Затем содержимое ре- гистра AL переводится в упакованный формат. DAS изменяет состояние флагов AF, CF, PF, SF и ZF. Со- стояние флага переполнения OF становится неопреде- ленным. MUL (умножение): производит беззнаковое умно- жение содержимого аккумулятора (регистра AL при байтовом умножении и регистра АХ при умножении слов) на указанный операнд. Результатом байтового умножения является 16-битовое число, запоминаемое в регистре АХ. Результатом умножения слов является 32-битовое число, запоминаемое в паре регистров DX и АХ, причем в DX оказываются старшие 16 бит ре- зультата. Если старшие части результатов (АН при байтовом умножении и DX при умножении слов) от- личны от 0, флаги CF и OF переводятся в единичное состояние, показывая тем самым, что АН или DX со- держат значащие цифры результата. В противном случае эти два флага обнуляются. После MUL состоя- ние флагов AF, PF, SF и ZF становится неопределен- ным. 250
IMUL (умножение целых чисел): производит ум- ножение аккумулятора (регистра AL при байтовом умножении или АХ при умножении слов) на указан- ный операнд с учетом знаков. Результатом байтового умножения является 16-битовое число, хранящееся в регистре АХ. Результат умножения слов — 32-битовое число в паре регистров DX и АХ, причем в DX — стар- шие 16 бит результата. Если старшая часть (АН при байтовом умножении или DX при длинах операндов, равных слову) содержит не знак младшей части ре- зультата, а его значащие цифры, флаги CF и OF переводятся в единичное состояние. В противном слу- чае оба флага обнуляются. После выполнения IMUL состояние флагов AF, PF, SF и ZF становится неопре- деленным. ААМ (коррекция кода ASCII при умножении): предполагает, что регистр АХ содержит результат ум- ножения двух действительных двоично-десятичных чи- сел неупакованного формата. Затем содержимое ре- гистра АХ переводится в упакованный формат. ААМ изменяет состояние флагов PF, SF и ZF. Состояние флагов AF, CF и OF становится неопределенным. D1V (деление): осуществляет деление содержимого аккумулятора (АХ при байтовом делении или пары регистров DX и АХ при делении слов) на указанный операнд без учета знаков. При 8-битовом делении це- лая часть отношения помещается в регистр AL, а остаток — в регистр АН. При 16-битовом делении це- лая часть отношения размещается в регистре АХ, а остаток — в регистре DX. Если целая часть отноше- ния превышает емкость регистра AL (при байтовом делении) или АХ (при делении слов), т. е. если она соответственно больше FFH или FFFFH или если про- изводится попытка деления на 0, микропроцессор ав- томатически генерирует прерывание типа 0 (прерыва- ние из-за ошибки деления). Отношение всегда усека- ется до целого числа. Состояние флагов AF, CF, OF, PF, SF и ZF после команды DIV становится неопре- деленным. IDIV (деление целых чисел): выполняет деление содержимого аккумулятора (АХ при делении байто- вых чисел или пары регистров DX и АХ при делении слов) на указанный операнд с учетом знаков. При 8-битовом делении отношение размещается в регистре 251
AL, а остаток — в регистре АН. При 16-битовом деле- нии регистр АХ содержит отношение, а регистр DX — остаток. При байтовом делении максимальное поло- жительное частное не может превышать 127 (7FH), а минимальное отрицательное не может быть меньше —127 (81Н). При делении чисел длиной в слово ма- ксимальное положительное отношение равно 32767 (7FFFH), а минимальное отрицательное — равно —32767 (8001Н). Если отношение меньше допусти- мого минимума или больше максимума или если про- изведена попытка деления на 0, микропроцессор авто- матически генерирует прерывание типа 0 (прерывание из-за ошибки деления). Отношение всегда усекается до целой части: Состояние флагов AF, CF, OF, PF, SF h ZF становится неопределенным. AAD (коррекция кода ASCII при делении): изме- няет содержимое регистра AL после деления двух действительных двоично-десятичных чисел неупако- ванного формата так, чтобы отношение так же пред- ставляло собой действительное число, записанное дво- ично-десятичным кодом в неупакованном формате. Команда изменяет состояние флагов PF, SF и ZF и делает неопределенным состояние флагов AF, CF и OR CBW (перевод байта в слово): переносит знак байта из регистра AL в регистр АН. Полезно для пе- ревода 8-битового числа со знаком в 16-битовое зна- ковое число. Состояние флагов при этом не изменя- ется. CWD (перевод слова в двойное слово): переносит знак слова из регистра АХ в регистр DX. Применяется при преобразовании 16-битового числа со знаком в ре- гистре АХ в 32-битовое число со знаком размещения в паре регистров DX,AX. Команда не изменяет состоя- ния флагов. Арифметические операции с 32-разрядными числами Сложение Программа, приведенная ниже, предназначена для сложения двух 32-битовых целых чисел, содержащих- ся в ячейках памяти с символическими именами 252
NUMBER 1 и NUMBER2. Результат сложения поме- щается в ячейку памяти с символическим именем SUM. На рис. 5.1 приведена блок-схема распределе- ния памяти для хранения операндов и результата. В этом примере содержимое каждого из целочислен- ных операндов и результат операции хранятся в па- мяти в стандартном двухсловном формате. Листинг программы сложения показан на рис. 5.2. В данном примере (рис. 5.2) группа команд, осу- ществляющих сложение, оформлена в виде процеду- ры. Первая строка листинга программы объявляет о том, что процедура внутрисегментная (оператор NEAR). В программе предполагается, что сегменты команд и данных и дополнительный сегмент перекры- ваются (т. е. все три сегмента занимают одни и те же 64 Кбайт памяти). , NUMBER 1—символическое имя ячейки памяти, хранящей одно из 32-битовых целых чисел. То, что Рис. 5.1. Блок-схема распределения в памяти операндов и ре» зультата 32-разрядного сложения. 253 j
0000 ADD32 PROC NEAR Процедура сложения двух 32-битовых целых чисел 0000 8D361 соо LEA SI,NUMBER1 ;SI содержит перемещаемый адрес числа NUMBER 1 0004 8D1E2 ООО LEA BX,NUMBER2 ;ВХ содержит перемещаемый адрес числа NUMBER2 0003 8D3E2 400 LEA DI, SUM ;DI содержит перемещаемый адрес числа SUM ооос 8В04 MOV AX,[SI] ;АХ содержит младшее слово первого числа 000Е 0307 ADD AX,[BX] Суммирование младших слов двух чисел 0010 8905 MOV [DI], AX :3апись младшего слова числа SUM 0012 8В4402 MOV AX,[SI + 2] ;АХ содержит старшее слово первого числа 0016 134702 ADC АХДВХ + 2] Суммирование старших слов двух чисел, а также щерено са от предыдущего сложения 0018 894502 MOV [DI+ 2], AX ;3апись старшего слова числа SUM 001В сз RET 001С 87D6 1200 NUMBER1 DD 12 34567 ;Первое число 0020 6F2C 4400 NUMBER2 DD 44 67823 ;Второе число 0024 ?? SUM DD ? результат сложения будет представлен ;двойным словом 0028 ADD32 ENDP Рис, 5.2, Процедура сложения 32-битовых целых чисел.
ячейка NUMBER1 содержит двухсловную константу; объявляется директивой DD (определение двойного слова). Макроассемблер резервирует четыре байта памяти для 32-битового целого числа, а затем запол- няет их' (перемещаемые адреса с 1СН по 1FH) чис- лом 12D687H, являющимся шестнадцатеричной за- писью десятичного числа 1 234 567. Младшие 16 бит 32-битового целого числа в соответствии со стандарт-i ным форматом хранения двойных слов занимают младшие адреса. Аналогично NUMBER2 — другой символический адрес, представляющий ячейки памяти, содержащие второе 32-битовое целое слагаемое. Макроассемблер резервирует четыре байта памяти (перемещаемые адреса с 20Н по 23Н) для размещения числа 442C6FH (шестнадцатеричное представление десятич- ного числа 4 467 823). Результат сложения — 32-битовое целое число, хранящееся по символическому адресу SUM (переме- щаемые адреса с 24Н до 27Н). Как видно из листин- га, содержимое этого двойного слова вначале остава- лось неопределенным. Когда же программа полностью завершается, результат сложения — шестнадцатерич- ное число 5702F6H (десятичное 5702390) — записыва- ется по символическому адресу SUM. Первые три команды процедуры используют ре- гистры SI, ВХ и DI в качестве указателей адресов ячеек памяти, хранящих два 32-битовых целочислен- ных операнда и результат сложения. Команда LEA (загрузить исполнительный адрес) заносит в регистры SI, ВХ и DI соответственно величины 001СН, 0020Н и 0024Н. Далее сложение осуществляется следующим образом: суммируются младшие слова двух указан- ных операндов; этот частичный результат записывает- ся по адресу, указанному в регистре DI; суммируются старшие слова целых слагаемых; результат дописы- вается к результату предыдущей операции. Этот ал- горитм легко можно расширить для сложения двух двоичных целых чисел. Вычитание Микропроцессор 8088 использует флаг переноса для регистрации переноса или заема единицы в наи- более значимом бите байта или слова (соответственно 255
256 0000 0000 8D361C00 SUB32 PROC LEA .NEAR SI,NUMBER1 процедура вычитания двух 32-битовых целых чисел ;SI содержит перемещаемый адрес числа NUMBER 1 0004 8D1E2000 LEA BX,NUMBER2 ;ВХ содержит перемещаемый адрес числа NUMBER2 0008 8D3E2400 LEA DI,RESULT ;DI содержит перемещаемый адрес числа RESULT ооос 8В04 MOV AX, [SI] ;АХ содержит младшее слово первого числа 000Е 2В07 SUB АХДВХ] ;Вычитание младших слов двух чисел 0010 8905 MOV [DI], AX ;3апись младшего слова числа RESULT 0012 8В4402 MOV AX,[SI + 2], ;АХ содержит старшее слово первого числа 0015 1В4702 SBB АХДВХ + 2] ;Вычитание старших слов двух чисел с учетом бита Юзаема предыдущего вычитания 0018 894502 MOV [DI+ 2], AX 001В СЗ RET ;3апись старшего слова числа РЕ SULT 001С 87D6 1200 NUMBER! DD 1234567 0020 6F2C 4400 NUMBER2 DD 4467823 ;Первое число 0024 ?? RESULT DD ? ;Второе число ;Результат вычитания будет представлен ;двойным словом 0028 SUB32 ENDP Рис.. 5.3. Процедура вычитания двух 32-битовых целых чисел.
при 8- или 16-битовых операциях)'. Таким образом* флаг переноса в сочетании с командой SBB (вы- читание с заемом) может эффективно применяться для вычитания целых чисел, занимающих больше 16 бит. Ниже приводится программа вычитания двух 32-битовых целых чисел, имеющих символические адреса NUMBER 1 и NUMBER2. На рис. 5.3 приведена распечатка текста внутрисегментной процедуры нахо- ждения разности указанных операндов и занесения результата в ячейку с символическим адресом RE- SULT. Как и в случае сложения, регистры ВХ, SI и DI используются как указатели адресов ячеек памяти, хранящих 32-битовые целые числа. Сегменты команд, данных и дополнительный сегмент, как и раньше, пе- рекрывают друг друга. После завершения программы ячейка с символическим адресом RESULT содержит в двойном слове величину FFCEAA18H, являющуюся шестнадцатеричной записью в стандартном дополни- тельном коде десятичного отрицательного числа —3233256. Эта же схема вычитания может быть распространена и на действия с двоичными целыми числами большей разрядности. Умножение Теперь перейдем к решению' более сложной зада- чи— перемножению двоичных целых чисел, превы- шающих 16 бит. Для того чтобы уяснить логику алго- ритма целочисленного двоичного умножения, оассмо- трим простой пример десятичного умножения. Процесс перемножения десятичных чисел 135 и 43 можно представить следующим образом: Частичные результаты, полученные при умно- жении на цифру 3 множителя 135 (множимое) 43 (множитель) 15 (3X5) Первый частичный результат 9 (3X3) Сдвиг на 1 позицию относительно 15 3 (3X1) Сдвиг на 1 позицию относительно 9 9 Л. Дао 257
Частичные результаты, 20 (4X5) Сдвиг на 1 позицию полученные при умно- жении на цифру 4 12 (4 X 3) относительно 15 Сдвиг на 1 позицию множителя 4 (4X1) относительно 20 Сдвиг на 1 позицию относительно 12 5805 (Конечный результат = сумме всех частичных результатов) Операция умножения состоит из перемножений каждой цифры множителя со всеми цифрами множи- мого, начиная с младшего разряда до старшего. По- скольку множимое имеет три цифры, а множитель — две, всего будет получено шесть (3 X 2) частичных результатов. Первый частичный результат, в данном случае 15 (3X5), получается перемножением край- них правых цифр множителя и множимого. Второй частичный результат, 9 (3X3), получается в результате умножения второй цифры множимого на ту же цифру множителя. Прежде чем складывать эти частичные результаты, необходимо выполнить еще одну операцию. Частичный результат 9 перемещается на одну позицию влево по отношению к числу 15. Первый частичный результат, получаемый при умно- жении цифр множимого на вторую цифру множителя, также сдвигается на одну позицию влево по отноше- нию к первому частичному результату в группе умно- жений на предыдущую цифру множителя (число 20 по отношению к числу 15). Шесть частичных резуль- татов, правильно сдвинутых и затем сложенных, дают окончательный результат 5805. Алгоритм перемножения двоичных целых чисел в общем точно такой же, как и описанный выше для десятичных чисел. Каждое слово двоичного числа можно рассматривать как аналог десятичной цифры десятичного числа. На рис. 5.4 иллюстрируется про- цедура умножения двух 32-битовых целых чисел. В результате получается 64-битовое число. На рис. 5.5 на языке ассемблера МП 8088 пред- ставлен текст процедуры перемножения 32-битовых целых чисел 6891846 и 4596840. Они содержатся в ячейках с символическими адресами NUM.BER1 (пе- ремещаемые адреса с 38Н по ЗВН) и NUMBER2 (перемещаемые адреса с ЗОН по 3FH). Результат 258
A B Старшие Младшие 32-разрядное 16 разрядов 16 разрядов множимое С О Старшие Младшие 32-разрядный 16 разрядов 16 разрядов множитель <32-разрядный частичный | результат B*D ___________L_________ 32-разрядный частичный результатАхр 32-разрядный частичный результат* В*С ......—f 32-разрядныи частичный i результат А * С { 64-разрядный окончательный результат Результат Рис. 5.4. Блок-схема алгоритма умножения 32-разрядных целых чисел. помещается в ячейку с символическим адресом PRO- DUCT (перемещаемые адреса с 40Н по 47Н). Резер- вирование 8 байт памяти под 64-битовый результат осуществляется директивой DQ (определение двух двойных слов). В результате выполнения процедуры по адресу PRODUCT оказывается записанным шест- надцатеричное число 1CCFA9C89200H. 9» 259
0000 MUL32 PROC NEAR -.Процедура умножения 32-битовых чисел ;Эта процедура выполняет умножение двух целых 32-битовых беззнаковых чисел. Можно представить первое число в виде ab, где а и b представляют соответственно старшее ;и младшее 16-битовые числа. Аналогично второе 32-битовое число можно представить ' ;в виде cd. Данная процедура осуществляет: 1 ; vab ; cd *' ьо о> о ; . bd (b X d) Первый частичный результат £ ad, • (а X d) -X ; Т be (b X с) Сдвиг на одну позицию относительно 1-го частичного результата ; “г ас (йХс) ; шпор (конечный результат) ' 'Л 0000 8D363800 LEA SI,NUMBER 1 ;SI указывает первое целое число 0004 8D1E3C00 ;LEA<BX,NUMBER2 ;ВХ указывает второе целое число 0008 8D3E4000 LEA DI,PRODUCT ;DI указывает результат ооос 8В04 MOV AX,[SI] 000Е F727 MUL, WORD PTR[BX] ;Вычисляется b X d . <. 0010 8905 MOV [DI],AX -.Младшее слово первого частичного результата ,0012 895502 MOV [DI + 02],DX •.Старшее слово первого частичного результата
0015 8В4402 MOV AX,[SI + 02] 1 0018 F727 MUL WORD PTR[BX] вычисляется a X d 001А 014502 ADD [DI+ 02],AX ;Сдвиг второго частичного результата 001D 115504 ADC [DI + 04],DX ;Старшее слово второго частичного результата 0020 8В04 MOV АХ,[SI] 0022 F76702 MUL WORD PTR[BX + 02] вычисляется вХс 0025 014502 ADD [DI+ 02],АХ ;Частичный результат умножения на вторую ;цифру множителя 0028 115504 ADC [DI + 04],DX ;Старшее слово третьего частичного результата 002В 8В4402 MOV АХ,[SI+ 02] 002Е F76702 MUL WORD PTR[BX + 2] вычисляется a X с 0031 014504 ADD [DI+ 04],AX ;Сдвиг четвертого частичного результата 0034 115505 ADC [DI + 05],DX ;Старшее слово четвертого частичного результата 0037 СЗ RET 0038 4629 6900 NUMBER 1 DD 6891846 ;Первое 32-битовое целое число 003С 0023 4600 NUMBER2 DD 4596480 гВторое 32-битовое целое число • ’ -.w 0040 ?? PRODUCT DQ ? ;64-битовый результат умножения 0048 MUL ENDP Рис, 5.5, Процедура умножения 32 битовых целых чисел.
Генерация псевдослучайных чисел Одним из наиболее полезных приложений микро- процессоров является применение их для моделирова- ния реальных процессов и явлений окружающего нас мира. С помощью микрокомпьютера можно успешно моделировать такие процессы и явления, как движе- ние потока нефти или газа в трубопроводах, взлет и посадка самолетов, распределение потока работ в цифровой вычислительной системе, движения графи- ческого изображения в электронных видеоиграх, и многие другие. Многие из этих моделей становятся тем? ближе к своим реальным прототипам, чем больше содержат случайных и заранее неопределяемых эле- ментов. Одним из приемов, используемых при построении моделей, которые имитируют события, происходящие через случайные интервалы времени, является гене- рация с помощью компьютеров последовательностей псевдослучайных чисел. Такие' последовательности, заданные надлежащим образом, могут храниться в памяти микрокомпьютера в виде таблиц. Однако ча- сто желательно, чтобы микропроцессор сам мог гене- рировать случайные величины, а не использовать за- готовленные таблицы. Если известны алгоритм вычислений и исходные ве- личины, микропроцессор может генерировать последо- вательность случайных чисел. И хотя они не являются действительно случайными, многие их характеристи- ки совпадают с характеристиками действительно слу- чайных последовательностей. По^ этой причине генери- руемые последовательности являются псевдослучай- ными. Особенно наглядно это проявляется в больших последовательностях псевдослучайных чисел, в кото- рых практически невозможно предсказать каждое по- следующее число. Одним из широко используемых методов генерации псевдослучайных чисел является метод последователь- ного умножения1). Его алгоритм состоит из следую- щих шагов: Подробное описание этого метода не входит в задачу автора. Читатель может ознакомиться с ним в книге Shan S., Kuo, Computer Applications of Numerical, Methods (Reading, Mass., Addison-Wesley, 1972). 262.
1. Выбирается какое-нибудь значение X. Оно на- зывается начальным значением и является первым числом генерируемой псевдослучайной последователь- ности. 2. X умножается на постоянный множитель N. В результате получается число Р. 3. Р делится на константу М, называемую моду- лем. Остаток от деления образует новое значение ве- личины X и является следующим числом псевдослу- чайной последовательности. 4. Шаги 2 и 3 повторяются. Поскольку генерируемые псевдослучайные числа являются остатками от деления Р/М, то значение мо- дуля М определяет максимально возможную длину последовательности. Так, если М = 216, то перемен- ная X может принимать 216 или 65 536 значений. Та- кой диапазон последовательности вполне достаточен для большинства применений. Если вычисления огра- ничиваются 16-битовыми числами, то для достижения максимально возможной независимости соседних чле- нов последовательности величина множителя N не должна превосходить квадратного корня из модуля М. Для того чтобы закон распределения чисел был более или менее постоянен на протяжении всей последова- тельности, последние три бита сомножителя X долж- ны содержать ОН или 101. Текст описанной процедуры приведен на рис. 5.6, псевдослучайное число содержится в регистре АХ. Следующее число из ряда, содержащего до 65536 чи- сел, получается методом последовательного умноже- ния и помещается в регистр АХ. Начальное значение должно быть беззнаковым числом от 0 до 65536. На рис. 5.7 приведены 200 псевдослучайных чисел, полученных с помощью этой процедуры. Начальное значение равнялось десятичному числу 127. Используя случайные числа, можно легко органи- зовать перемещение по экрану графического изобра- жения видеоигры. При этом практически невозможно предсказать каждое следующее движение. Чем более случайными будут перемещения, тем более захваты- вающими и реалистичными будут игры. Рассмотрим видеоигру, в которой графическое изо- бражение может перемещаться в четырех направле- ниях: вверх, вниз, влево и вправо. Процедура на .263
0000 PSEUDO-RANDOM PROC NEAR Генерация в AX нового случайного чисЛа 0000 51 PUSH CX Сохранение предыдущего содержимого СХ 0001 52 PUSH DX Сохранение предыдущего содержимого DX 0002 В9050! MOV CX,261 ч г to О ‘ 0005 F7E1 MUL CX ;64-битовый результат находится в DX,A?C Содержимое регистра АХ является остатком от деления ;(DX,AX) на 2 в степени 16 0007 5А . POP DX ;Из стека считывается предыдущее содержимое DX 0008 59 POP CX :Из стека считывается предыдущее содержимое СХ 0009 СЗ RET 000А PSEUDO-RANDOM ENDP г Рис. 5.6. Процедура генерации псевдослучайных чисел.
200 десятичных псевдослучайных чисел ^построенных процедурой PSEUDO RANDOM 127 33147 615 29443 16911 22859 2423 42579 37535 31771 34695 11427 33327 47595 35991 22003 41151 58043 10407 29251 32335 50827 27575 53651 43743 13659 26055 50147 46703 65323 ' 9944 39480 15128 16248 46424 • 58O4Q 9624 21496 39896 58168 43032 24696 23128 7096 17048 58616 28888 3128 29976 24952 24408 13496 49048 22008 42456 5432 41496 17016 50264 11704 40088 42744 15064 65080 12056 888 35160 1720 55704 55288 12248 51000 7192 42104 44632 49080 30360 59640 34008 28728 26904 9592 13144 22712 29592 55800 14808 63800 5656 34424 6232 53688 53400 43768 20184 25144 8984 51064 23896 10936 36248 23544 50136 43832 36888 59512 600 25528 43672 60664 39128 54328 23832 59768 1880 31928 10136 24056 52696 56632 35352 51832 27736 30136 1176 44792 25304 50744 5912 35704 12632 20152 16792 57336 22488 36664 1048 11384; 22104 1976 56984 61688 44248 14392 20760 44408 56152 41144 56216 57848 25048 49464 65048 3704 49240 6584 14488 45816 30424 10808 2840 20344 1368 29368 62872 25592 60376 29496 30744 28792 43608 43960 4760 62712 49368 39992 17688 29048 44888 50360 36760 26104 62936 42296 29208 21-112 5208 48568 27800 46840 35544 36408 65304 4984. 55640 38584 43416 59384 32728 22328 Те же 200 псевдослучайных чисел, в шестнадцатеричном виде 007F 817В 0267 7303 420F 594В 0977 А653 929F 7С1В 8787 2САЗ 822F В9ЕВ 8С97 55F3 A0BF Е2ВВ 28А7 7243 7E4F С68В 6ВВ7 D193 AADF 355В 65С7 СЗЕЗ B66F FF2B 26D8 9А38 ЗВ18 3F78 В558 Е2В8 2598 53F8 9BD8 Е338 А818 6078 5А58 1ВВ8 4298 E4F8 70D8 ОС38 7518 6178 5F58 34 В8 BF98 55F8 A5D8 1538 А218 4278 С458 2DB8 9С98 A6F8 3AD8 FE38 2F18 0378 8958 06В8 D998 D7F8 2FD8 С738 1С18 А478 АЕ58 BFB8 7698 E8F8 84 D8 7038 6918 2578 3358 58В8 7398 D9F8 39D8 F938 1618 8678 1858 D1B8 D098 AAF8 4ED8 6238 2318 С778 5D58 2АВ8 8D98 5BF8 C3D8 АВ38 9018 Е878 0258 63В8 АА98 ECF8 98D8 D438 5D18 Е978 0758 7СВ8 2798 5DF8 CDD8 DD38 8А18 СА78 6С58 75В8 0498 AEF8 62D8 С638 1718 8В78 3158 4ЕВ8 4198 DFF8 57D8 8F38 0418 2С78 5658 07В8 DE98 F0F8 ACD8 3838 5118 AD78 DB58 А0В8 DB98 E1F8 61D8 С138 FE18 0Е78 С058 19В8 3898 B2F8 76D8 2А38 0В18 4F78 0558 72В8 F598 63F8 EBD8 7338 7818 7078 АА58 ЛВВ8 1298 F4F8 C0D8 9С38 4518 7178 AF58 С4В8 8F98 65F8 F5D8 А538 7218 5278 1458 BDB8 6С98 B6F8 8AD8 8Е38 FF18- 1378 D958 96В8 А998 E7F8 7FD8 5738 -<• Рис. 5.7. 200 псевдослучайных чисел. 265
0000 MOVEMENT PROC NEAR 0000 В9С800 MOV CX,200 количество псевдослучайных Чисел. •.которые надо построить 0003 8D3E2C00 LEA bl.OUT-AREA ;Случайные числа будут храниться ;в этой области памяти 0007 А12А00 MOV AX, SEED.VALUE ;Начальное значение последова- тельности 000А NUMBER^LOOP: ОООА Е8Е700 CALL PSEUDO-RANDOM ю СП 000D 3DFF3F CMP AX, 16383 ;64К возможных значений разделяются 0010 В200 MOV DL,0 ;на четыре диапазона, соответствующие числам 0,1,2,3 0012 7610 JBE STORE-MOVEMENT 0014 3DFF7F CMP AX ,32767 0017 В201 MOV DL.01 0019 7609 JBE STORE-MOVEMENT 001В 3DFF&F CMP AX,49151 001Е В202 MOV DL.02 0020 7602 JBE STORE-MOVEMENT 0022 В202 MOV DL,02
0024 STORE-MOVEMENT: 0024 8815 MOV [DI],DL Записывается число, соответствующее перемещению 0026 47 INC DI 0027 Е2Е1 LOOP NUMBER-LOOP 0029 СЗ RET 002А 9500 SEED.VALUE DW 149 002С OUT-AREA DB 200 DUP(0) 00F4 MOVEMENT ENDP 00F4 PSEUDO-RANDOM PROC NEAR ;B AX генерируется новое случайное ;число 00F4 51 PUSH СХ 00F5 52 PUSH DX 00F6 B9Q501 MOV CX,26l 00F9 F7₽l MUL CX 00F В 5А POP DX OOF С 59 pop CX 00FD СЗ RET 00FE PSEUDO-RANDOM E.NpP Рцс.. 5.8. Процедура генерации случайных перемещений,
0 2 0 1 1 1 9 2 t2 1., ’ 2 0 2 2 2 1 2 3 0 1 1 3 1 3 2 O' L 3 2 2 ' 0 2 0 0 2 3 0 1 2 c 2 1 1 0 1 3 1 0 1 1 UP LEFT UP DOWN DOWN DOWN UP LEFT LEFT DOWN LEFT UP LEFT LEFT LEFT DOWN LEFT RIGHT UP DOWN DOWN RIGHT DOWN RIGHT LEFT UP DOWN RIGHT LEFT RIGHT UP LEFT UP UP LEFT P1GHT UP DOWN LEFT RIGHT LEFT DOWN DOWN UP DOWN RIGHT DOWN UP DOWN DOWN Рис. 5.9. Пятьдесят чисел, представляющие случайные переме- щения, сгенерированные процедурой MOVEMENT. UP —вверх, DOWN—вниз, LEFT —влево, RIGHT — вправо. рис. 5.8, генерирующая псевдослучайные числа мето- дом последовательного умножения, применена для моделирования перемещений графического изображе- ния на экране. Начальное значение для процедуры взято из ячейки с символическим адресом SEED-VA- LUE, в которую засылается какой-либо случайный параметр, такой, например, как текущее значение вну- треннего таймера системы, шестнадцатеричное значе- ние введенного с клавиатуры символа и т. п. Для простоты процедура использует начальное значение, равное 127. Так как построенная последовательность имеет за- кон распределения, близкий к равновероятному, каж- дое направление перемещения выбирается примерно в 25 процентах случаев. Определяемые направления запоминаются в памяти, начиная с ячейки с символи- ческим адресом OUT-AREA. Выходные величины О, 1, 2 и 3 представляют соответственно направления движения вверх, вниз, налево и направо. На рис. 5.9 показны первые 50 возможных случайных пере- мещений, построенные процедурой, приведенной на рис. 5.8. 268
Перевод чисел из шестнадцатеричного представления в десятичное Числовые данные обычно поступают в микро- компьютер в виде десятичного представления кода ASCII В то же время микропроцессор 8088 не мо- жет выполнять арифметические операции с такой формой данных и поэтому он должен перевести их в двоичное представление. Если. результат должен быть выведен в требуемом виде на стандартные вы- ходные устройства, такие, как печатающее или видео- терминал, числа вновь необходимо перевести в деся- тичное представление кода ASCII. Процедура, предназначенная для перевода содер-- жимого регистра АХ в ряд символов ASCII кода, со- ответствующих десятичному числу, адрес которого на- ходится в регистре DI, представлена на рис. 5.10. Чис- ло, подлежащее переводу, трактуется как число со знаком. Таким образом, кодом ASCII Должны пред- ставляться числа в диапазоне от -J-32767 до —32768. Перевод из шестнадцатеричного представления в десятичное осуществляется с помощью деления. Команда DIV в этом случае работает очень эффек- тивно. Переводимое число делится на 10, и остаток образует цифру десятичного представления. Результат деления снова делитсян& 10, и новйй остаток обра- зует следующую цифру десятичного представления. Процесс деления получающихся частных (их целых частей) на 10 продолжается до тех пор, Пока частное не станет меньше 10. КажДый остаток становится сле- дующей цифрой' десятичного представления. Ниже приводится пример перевода шестнадцатеричного числа 345Н в десятичное 837: 345/ОАН = 053Н и остаток 07Н .. 1 --------:---- ОЗЗН/ОАН =/008Н и остаток ОЗН Последний остаток 08Н------- Получаемое десятичное число 3’ 7 269
0000 INTEGER PROC NEAR Процедура перевода 16-битового шестнадцате- ричного числа со знаком в регистре АХ ;в эквивалентное представление кодом ASCII, PUSH ;которое хранится в ячейке, адресуемой регистром DI 0000 51 CX 0001 50 PUSH AX 0002 52 PUSH DX DX.DX ^Сохранение содержимого используемых регистров 0003 2BD2 SUB, ... * 0005 3D0000 CMP AX,0 ;Проверка на положительность 0008 7902 JNS POSITIVE ♦ о ОООА F7D8 NEG AX, 0Q0C POSITIVE: ооос Е80С00 CALL CONVERT процедура перевода 000F 5А POP DX 0010 58 POP AX ООН 3D0000 CMP AX,0 0014 7903 JNS DONE 0016 C6052D MOV BYTE PTR[DI]/-' ;3нак минус для отрицательных чисел 0019 DONE: 0019 59 POP ex 001А СЗ RET
001В INTEGER ENDP 001В CONVERT PROC NEAR J Процедур а перевода 001В В90А00 MOV CX,10 001Е LOOP-COUNT 001Е F7F1 DIV CX 0020 80СА30 OR DL,30H ;Перевод в код ASCII 0023 8815 MOV [DI],DL ;Вывод десятичной цифры 0025 4F DEC DI 0026 3D0A00 CMP AX, 10 0029 BA0000 MOV DX,00 002С 73F0 JAE LOOP-COUNT 002Е 3C00 CMP AL, 00 0030 7405 JE EXIT. .CONVERT ;Первые нули не отображать 0032 0С30 OR AL,ЗОН 0034 8805 MOV [DI], AL :Старшая значащая цифра 0036 4F DEC DI Следующая по порядку цифра 0037 EXIT-CONVERT: 0037 СЗ RET 0038 CONVERT ENDP Рис. 5,10, Процедура перевода 16-битового целого числа со знаком из шестнадцатеричного представления в десятичное.
VI ЛОГИЧЕСКИЕ ОПЕРАЦИИ В данной главе рассматривается группа команд микропроцес- сора 8088, выполняющих Логические операции. Эти команды по- зволяют оперировать отдельными битами двоичных чисел. Ло- гические операции связаны с аналогичными логическими функ- циями и значительно отличаются от арифметических операций, рассмотренных в предыдущей главе. В семействе микропроцессоров 8086/8088 реализованы че- тыре стандартные логические операции: И, включающее ИЛИ, исключающее ИЛИ и НЕ. Стандартные операции Логическое И Допустим, что имеются два операнда, каждый из которых может быть равен 0 или 1. Если оба операн- да равны 1, применение логического И дает результат, равный 1. В любом другом случае результат равен 0. На рисунке 6.1, А приведена так называемая таблица истинности операции “логическое И”. В таблице по- казаны результаты выполнения операции “логическое И” во всех четырех возможных случаях. Включающее ИЛИ Второй логической операцией является ИЛИ. Для выразительности и ясности в ряде ситуаций ее также называют включающим ИЛИ. Результат выполнения этой операции равен 1, если один из операндов или оба сразу равны 1. Результат равен 0 только в том 272
A Первый операнд С Первый операнд Рис. 6.1. Логические функции. А — И; В — ИЛИ; С — исключающее ИЛИ; D — НЕ. случае, когда оба операнда равны 0. Таблица истин- ности для включающего ИЛИ приведена на рис. 6.1, В. Исключающее ИЛИ Результат этой операции равен 1, если один из операндов, но не оба сразу, равен 1. Результат ра- вен 0, если оба операнда одновременно равны 0 или 1. Таблица истинности для исключающего ИЛИ при- ведена на рис. 6.1,С. ; - "• ' - Логическое НЕ Операция применяется, только к одному операнду. Результатом ее выполнения является, величина, проти- воположная значению операнда. Результат равен 1, если операнд равен 0, и результат равен 0, если опе- ранд равен 1. Таблица истинности для логического НЕ приведена на рис. 6.1, D. , < - Логические команды Система команд МП 8088 предусматривает пять команд, обеспечивающих выполнение описанных логи- ческих операций: AND (логическое И),-OR (включаю- 273
щее ИЛИ)', NOT (логическое НЕ)', TEST (тест на ло- гическое И) и XOR (исключающее ИЛИ). Логические команды всегда переводят флаг переполнения OF и флаг переноса CF в нулевое состояние, изменяют со- стояние флагов знака SF и нуля ZP, при этом со- стояние флага вспомогательного переноса AF всегда остается неопределенным. AND: выполняет операцию логического И приме- нительно к двум операндам. Результат помещается на место операнда-приемника. Операнд-источник оста- ется без изменений. Возможны 8- и 16-битовые опера- ции. Бит результата равен 1, если соответствующие ему одноименные биты операндов равны 1, в любом другом случае бит результата равен 0. Операция вы- полняется со всеми битами байта или слова операн- дов. OR: выполняет операцию логического включающе- го ИЛИ применительно-к двум операндам. Результат помещается на место операнда-приемника. Операнд- источник остается без изменений. Команда выполня- ется как с 8-, так и с 16-битовыми данными. Бит ре- зультата становится равным 1, если один или оба соответствующих бита в операндах равны 1, в про- тивном случае бит результата равен 0. Операция при- меняется ко всем битам байта или слова операндов. NOT: выполняет ©жрацию логического НЕ. С ее помощью инвертируется каждый бит в байте или сло- ве операнда. Операнд может быть 8- и 16-битовым. Бит результата равен 1, если соответствующий бит в исходном операнде равен 0, и наоборот. Операция вы- полняется со всеми битами байта или слова операнда., TEST: выполняя операцию логического И с двумя операндами, изменяет только состояние флагов. Со- держимое обоих операндов остается без изменений. Операнды могут составлять как 8, так и 16 бит. Коман- да дает возможность установить значение определен* ного бита операнда без его изменения. XOR: осуществляет логическую операцию исклю- чающего ИЛИ применительно к двум операндам. Ре- зультат помещается на место операнда-приемника. Второй операнд остается без изменений. Оба они мо- гут быть как 8-, так и 16-битовыми. Бит результата равен 1, если соответствующие биты операндов не совпадают. Если же оба одноименных бита операндов
равны 0 или 1, ссответствующий бит результата ра- вен 0. Операция выполняется со всеми битами байта или слова операндов. (Преобразования разрядов операндов Обычно биты, которые должны быть изменены, оп- ределяются содержанием первого операнда-приемни- ка. Биты, с помощью которых производится модифи- кация, определяются содержимым второго операнда (операнда-источника). Таким образом,.последний рас- сматривается. как маска битов,, защищающая одни биты и делающая другие доступными для модифика- ции с помощью логических операций. Команда AND избирательно обнуляет биты пер- вого операнда,, если соответствующие, им биты второ- го операнда содержат 0.. Другими словами,. 1 в бите маски подтверждает соответствующий бит первого операнда, в то время как 0 в бите маски обнуляет со- ответствующую позицию первого операнда независи- мо от ее предыдущего состояния* В- качестве примера рассмотрим команду AND AL, 0111 HUB1 Команда обнуляет старший бит (бит знака) в бай- те регистра AL. Остальные семь битов регистра AL остаются без изменении. Состояние флата нуля ZF по- зволяет установить, что в новом содержимом регистра AL (операнде-приемнике) имеется хотя бы один еди- ничный бит или что все биты этого регистра обнуле- ны. Если флаг нуля ZF находится в единичном со- стоянии, это означает, что все биты регистра AL по- сле выполнения логической операции обнулены. Команда OR (включающее ИЛИ) избирательно заносит 1 в биты первого операнда, если соответ- ствующие биты второго операнда содержат 1. Если биты второго операнда содержат 0, то содержимое со- ответствующих битов первого операнда остается без изменений. Например, команда OR DX.ooo&iiiiiiiniiiB .заносит 1 в двенадцать последних битов регистра DX. 275
Четыре -старших бита остаются прежними. В этом случае состояние флага нуля также можно использо- вать для проверки обнуления всех битов регистра DX. Команда XOR избирательно инвертирует те биты первого операнда, которым соответствуют биты вто- рого операнда, содержащие 1. Если же какие-либо биты второго операнда содержат 0, соответствующие им биты первого операнда остаются без изменений. Например, команда XOR BYTE PTR SWITCH,01 изменяет содержание последнего бита в байте памя- ти с адресом SWITCH с 1 на 0 или с 0 на 1 и не за- трагивает остальные семь битов. Если в этой ячейке хранить 0 или 1, то простым повторением команды XOR она превращается в переключатель, который пе- риодически меняет свое состояние между 0 и 1. Логические команды используются также для ис- ключения или модификации определенных групп би- тов в операнде. Поэтому они очень эффективны при переводе алфавитно-цифровых знаков из одной фор- мы представления в другую. В следующем подразде- ле приведен ряд примеров, иллюстрирующих приме- нение логических команд при обработке текстов. Буквенные преобразования В редакторах текстов, а также при обработке слов может возникать необходимость, в -преобразование букв текста (в предложении или параграфе) со строч- ных в прописные или наоборот без переввода их с компьютерного пульта. Существует несколько воз- можных путей выполнения такого задания. На рис. 6.2 показан один из способов применения логических; команд для преобразования символов. В процедуре , использовано знание структуры представления в коде ASCII строчных и прописных букв (рис. 6.3). В пя- том бите кода всех строчных букв записана 1. В процессе отладки и тестирования новой програм- мы на языке ассемблера желательно иметь возмож- ; ность каким-либо образом проверять или изменять содержимое регистров центрального процессора и. 276
277 0000 UPPER-CASE PROC NEAR процедура преобразования строчной буквы в регистре AL в прописную 0000 ЗС61 CMP AL,61H ;Проверка, является ли буква строчной 0002 7206 JB UPPER-DONE 0004 ЗС7А CMP AL,7AH 0006 7702 JA UPPER-DONE 0008 245F AND AL,01011111B ;Обращение пятой позиции в нуль 000А UPPER-DONE: 000А СЗ RET 000В UPPER-CASE ENDP 000В LOWER-CASE PROC NEAR ;Процедура преобразования прописной буквы ;в регистре AL в строчную 000В ЗС41 CMP AL,41H ;Проверка, является ли буква прописной 000D 7206 JB LOMER-DONE 000F ЗС5А CMP AL,5AH ООН 7702 JA LOMER_DONE 0013 0С20 OR AL,00100000B ;Обращение пятой позиции в единицу 0015 LOWER-DONE: 0015 СЗ RET 0016 LOWER-CASE ENDP Рис. 6.2. Процедура преобразования букв (строчная— прописная и прописная — строчная).
Прописные Представят© в ASCH’ Строчные Пприставление в ASCII буквы Шестнадцатеричное Двоичное буквы Дк.ииадцатеричное ! Двоичное А 41 0100 0001 а 61 ОНО 0001 ' В 42 0100 0010 ь 62 ОНО 0010 С 43 0100 ООН с 63 ОНО ООП D 44 0100 0100 d 64 ОНО 0100 Е 15 0100 0101 е 65 ОНО 0101 F> 46' 0100 оно f 66 оно оно С 47 0100 от g 67 ОНО 0111 И 4» .0100 1000 h €3 ОНО 1000 -I > 49 0100 1001 i 67 ОНО 1001 J , 4А 0100 1010 j 6А ОНО 1010 4В 0100 1011 k 6B ОНО 1011 4С 0100 1100 1 6С ОНО 1100 4D 0100 1101 m 60 ОНО 1101 4Я 0100 1110 n 6Е ОНО 1110 4F 0100 пн о 6F ОНО 1111 р 50 0101 оооо p 70 0111 0000 Q & 0101 000! q 71 0111 0001 R ' 5Z 0Ю1 0010 r 72 0111 0010 S 53 0101 ООН s 73 0111 ООН т 54 0101 0100 t 74 0111 0100 ! U 53 0101 0101 u 75 0111 0101 V 56 0101 оно V 76 0111 оно W 57 0101 0111 V 77 0111 0111 . X 58 0101 1000 X 78 0111 1000 1 Y 59 0101 1001 У 79 ОП1 1001 Z 5А 0101 ЗОЮ z 7А 0111 1010 Рис. 6.3. Представление в коде ASCII прописных, и строчных ..... букв. i определенных ячеек, памяти. Отладчик должен преоб- разовывать каждую шестнадцатеричную цифру из? представления, в котором она хранится в памяти, в: код, необходимый для ее вывода. Должна также су- ществовать возможность включения шестнадцатерич-^ ных цифр в водимый ряд символов в коде ASCII ш преобразования этих цифр в соответствующее двоич* ное представление для хранения в компьютерной п:.* мяти. Процедура, приведенная на рис. 6.4, показывает примеры перевода шестнадцатеричных цифр из вну- треннего представления в соответствующий формат' ASCII, после чего они могут быть выведены на дис- плей или печать. Логические команды здесь применя- лись как для самого перевода, так и для контроля правильности выполнения всего процесса с помощью соответствующих флагов. 27$
279 0000 CONASC1 PROC MOV NEAR AH,AL ;Перевод содержимого AL в два байта ACCII, хранимые в АХ Предыдущее содержимое AL теряется 0000 8АЕ0 0002 Е81600 CALL CONVERT Процедура перевода 0005 86С4 XCHG AL,AH 0007 В104 MOV CL,4 0009 D2E8 SHR AL,CL ;Выбираются старшие четыре бита 000В E80D00 CALL CONVERT 000F СЗ RET 000F CONASC1 ENDP 000F 000F CONASC2 PROC NEAft Перевод содержимого АХ в четыре байта ASCII, хранимые в АХ и DX. Предыдущее содержимое АХ и ;DX теряется 8BD0 MOV DX,AX ООН E8ECFF CALL CONASC1 0014 92 XCHG AX,DX 0015 86Е0 XCHG AH, AL 0017 E8E6FF CALL CONASCI 001А СЗ RET 001В CONASC2 ENDP 001В CONVERT PROC NEAR Процедура перевода 001В 240F AND AL,0FH ;Анализиру1бтся младшие четыре бита 001D ЗС09 CMP AL, 09 001F 7602 JBE NEXT 0021 0407 ADD AL, 07 Согласование для чисел, больших 9 0023 0430 NEXT: ADD AL, ЗОН Перевод в код ASCII Рис, 6.4, Процедура преобразования шестнадцатеричных чисел, в код ASCII.
0025 80Е100 AND CL,00 Остановить в 1 флаг ZF для указания завершения ;операции 0028 СЗ RET 0029 CONVERT ENDP 0029 CONBINO PROC NEAR ;Перевод кода ASCII из AL в одну шестнадцатеричную ;цифру 0029 ЗСЗО » CMP AL, ЗОН 002В 7216 JB ERROR ;Выбор диапазона 002D ЗС46 CMP AL,46H 0Q2F 7712 JA ERROR 0031 3C39 CMP AL,39H ;Проверка для шестнадцатеричных чисел от А до F 0033 7706 JA ATOF 0035 240F AND AL,OFH ;Перевод в двоичное представление ,, , . ,, v 0037 80Е100 AND CL,00 ;Ошибок нет - 003А СЗ RET 003В 240F ATOF: AND AL, OFH 003D 0409 ADD AL,09H 003F 80Е100 AND CL,00 ;Ошибок нет 0042 СЗ RET 0043 80C9FF ERROR: OR CL,0FFH ;Сброс в 0 флага ZF для индикации ошибки преобразование 0046 СЗ RET 0Q47 CONBINO ENDP 0047 CONBIN1 PROC NEAR •Деревод двух кодов ASCII из АХ в две шестнадцате- ричные цифры в AL 0047 8АЕС MOV CH, AH 0049 E8DDFF CALL CONBINO
004 С 7401 JE NEXTD продолжается преобразование — следующая цифра 004Е СЗ RET 004F 86С5 NEXTD; XCHG AL,CH 0051 E8D5FF CALL CONBINO 0054 7401 JE OK 0056 СЗ RET 0057 В104 ОК: MOV CL,4 0059 D2E5 SHL CH,CL ;Шестнадцатеричная цифра перемещается в старшие ;разряды 005В 0АС5 OR AL, CH 005D 80Е100 AND CL,00 ;Ошибок нет 0060 СЗ RET 0061 CONBIN1 ENDP г*э 0061 CONBIN2 PROC NEAR ;Перевод четырех кодов ASCII из пары регистров DX, S’ ;АХ в четыре шестнадцатеричные цифры, записываемые ;в АХ 0061 E8E3FF CALL CONBIN1 0064 7401 JE NEXT2 0066. СЗ RET 0067 92 NEXT2: XCHG AX,DX 0068 E8DCFF CALL CON BINI 006В 7401 JE OK2 006D СЗ RET 006Е 86Е2 ОК2: XCHG AH,DL 7 . • • . .. 0070 80Е100 AND CL,00 ;Ошибок нет 0073 СЗ RET 0074 CONBIN2 ENDP Рис* 6*4 (окончание!
Представление в ASCII Представление в ASCII Шестнадцате- ричные цифрь! Шестнадцате- ричное Двоичное Шестнадцате- ричные цифры Шестнадцате- ричное Двоичное О 30 ООН 0000 8 38 ООП 1000 1 31 ООП 0001 9 39 ООП 1001 2 32 ООН 0010 Л 41 0100 000! 3 33 ООП ООП В 42 0100 0010 А 34 ООН 0100 С 43 0100 ООП 5 35 ООП 0101 в 44 0100 0100 6 36 ООП оно в 45 0100 0101 7 37 ООН 0111 F 46 0100 оно Рис. 6.5. Шестнадцатеричные числа и их представление в коде ASCII. , Процедура CONASC1 переводит содержимое ре- гистра AL в две буквы кода ASCII, которые пересы- лаются в регистр АХ. Процедура CONASC2 переводит содержимое регистра АХ в четыребуквы в коде ASCII и запоминает их в регистрах АХ и DX. Процедура CONBINO предполагает, что регистр AL содержит код ASCII шестнадцатеричного числа и выполняет перевод кода в соответствующее число. В процедуре CONBIN1 регистр АХ содержит коды ASCII двух шестнадцатеричных чисел. Она восстанавливает эти числа и запоминает их в регистре AL. Точно так же процедура CONBIN2 переводит в четыре шестнадца- теричных числа их коды ASCII из регистров АХ и DX и помещает их в регистр АХ. В процедурах CONBINO, CONBIN1 и CONBIN2 логические команды использованы для выполнения необходимых преобразований и для создания соответ- ствующих кодов, контролирующих появление воз- можных ошибок. Если при переводе возникает какая- нибудь ошибка, флаг нуля ZF обнуляется. На рис. 6.5 приведено представление в коде ASCII шестнадцате- ричных цифр. 282
Засекречивание и восстановление данных Сегодняшний уровень развития микропроцессоров и микрокомпьютерных систем позволяет обеспечить легкий доступ к ним, а также к удаленному оборудо- ванию в режиме разделения времени. Это приводит к уязвимости хранимых данных, особенно если учесть, что посредством коммуникационных сетей, в основном телефонных, объединены уже миллионы компьютер- ных систем. Компьютеры используются в основном для обра- ботки и преобразования наиболее важной информа- ции. Поэтому в первую очередь необходимо обеспечить меры безопасности, позволяющие оградить файлы данных и другую компьютерную информацию от не- санкционированного к ним доступа. Одним из спосо- бов защиты файлов программ и данных в компьютер- ных системах является засекречивание (кодирование). Кодирование основано на некоторых преобразова- ниях данных, в результате которых последние стано- вятся непонятными для всех, кроме тех пользовате- лей, для которых они предназначены. После таких преобразований данные воспринимаются компьютер- ной системой, но записаны они уже не в обычном ^(нормальном) представлении. Поэтому они не могут быть выбраны, просмотрены и скопированы в случае несанкционированного доступа. При использовании закодированной программы или файла данных их со- держимое сначала должно быть перезаписано с по- мощью декодирующей (восстанавливающей) процеду- ры, после чего информация может быть возвращена на исходное место в естественном, незащищенном пред- ставлении. Процедура, представленная на рис. 6.6, реализует простой алгоритм кодирования текстового файла, хра- нимого в персональном компьютере фирмы IBM. Представление символов файла в коде ASCII переме- шано так, что текст больше не может быть отображен в нормальном виде обычными средствами операцион- ной системы. На рис. 6.7 приведено шестнадцатерич- ное представление содержания текстового файла до и после кодирования. Процедура декодирования защи- щенного текста изображена на рис. 6.8. При кодиро- вании и декодировании используется очень простая 283
0000 MAIN SEGMENT PARA PUBLIC ASSUME CS :MAIN,DS :MAIN,ES :MAIN,SS : STACK 0000 ENCRYPT PROC NEAR процедура кодирования (засекречивания) 0000 9С ;данных PUSHF 0001 IE * PUSH DS 0002 2ВС0 SUB AX, AX 0004 50 PUSH AX 1 - 0005 IE PUSH DS Сохранение состояния системы для последующего возврата 0006 06 PUSH ES ;в операционную систему PS-DOS‘ 0007 8CC8 MOV AX,CS ;Командный сегмент программы 0009 8ED8 MOV DS,AX ;Сегмент данных перекрывается с командным сегментом 000В 8EC0 MOV ES,AX Дополнительный сегмент перекрывается ;тоже 000D 8D167500 LEA DX,OLD_FCB ;Файл Control Block текстового файла, предназначенный для кодирование ООН B40F MOV AH,0FH ;Команда на открытие файла 0013 CD21 INT 21H ’/Требование DOS на обслуживание 0015 8D16C100 LEA DX,DATA,AREA ;Буфер памяти для входного текста 0019 B41A MOV AH,1AH ;Команда, устанавливающая адрес передающего диска П01В CD21 INT 21H •/Требование DOS на обслуживание
001D 8D367500 LEA SI,OLD_FCB 0021 2ВС0 SUP AX, AX 0023 894421 MOV WORD PTR[SI + 33], AX 0026 894423 MOV WORD PTR[SI + 55], AX Подготовка к чтению исходной ^информации 0029 8В4410 MOV AX,[SI 4- 16] Определение действительных размеров ;файла 002С 89440Е MOV [SI 4- 14],AX ;Количестдо символов, подлежащих ;прочтению 002F 0032 A3BF00 MOV FILE-SIZE,AX Сохранение для дальнейшего ^использования, , 8BD6 MOV DX,SI 0034 В421 MOV AH,21H ;Команда на чтение исходного текста ю 00 сл 0036 CD21 ;iN,f 21H требование DOS, на обслуживание 0038 8D169A00 LEA DX,NEW_FCB ;Файл Control Block закодированного ;файла ООЗС В416 MOV AH,16H •Команда на образование нового файла 003Е CD21 ? INT 21H Образование закодированного файла 0040 8D16C100 LEA DX, DATA-AREA 0044 8BF2 MOV SI,DX 0046 8BFA MOV DI,DX 0048 8B0EBF00 • MOV CX,FILE-SIZE ;Число символов, подлежащих кодированию Рио. 6,6, Процедура кодирования (засекречивания) данных.
004С 004С ENCRYPTLOOP: ;Взять символ текста AC LODSB 004D 3438 . XOR AL,ООП 1000В •/Кодирующая маска, ;инвертируются биты позиций 3, 4 и 5 004F 0050 AA E2FA STOSB LOOP ENCRYPT-LOOP ;3апись закодированной величины. 0052 B41A MOV AH,1AH ;Команда на установку адреса передающего диска 0054 CD21 INT 21H требование DOS на обслуживание 0056 005А 005С 8D369A00 2BC0 894421 LEA SI.NEW-FCB SUB AX,AX MOV WORD PTR[SI + 33],AX 005F 894423 MOV WORD PTR[SI + 35],AX •/Подготовка к записи закодированных ;данных 0062 A1BF00 MOV AX,FILE-SIZE 0065 0068 89440E 8BDS MOV > MOV [SI + 14], AX DX,SI ;Число байтов закодированных данных 006А B415 MOV AH,15H ;Команда на запись закодированных ;данных 006С CD21 INT 21H требование DOS на обслуживание 006Е B410 MOV AH,10H ;Команда на закрытие файла и ;изменение каталога диска 0070 A CD21 INT 21H •/Требование DOC на обслуживание
8 0072 0073 07 IF POP POP ES DS ;Запись (в стек) предыдущих ES и DS 0071 0075 0075 CF IRET ENCRYPT ENDP WORK-AREA PROC NEAR {Возврат в операционную систему ;PS-DOS 0075 0076 0081 00 OLD-FCB DB DB DB 0 'ORIGINALDAT' 25dup(0) ;Выход диска из строя ;Исходный файл данных 009А 009В 00А6 00 NEW-FCB DB DB DB 0 'ENCRYPT FILE' 25dup(0) Закодированный файл записан на {неисправном диске 00BF 00С1 80С0 80С0 ?? FILE-SIZE DW DATA-AREA DB WORK-AREA ENDP main Ends ? 32767dup(0) {Размеры закодированного файла 0000 0000 0100 STACK SEGMENT DB STACK ENDS STACK PARA 32 DUP('STACK') {Область стека END Рис. 6.6 (окончачие)
Данные до кодирования Представление кодом ASCII Символы текста 57 68 65 6Е 20 61 20 6Е 65 77 20 61 73 73 65 6D When a new assem 62 6С 79 20 6С 61 6Е 67 75 61 67 65 20 70 72 6F Ыу language pro 67 72 61 6D 20 69 73 20 74 65 73 74 65 64 2С 20 gram is tested. 69 74 20 69 73 20 64 65 73 69 72 61 62 6С 65 0D it is desirable ОА 74 6F 20 68 61 76 65 20 61 20 64 65 62 75 67 to have a debug 67 69 6Е 67 20 66 61 63 39 6С 69 74 79 20 74 6$ ging facility th 61 74 20 70 72 6F 76 69 64 65 73 20 73 6F 6D 65 at provides some 20 6D 65 61 6Е 73 20 74 6F 20 65 78 61 6D 69 6Е ' Данные после кодирования jneans to examin 6F 50 5D 56 18 59 18 56 5D 4F 18 59 4В 4В 5D 55 oP)V Y V]0 YKKJU 5А 54 41 18 54 59 56 5F 4D 59 5F 5D 18 48 4А 57 2TA TYV_MYJ HJW 5F 4А 59 55 18 51 4В 18 4С 5D 4В 4С 5D 5С 14 18 _JYU QK t]KL]\ 51 4С 18 51 4В 18 5С 5D 4В 51 4А 59 5А 54 5D 35 QL QK \]KQJYZT]5 32 4С 57 18 50 59 4Е 5D 18 59 18 5С 5D 5А 4D 5F 2LW PYN] Y \)ZH_ 5F 51 56 5F 18 5Е 59 5В 51 54 51 4С 41 18 4С 50 _QV_ *Y[QTQLA lp 59 4С 18 48 4А 57 4Е 5150 50 4В 18 4В 57 55 5D . YL HJWNQ\)K KW] 18 55 5D 59 56 4В 18 4С 57 18 5D 40 59 55 51 56 U]YVK LW JSYUQV Рис. 6.7. Пример текста до и после кодирования. последовательность команд “исключающие ИЛИ”, приводящая к перемешиванию стандартного представ- ления знаков текста в коде ASCII. Для простоты в качестве примера взят тексто- вый файл, записанный в стандартном коде ASCII 288
с 0000 MAIN . SEGMENT PARA PUBLIC Л. Дао 0000 DECRYPT . ASSUME ' PROC CS:MAIN,DS : MAIN,ES :MAIN,SS : STACK NEAR {Процедура декодирования ьо со 0000 9С 0001 1Е 0002 2ВС0 0004 50 0005 1Е 0006 06 PUSHF PUSH SUB PUSH PUSH PUSH , DS AX, AX AX‘ \ DS . Сохранение состояния системы для ES последующего возврата в 0007 ЗСС8 MOV {операционную систему PS-DOS AX,CS {Командный сегмент программы 1 ! 0009 8ED8, 000В 8ЕС0 000D 8D167500 ООП B40F MOV MOV t LEA MOV DSjAX ;Сегмент данных перекрывается ;с командным сегментом ES,AX {Дополнительный сегмент {перекрывается тоже DX,OLD_FCB ;файл Control Block текстового файла, ; цфедназначенный для декодирования AH,0FH {Команда на открытие файла Рис. 6.8. Процедура декодирования закодированного файла.
0013 CD21 INT 21H Требование DOS на обслуживание 0015 8D16C100 LEA DX, DATA.AREA ;Буфер памяти для входного текста 0019 В41А MOV AH,1AH ;Команда на установку адреса передающего диска 001В CD21 INT 21H Требование DOS на обслуживание 001D 8D367500 LEA SI,OLD_FCB - 004D 3438 XOR AL, 00111000В Декодирующая маска (для правильного декодирования последовательности ;битов должна быть идентична кодирующей маске) ;Инвертируются биты в 3, 4 и 5-й ;позициях 004F АА STOSB ;3апись декодированной величины 0050 E2FA LOOP DECRYPT-LOOP 0052 В41А MOV AH,1AH команда на установку адреса диска ;передачи данных 0054 CD21 INT 21H Требование DOS на обслуживание 0056 8D369A00 LEA si,new_fcb 005А 2ВС0 SUB AX, AX 005С 894421 MOV WORD PTR[SI + 33],AX 1
10* 005F 894423 0062 A1BF00 0065 89440E 0068 8BD6 006A B415 006C CD21 006E B410 0070 CD21 0072 07 0073 IF 0021 2BC0 0Q23 894421 0026 894423 0029 8B4410 MOV WORD PTR[SI + 35],AX Подготовка к записи декодированных ;данных MOV AX,FILE-SIZE MOV [SI + 14],AX ;Число байтов декодированных данных MOV DX,SI MOV AH,15H ;Команда на запись декодированных данных INT 21H •/Требование DOS на обслуживание MOV AH,10H ;Команда на закрытие файла и •«изменение каталога диска INT 21H •«Требование DOS на обслуживание POP ES ;3апись (в стек) предыдущего содержимого ES и DS POP DS SUB AX, AX MOV WORD PTR[SI + 33],AX MOV WORD PTR[SI + 35],AX Подготовка к чтению закодированной •«информации MOV AX,[SI+ 16] Определение действительных размеров файла Рис. 6.8 (продолжение),
292 002C 89440E ' MOV 002F A3BF00 MOV 0032 8BD6 MOV 0034 B421 MOV 0036 CD21 v INT' 0038 8D169A00 / LEA 003C B416 MOV 003E CD21 INT ' ' ' 0040 8D16C100 LEA 0044 8BF2 MOV 0046 8BFA MOV 0048 8BOEBFOO MOV 004C DECRYPT-LOOP: 004C AC Ъ". r \ LODSB 0074 CF IRET [SI +14], AX количество символов, подлежащих ;прочтению FILE-SIZE,AX Сохранение для дальнейшего использования DXSI AH,21H ;Команда на чтение закодированных ;данных 21H Требование DOS на обслуживание . DX,NEW_FCB ;Файл Control Blok декодированного ;файла AH,16H 21N Dtf,DATA_AREA SI,DX DI,DX CX,FILE-SIZE ;Команда на создание нового файла Образование декодированного файла ;Число символов, подлежащих ^кодированию ;Выбрать символ текста ;Возврат в операционную ;систему PS-DOS пиг-^тй «Мм
0075 DECRYPT ENDP 0075 WORK-AREA PROC NEAR 0075 00 OLD-FCB DB 0 ;Выход диска из строя 0076 DB 'ENKRYPT FIL' ;Имя закодированного файла 0081 DB 25 dup(O) 009А 00 NEW-FCB DB 0 Декодированный файл записан на ;неисправном диске 009В 00 DB 'DECRYPT FIL' 00А6 DB 25 dup(O) 8 <w> 00BF ?? FILE-SIZE DW ? :P азмеры декодированного файла 00С1 DATA-AREA DB 32767 dup(O) 80С0 WORK-AREA ENDP 80С0 MAIN ENDS 0000 STACK SEGMANT STACK PARA :0бласть стека 0000 DB 32 DUP('STACK') 0100 STACK ENDS END Рис. 6.8 (окончание).
персонального компьютера фирмы IBM, который ра- ботает под управлением операционной системы PC-DOS. Применение дисков в качестве устройств ввода-вывода осуществляется путем программных пре- рываний, генерируемых дисковой операционной систе- мой PC-DOS. В качестве маскирующего шаблона ис- пользована последовательность 00111000, которая ин- вертирует биты в 3, 4 и 5-й позициях каждой буквы файла.
VII ПЕРЕСЫЛКА ДАННЫХ В данной главе рассматривается наиболее часто используемая группа команд МП 8088 —команды пересылки данных из ре- гистров в регистры, из регистров в память, из памяти в регист- ры, из памяти в память, в том числе в стек и из стека. Команды пересылки данных LDS (загрузка указателя с использованием ре- гистра DS): двойное слово операнда передается из памяти в 16-битовый регистр общего назначения и в регистр DS. LEA (загрузка исполнительного адреса): служит для передачи в операнд-приемник (это может быть и 16-битовый регистр общего назначения) перемещае- мого адреса операнда-источника. LES (загрузка указателя с использованием регист- ра ES): двойное слово операнда передается из памя- ти в 16-битовый регистр общего назначения и в ре- гистр ES. LAHF (загрузка регистра АН содержимым регист- ра флагов): содержимое регистра АН замещается восьмью младшими битами регистра флагов процес- сора. Эти восемь битов включают флаги знака, нуля, вспомогательного переноса, паритета и переноса. LODS (загрузить строку): содержимое аккумуля- тора (регистра AL в байтовых операциях или регистра АХ в операциях со словами) замещается содержи- мым ячейки памяти, адресуемой регистром SI. Содер- жимое регистра SI при этом возрастает или уменьша- ется в зависимости от состояния (соответственно ну- левого или единичного) флага направлений. Прирост 295
или убывание равны единице для байтовых кбманд и двум — для команд, оперирующих словами. MOV (переслать): информация может быть пере- дана из регистра (включая сегментные регистры) в память и наоборот. MOVS (переслать строку): применяется прежде всего для пересылки в память блоков данных. Для указания перемещаемых адресов операндов источни- ка и приемника используются соответственно регист- ры SI и DL Содержимое этих регистров возрастает или уменьшается в зависимости от состояния (соответ- ственно нулевого или единичного) флага направле- ний. Прирост или убывание равны единице для байто- вых команд и двум для команд, оперирующих сло- вами. PUSH (записать в стек): содержимое указателя стека уменьшается на 2, указывая на новую вершину отека. После этого команда загружает на вершину стека содержимое 16-битовых регистров или ячеек па- мяти. PUSHF (записать в стек содержимое регистра флагов): указатель стека уменьшается на 2, указывая на новую вершину стека. Затем в стек загружается содержимое регистра флагов процессора. POP (считать из стека): в регистр или ячейку па- мяти переписывается слово из вершины стека. Для определения новой вершины стека указатель стека увеличивается на 2. POPF (считать из стека содержимое регистра фла- гов) : использует слово на вершине стека для опреде- ления Содержимого регистра флагов процессора. Ука- затель стека увеличивается на 2, указывая новую вершину стека. SAHF (переписать содержимое регистра АН в ре- гистр флагов); содержимое регистра АН переписыва- ется в младшие восемь разрядов регистра флагов про- цессора, представляющие собой флаги знака, нуля, вспомогательного переноса, паритета и переноса. . STOS (запомнить строку): содержимое аккуму- лятора (AL — при байтовых операциях, АХ — при операциях со словами) переписывается в ячейки памяти, адресуемые регистром DI. Содержимое ре- гистра увеличивается или уменьшается в зависимости от состояния (соответственно нулевого или единично- го
го)' флага'направлений. Прирост или убывание равны единице для байтовых команд и двум для команд, оперирующих словами. XCHG (заменить): содержимое регистра заменяет- ся содержимым ячейки памяти. Операции могут быть 8- и 16-битовыми. XLAT (перевести): байт регистра AL заменяется' байтом из 256-байтовой таблицы. Двоичное содержи- мое регистра AL используется как табличный индекс, т. е. как перемещаемый внутри таблицы адрес, содер- жимое которого переписывается в регистр AL. Перемещение данных в перекрывающихся последовательностях — строках Команда MOVS (переслать строку) является един- ственной в наборе инструкций МП 8088, позволяющей перемещать информацию из одного места памяти ком- пьютера в другое без использования регистров цен- трального процессора. В том случае, если перемеща- ется блок информации, состоящий из байтов, команда записывается в виде MOVSB (переслать последова- тельность байтов). Если же перемещаемый блок со- стоит из слов, то используется команда MOVSW Младший адрес Старший адрес Область наложения Начальный адрес строки - .источника Начальный адрес строки1- приемника Начальный адрес строки- ' приемника Начальный адрес строки- источника Конец строк ЧЬ) Пересылка начинается с начального элемента строки (а) Пересылка начинается с последнего элемент строки Рис. 7.1. Пример перекрывающихся строк в памяти. 297
0000 =012 С MOVE PROC NEAR Процедура пересылки данных между перекрывающимися строками количество пересылаемых байтов данных STRING-SIZE EQU 300 ГЭ О 0000 В92С01 0003 BE7F00 0006 BF9800 0009 FC 000А 3BF7 000С 7309 000Е FD MOV MOV MOV CLD CMP JAE STD CX, STRING, SIZE SI,OFFSET STRING-1 DI,OFFSET STRING-2 SI, DI FORWARD количество пересылаемых байтов данных ;Начальный перемещаемый адрес ;строки источника ;Начальный перемещаемый адрес ;строкиприемника Подготовка к пересылке "вперед" Проверка направления пересылки ("вперед" ;или "назад") Подготовка к пересылке "назад" со O00F 81С62В01 0013 81С72В01 0017 0017 F3A4 0019 FC 001А СЗ 001В 001В 001Й =007F =0098 0403 ADD ADD FORWARD: REP CLD RET MOVE ENDP DATA PROC STRING DB STRING-1 EQU STRING-2 EQU DATA ENDP SI.STRING-SIZE-l DI.STRING-SIZE-1 MOVS В NEAR 1000 DUP(?) STRING + 100 STRING + 125 Пересылка начинается с йоследнего байта ;данных Пересылка данных ;3апись флага направления ;1000 байтов перекрывающихся строк Рис. 7.2. Процедура пересылки данных между двумя перекрывающимися строками.
(переслать строку слов). Изменяя состояние флага направлений, можно управлять направлением пере- мещения. При нулевом состоянии флага содержимое регистров SI и DI — индексы адресации — автомати- чески возрастает и блок данных размещается в па- мяти от младших адресов к старшим. При единичном состоянии флага направлений содержимое регистров SI и DI автоматически уменьшается и данные разме- щаются от старших адресов памяти к младшим. Команда MOVS весьма эффективна и при наложе- нии исходной и приемной последовательностей. В этих случаях направление перемещения блока данных в памяти должно выбираться таким, чтобы исходное содержание перекрывающейся части последовательно- сти источника не забивалось при выполнении опера- ции перемещения. Если перемещаемый адрес последо- вательности-источника старше, чем у последователь- ности-приемника, перемещение должно начинаться с первого байта источника. Если же перемещаемый адрес последовательности- источника младше, чем у последовательности-прием- ника, перемещение начинается с последнего байта данных источника (перемещение назад). Наглядно эти ситуации представлены на рис. 7.1. Листинг процеду- ры, использующей команду MOVS для перемещения некоторого числа байтов данных между двумя пере- крывающимися последовательностями, приведен на рис. 7.2. Регистр СХ использован для хранения числа перемещаемых байтов. Регистры SI и DI хранят пе- ремещаемые адреса соответственно последовательно- сти-источника и последовательности-приемника. Взаимные преобразования кодов ASCII и EBCDIC Американский стандартный код ASCII предназна- чен для обмена информацией. Расширенный двоично- десятичный код EBCDIC обмена используется только в больших компьютерах, изготовленных на предприя- тиях компании IBM. При обмене данными между микрокомпьютерами и большими ЭВМ фирмы IBM возникает необходимость перевода кода ASCII в код 299
0000 CONVERT 1 PROC NEAR Перевод строки-источника в коды ;EBCDIC 0000 8D36AE00 LEA SI,BUFFER Перемещаемый адрес строки-источника 0004 8D1E2C00 LEA BX,EBCDIC_TABLE ;Таблица перевода 0008 8В0ЕАС00 MOV CXtNO-,BYTES количество байтов, подлежащих ОООС FC CLD переводу 000D АС LOOP): LODSB - 000Е D7 XLAT ;Поиск в таблице кодов EBCDIC 000F 8844FF MOV [SI-1],AL ;Изменение строки-источника co <z> о 0012 E2F9 LOOP LOOP! 0014 СЗ RET 0015 CONVERT1 ENDP 0015 CONVERTS PROC NEAR Передача в другой буфер 0015 8D36AE00 LEA SI,BUFFER 0019 8D1E2C00 LEA BX, EBCDIC-TABLE 001D 8D0EAC00 MOV CX,NO-BYTES 0021 0025 8D3EB800 FC LEA CLD DI,OUT_BUFFER Перемещаемый адрес выходного буфера 0026 АС LOOP2; LODSB 0027 D7 XLAT
*Э1СЭ9И я II3SV aotfoM винвдоевйдоэсШ BdAtfahodp •£•£ -ohj dGNH viva гэоо З1аал.\!оэ; эпннэтгэяэбэи эшэаа и1Г0^ .. ;; ft)dfia, oi за йазапа_1по 8900 nosy аогон вяоёлэ из2‘нзин1и‘ноо‘,зааэаУ/ < ea daaana , avoo 01 ЛШ S31A9“ON oovo □voo HZO'HIVO *ноао ‘ HV9‘ ноэо* не vo * нзvo ‘hz vo* H9V0 ‘изvo ‘ №vo ‘ Hevo ‘ нзуо‘нбб ‘ изб ‘ нлб аа H96‘HS6‘Hfr6‘H£6‘H36‘HI6‘H68‘H88‘HZ8‘H98‘HS8‘Ht’8‘H£8‘H38‘HI8,H6Z 30 ' ’ на9*на9 ‘ноо‘ноао‘ноо‘нбао‘н8ао*н4ао‘н9ао‘н9ао‘н1’ао‘н£ао^нгао‘нбао‘н8ао‘н2ао за H9ao‘Hsao‘HKio ‘ з£ао‘нгао‘шао‘нбэо‘неэо‘шэо‘Н9эо‘Н9эо‘нюб‘н£эо‘нгэо.‘hiэо‘нэх за Hd9*H39 ‘H3Z‘H9t’‘H3S‘HVZ‘H6d0‘H8d0,HZJ0‘H9d0‘HSa0‘Ht'd0‘H£d0‘H3H0‘HIзо’нбзб за Hi9‘Hai'‘HO9‘Ha9‘Hat’‘H9s‘Has‘Hat’‘Haz‘Hos‘H39‘Has‘Haz‘Hdz‘Hvs‘Hot’ аа нзГнаГнаГнэГнгг'наЕ'нбГнзГнэз'нгЕ'наз'нэ^ноо'нгГшгно! аа * г мяо* няонао ‘ нэо ‘нео'нез'нео'нэГнзг'нэг'наг'ШЕ'нсо'нго'шо'ноо аа aiavi_9iaoaa Э300 HV3N 90ild viva Э300 dON3 гхйзлмоэ Э600 13Й £9 9300 SdOOT dOOl a 333 6300 бэфАд! ионтгохка а ЭЮЭаЗ aoVoH чэипв£‘. tfSOlS i vv 8300
EBCDIC и обратно. С этой целью преобразуемую ин- формацию обычно помещают в некоторый буфер. За- тем содержимое каждой ячейки буфера преобразуют с помощью специальной таблицы перевода. После пе- ревода данные могут сохраняться в том же буфере или передаваться в процессе перевода в другой бу- фер. Процедура CONVERT 1 (рис. 7.3) переводит дан- ные без передачи их в другую буферную память. В процедуре полагается, что регистр ВХ содержит пе- ремещаемый адрес таблицы перевода, регистр SI — перемещаемый адрес ячейки буфера, а регистр СХ — количество переводимых байтов данных. Процедура CONVERT2 (рис. 7.3) переводит и перемещает дан- ные в другой буфер. В дополнение к перечисленным регистрам, которые и в этой процедуре выполняют те же функции, здесь задействован дополнительно ре- гистр DI, содержащий перемещаемый адрес ячейки буфера, в которой будут храниться переведенные дан- ные. Поиск последовательности знаков Одной из важных возможностей микрокомпьюте- ров является способность осуществлять редактирова- ние стандартных текстовых файлов. Эти файлы обыч- но содержат буквенно-цифровую информацию, кото- рая может отображаться устройствами ввода-вывода, такими, как алфавитно-цифровые печатающие устрой- ства или видеотерминалы. Текстовыми файлами могут, быть, например, письмо, составленное с помощью про- граммы обработки текстов, финансовая сводка, со- ставленная программой обработки базы данных, или листинг исходной программы на языке ассемблера. Информация, составляющая текстовый файл, груп- пируется в виде множества записей различной длины. Обычно для обозначения того или иного окончания за- писи к ее концу присоединяют символы CR (Carriage Return — возврат каретки) и LF (Line Feed — пере- вод строки) *>. В текстовых файлах, составленных ре- дактором текстов, запись обычно соответствует полной Шестнадцатеричная запись этих знаков в коде ASCII —> соответственно OD и ОА, 302
строке видеотерминала. В файлах, созданных про- граммой обработки текстов, запись может включать все символы законченного предложения или целого параграфа. Последним символом последней записи текстового файла является обычно символ, служащий меткой конца файла. В персональном компьютере IBM, работающем с операционной системой PC-DOS, для маркировки конца текстового файла используется шестнадцатеричное число 1А. При работе с текстовой информацией часто жела- тельно иметь возможность находить и выделять в текстовом файле определенные слова или последова- тельности символов. Это дает возможность модифици- ровать определенные, интересующие пользователей места файла. После того как такая последователь- ность найдена, строка текста, содержащая ее, может быть отображена на дисплее. Если этой последова- тельности не существует, генерируется соответствую- щее сообщение об ошибке. Процедура, приведенная на рис. 7.4, предполагает, что текстовый файл был загружен в память компьюте- ра. Первый символ в файле имеет перемещаемый ад- рес, определяемый содержимым регистра ВХ. В по- исках определенной последовательности символов процедура предусматривает последовательный про- смотр всего файла. Символы, индицирующие конец записи или конец текстового файла, игнорируются. ' Процедура подразумевает, что в регистре СХ за- писано число символов искомой последовательности. Регистр SI содержит перемещаемый адрес первого ее символа. Состояние флага переноса используется для индикации существования этой последовательности в текстовом файле. Если она найдена, флаг переноса обнуляется, а в регистр DI засылается перемещаемый адрес первого символа локализованной в файле по- следовательности. Преобразования дважды связанных списков В задачах, решаемых компьютерными системами, часто встречаются отдельные данные или целые бло- ки информации, перемещать которые очень затрудни- тельно, поскольку для этого требуются большие за-. 303
‘ 0000 CHAR PROC " 'gL 1 - v NEAR Процедура представляет последовательность co ©- «й> 0000 0004 0008 ооос < 000F 0010 00В7 00BD 00BF 8D1E1000 8B0EBD00 8D35B700 Е8В000 СЗ ;символов, которую необходимо найти LEA ВХ, START-DATA Перемещаемый адрес первого символа текстового файла MOV СХ,NO-CHARACTER ;Число символов в последовательности LEA SI,.SEQUENCE Перемещаемый адрес последовательности символов CALL SEARCH RET START-DATA DB 'In word-processing and text-editing applications/ DB 0DH,0AH DB 'it is often desirable to be able to search and locate' DB 'a specified word or a sequence of characters in a text' DB 'file',0DH,OAH, 1AH . SEQUENCE DB 'locate' NO_CHARACTER DW 6 CHAR ENDP . , 00BF 00BF Q0C1 оосз 00С5 00С6 8BD1 8ВЕЕ 8BFB ДС SEARCH MATCH: NEXT: RESTART: PROC NEAR MOV DX.GX MOV BP,SI MOV ’ DI..BX ! LODSB ;Эта процедура ищет последовательность Символов Сохраняется количество символов в ;последовательности Сохраняется исходный перемещаемый ;адрес в SI Сохраняется текущий символ текстового ;файла ;Выбрать символ в текстовом файле
ООСС 803F0D СМР BYTE PTR(BX],0DH Проверка на CR ("Возврат каретки") 00С9 741В JE CONTROL-CHAR ООСВ 803 F0A СМР BYTE PTR[BX],0AH Проверка на LF ("Перевод строки") ООСЕ 7416 JE CONTROL-CHAR 00D0 803F1A СМР BYTE PTR[BX],1AH Проверка на окончание текстового файла 00D3 7414 JE END-FILE 00D5 ЗА07 СМР AL,[BX] ;Есть соответствие 00D7 9С PUSHF ;Сохранениефлага нуля 00D8 43 INC BX Подготовка к получению следующего ;символа 00D9 9D POPF Запоминание результата предыдущего * , v ' 1 сравнения 00DA Е1Е9 LOOPE NEXT Проверяются все символы последова- тельности 00DC 7502 JNE SKIP -РЛ гг 00DE F8 CLC : . r Последовательность символов определена Перемещаемый адрес первого символа в DI 00DF СЗ RET ООЕО 8BF5 SKIP: MOV SI,BP 00Е2 8ВСА MOV CX.DX 0QE4 EBDD JMP SHORT MATCH 00Е6 CONTROL.. CHAR: 00Е6 43 INC BX 00Е7 EBDD JMP SHORT RESTART 00Е9 F9 END-FILE; STC Последбвательибсти символов в файле нет ООЕА СЗ RET ООЕВ SEARCH ENDP Рис, 7.4. Процедура поиска последовательности символов.
траты машинных ресурсов и времени. Одним из воз-» можных путей решения этой проблемы является сле- дующий. Блоки информации остаются на прежних ме- стах, но вводится некий тип указателей, устанавли- вающих упорядоченные связи между блоками. Для этого очень подходит структура так называемых свя- занных списков. Понятие связанных списков иллюстрируется на рис. 7.5, А. Указатель POINTER 1 определяет начало первого блока информации. Область, предназначен- ная для определения связей в первом блоке* содержит указатель POINTER2, определяющий начало второго блока. Такой порядок сохраняется до последнего бло- ка списка. Последний блок содержит обычно указа- тель со специальным значением илй идентифицирую- щий свое собственное начало, что и выделяет его среди других указателей. Подобная структура списка имеет преимущества в тех ситуациях, когда требуется делать много вставок и вычеркиваний блоков информации. Манипуляции указателями блоков позволяют устанавливать связи между блоками без их действительного перемещения. В связанном списке ссылки позволяют идентифи- цировать позицию блока информации, следующего за текущим. Не существует указателей, идентифицирую- щих позиции блоков, стоящих перед текущим блоком. Эту проблему позволяют разрешить дважды связан- ные списки (рис. 7,5,В). Полезность связанных списков наглядно проявля- ется в таких программах, как редакторы текстов, где часто требуется вставить или исключить строку текста. Если символы текстового файла запоминаются в ком- пьютерной памяти последовательно, то каждый раз, когда в файл вводится новый символ, место для него получается сдвигом всех символов, хранящихся за этим местом вставки. Точно так же удаление из фай- ла символа затрагивает все символы, хранимые за удаленным, поскольку они все перемещаются для за- полнения* освободившегося места. Очевидно, что такая последовательная организа- ция очень неэффективна. Текстовый файл можно хра- нить в памяти в- виде дважды связанного списка, где каждая строка текста рассматривается как блок этого списка. Каждая строка текстового файла, хранимая в 3QQ
A Указатель! Указатель 2 Указатель 3 Рис. 7.5. Списки. А —связанные; В —дважды связанные.
308 < 0000 INSERT PROC NEAR ;Вставка нового блока в дважды связанный ;список Процедура' предполагает, что. перемещаемый ;адрес нового вставляемого блока содержится ;в ячейке INSERT-BLOC ;Ячейка OLD-BLOC содержит перемещаемый ;адрес блока, за которым вставляется ;новый 0000 А11700 MOV AX, INSERT-BLOCK Перемещаемый адрес нового блока 0003 8В1Е1900 MOV BX,OLD_BLOCK Перемещаемый адрес блока за которым ;следует вставка 0007 FF37 PUSH [BX]' Сохраняется исходный указатель "вперед7 0009 8907 MOV (BX],AX ;Нбвый указатель "вперед" 000В 93 XCHG AX.Bk ;ВХ указывает вставляемый блок 000С 894702 MOV [BX-p 02],AX формирование указателя "назад" нового - ;блока ... 000F 58 POP AX Перемещаемый адрес следующего блока ;списка 0010 89С7 MOV [BXl.AX формирование указателя "вперед" нового ;блока 0012 93 XCHG AX.B'X •; ;ВХ указывает следующий блок последова- тельности 0013 894702 MOV (BX+02J.AX ;Новый указатель "назад" 0016 СЗ RET 0017 ?? INSERT-BLOCK DW? 0019 ?? OLD_BLOCK DW? 001В INCERT ENDP г Рис. 7,6. Процедура вставли нового блока, в дважды связанный список,
Рис. 7.7. Пример вставки строки текста в дважды связанный список. памяти, должна иметь заголовок, содержащий неко- торую информацию о ней, например номер строки или текущее число символов. Заголовок каждой строки должен также включать указатели адресов текстовых строк, стоящих непосредственно перед и после теку- щей. При вставке или удалении изменения вносятся только в заголовки нескольких строк. Процедура, приведенная на рис. 7.6, является при- мером вставки новой строки текста в дважды связан- ный список. Здесь каждая текстовая строка имеет за- головок, построенный по следующей схеме: Байты ОД Перемещаемый адрес следующей строки (указатель "вперед") Байты 2,3 Перемещаемый адрес предшествующей строки (указатель "назад") Байты 4,5 Младшее слово номера строки Байты 6,7 Старшее слово номера, строки Байты 8,9 Текущее, количество символов в строке 309
0000 DELETE PROC NEAR ;Удаление блока из двойного связанного ;списка Процедура предполагает, что перемещае- мый адрес удаляемого блока содержится ;в ячейке DELETE-BLOCK 0000 8В1Р1300 MOV BX,DEEETE_BLOCK Перемещаемый адрес удаляемого блока 0004 8В07 MOV AX,[BX] Перемещаемый адрес следующего блока 0006 8В5702 MQV DX,[BX + 02] Перемещаемый адрес предыдущего блока. Q009 8BDA MOV BX,DX 000В 8907 MOV [BX],AX Изменение указателя "вперед" OOQD 8BD8 MOV BX,AX 000F 895702 MOV [BX^-Q2],DX Изменение указателя "назад" 0012 СЗ RET 0013 ?? DELETE-BLOCK DW ? 0015 DELETE ENDP Рис. 7J8. Процедура удаления блока из дважды связанного списка.
Рис. 7.9. Пример удаления строки файла из дважды связанного списка. 311
В этом примере следуют- соглашению, по которому наличие в указателе “вперед” шестнадцатеричного числа FFFF свидетельствует об окончании списка. Аналогично, число: FFFF в указателе “назад” озна- чает начальный блок списка. Операции, необходимые для вставки, приведены на рис. 7.7. Процедура удаления строки текстового файла, хра- нящегося в памяти в виде двойного связанного спи- ска, приведена на рис. 7.8, а необходимые для этого операции показаны на рис. 7.9. После удаления необходимо произвести несколько дополнительных операций-«заголовках; каждого эле- мента списка. Например, может возникнуть необходи- мость перенумеровать все строки файла, следующие за удаленной.
VIII ПЕРЕДАЧА УПРАВЛЕНИЯ Команды передачи управления микропрессора 8088 обычно из- меняют содержимое указателя команд IP и иногда воздей- ствуют и на регистр сегмента команд CS. О их помощью можно изменить последовательность исполнения команд в программе, поскольку регистр CS содержит базовый адрес текущего сег- мента команд — 64-килобайтового участка памяти, из которого выбирают команды, а регистр IP выдает адрес, перемещаемый относительно начала сегмента команд. После исполнения коман- ды передачи управления устройство связи с магистралью (УС), пользуясь новым содержимым регистров CS и IP, выбирает из памяти следующую команду, передает выбранную команду ис- полнительному устройству (ИУ), и таким образом происходит переформирование очереди команд, поступающих в центральный процессор 8088 с нового адреса памяти. Команды переходов Существуют две группы команд передачи управле- ния: команды безусловного и команды условного пе- рехода. Команды безусловных переходов CALL (вызов процедуры): передавая управление процедуре, сохраняет в стеке адрес возврата. Благо- даря этому при выполнении команды RET процедуры управление передается вновь команде, следующей за командой CALL. Если процедура объявлена как “NEAR”, то вызывающая ее команда CALL трансли- руется в языке ассемблера МП 8088 как внутрисег- ментная команда CALL. Межсегментная команда CALL генерируется для команды, вызывающей про- цедуру, декларируемую как “FAR”. Различные формы команды позволяют адресоваться к процедуре либо в 313
самой, команде (прямая команда CALL), либо через ячейку памяти, определяемую этой командой (косвен- ная команда CALL). С помощью внутрисегментной формы можно передать управление команде, находя- щейся по определенному адресу в пределах ±32 Кбайт. Межсегментная форма позволяет обратиться к любой ячейке мегабайтовой памяти 8088. RET (возврат из процедуры): обычно является по- следней исполняемой командой процедуры. Она воз- вращает управление команде, следующей за инструк- цией CALL, вызвавшей процедуру. Таким образом, команда RET, заканчивающая процедуру, вызывает, действие, противоположное действию команды. CALL. При исполнении команды RET адрес возврата пере- дается из стека либо в регистр IP (внутрисегментный возврат), либо одновремено в регистры IP и CS (межсегментный возврат). При необходимости коман- да RET может добавлять к содержимому регистра SP 16-битовое слово смещения. Это дает возможность скорректировать указатель стека для того, чтобы обойти другие засланные в него параметры. JMP (безусловный переход): передает управление по обусловленному адресу без всяких условий, не со- храняя никакой информации в стеке. Как и в команде CALL, адрес перехода в команде JMP устанавливает- ся либо в ней самой (прямая команда JMP), либо с помощью регистра или ячейки памяти (косвенная команда JMP). В языке ассемблера МП 8088 мнемо- ническое обозначение JMP обычно транслируется в прямую команду внутрисегментного перехода JMP. Для обозначения межсегментного перехода суще- ствует оператор FAR PTR. Для определения перехода к команде, находящейся в пределах ±128 байт, мож- но пользоваться оператором SHORT. Вслед за выпол- нением внутрисегментного перехода изменяется со- держимое регистра IP; при этом прежнее значение теряется. При межсегментном переходе изменяется со- держимое как регистра IP, так и регистра CS. Команды условных переходов К данной группе относятся команды ^‘перехода при условии...” и команды, организующие циклы; они передают управление по определенному адресу в пре- 314
делах ±128 байт в зависимости от состояний регист- ра флагов процессора и (или) от содержимого регист- ра СХ. JA/JNBE (переход если болыне/переход если не меньше или равно): выполняется при нулевом состоя- нии флагов переноса и нуля. JAE/JNB/JNC (переход если больше или равно/пе- реход если не меньше/переход если нет переноса): выполняется при нулевом состоянии флага переноса. JB/JNAE/JC (переход если меньше/переход если не больше или равно/переход при переносе): выполняет- ся при единичном состоянии флага переноса. JBE/JNA (переход если меньше или равно/переход если не больше): выполняется при единичном состоя- нии флагов переноса или нуля. JCXZ (переход при 0 в регистре СХ): выполняется если регистр СХ содержит 0. JE/JZ (переход если равно/переход по нулю): вы- полняется при единичном состоянии флага нуля. JG/JNLE (переход если больше чем/переход если не меньше чем или равно): выполняется, если состоя- ние флагов знака и переполнения одинаково и флаг нуля равен 0. JGE/JNL (переход если больше чем или равно/пе- реход если не меньше чем): переход выполняется при условии, что флаг знака SF равен флагу переполне- ния OF. JL/JNGE (переход если меньше/переход если не больше, чем или равно): выполняется при неодинако- вом состоянии флагов знака и переполнения. JLE/JNG (переход если меньше чем или равно/пе- реход если не больше чем): выполняется при неоди- наковом состоянии флагов знака и переполнения или при единичном состоянии флага нуля. JNE/JNZ (переход если не равно/переход по не нулю): выполняется при нулевом состоянии флага нуля. JNO (переход если нет переполнения): выполняет- ся при нулевом состоянии флага переполнения. JNS (переход если нет знака): выполняется при нулевом состоянии флага знака. JNP/JPO (переход если нет паритета/переход если контроль нечетный): выполняется при нулевом состоя-, нии флага паритета. 315
JO (переход при переполнении): выполняется пр» единичном состоянии флага переполнения. JP/JPE (переход при паритете/переход если кон- троль четный): выполняется при единичном состоянии флага паритета. JS (переход если знак): выполняется при единич- ном состоянии флага знака. LOOP (команда цикла): цикл продолжается, если содержимое регистра СХ отлично от нуля. LOOPE/LOOPZ (цикл если равно/цикл если нуль): цикл продолжается при единичном состоянии флага нуля и если содержимое регистра СХ не равно нулю. LOOPNE/LOOPNZ (цикл если не равно/цикл если не нуль): цикл продолжается при нулевом состоянии флага нуля и если содержимое регистра СХ не равно нулю. Цикл Циклом компьютерной программы называется группа команд, которые повторяют необходимое чис- ло раз выполнение одного и того же задания. Число повторений цикла обычно задается специальным счет- чиком циклов. При анализе структуры цикла в по- следнем можно выделить четыре функциональные ча- сти: подготовку, тело цикла, регулирующую логику и проверку окончания цикла. Все эти части взаимосвя- заны. Тело цикла Данная часть цикла состоит из машинных команд, выполняющих задание, с повторением исполнения. Тело может содержать несколько команд или даже целую программу, включающую команды ввода-выво- да для связи с периферийными устройствами; ариф- метические команды, производящие вычисления; ло- гические команды, осуществляющие тестирование или изменяющие определенные условия и состояния цен- трального процессора; команды CALL для включения в работу других процедур и другие команды, неодно- кратное повторение которых требуется. Все другие 316
функциональные части цикла предназначены для по- вторения тела цикла нужное число раз и с необходи- мыми данными. Регулирующая логика Регулирующая логика, как правило, часть. цикла, состоящая из команд, изменяющих величину счетчика, циклов и определяющих число уже выполненных по- вторений либо число повторений, которое осталось выполнить.. Счетчиком циклов может быть регистр или ячейка памяти. Если для него используются 8 бит, то можно организовать до 256 повторений цикла' Если счетчик 16-разрядный, то цикл может быть повторен до 65536 раза. В команде LOOP для организации, счетчика циклов использован регистр СХ. В регули- рующую логику могут входить также команды, по которым осуществляются какие-либо вычисления или перемещения данных, необходимые для правильного выполнения следующего цикла. Проверка окончания цикла Цикл Может быть окончен различными путями. Йз ^ цйкла можно выйти с помощью команд условных Пв; реходов при наступлении соответствующий условий. В случае простых циклов окончание обычно насту- пает тогда, когда тело цикла пройдено число раз, за- данное счетчиком циклов. При более сложной струк- туре цикла, когда он содержит несколько возможных выходов, его окончание возможно при наступлений различных событий. В подобных ситуациях цикл мо- жет завершиться и при ненулевом содержимом счет- чика циклов. Инициализация Тело цикла, регулирующая логика й проверка окончания могут выполняться циклически. Подготов- ка или инициализация — шаг, который должен быть выполнен только один раз — перед входом в цикл. Основными операциями являются установка счетчика циклов и соответствующих флагов процессора, а также 317
подготовка необходимых исходных данных для пер^ вбго прохода тела цикла. . После инициализации остальные части цикла мо- гут исполняться в любом порядке. На рис. 8.1 пока- заны две типичные конфигурации цикла. Вариант В применяется в специальных случаях, когда тело цик- ла не должно выполняться вообще, если проверка окончания устанавливает наступление определенных событий до первого исполнения цикла. На рис. 8.2 представлен простой цикл, предназначенный для вы- полнения суммирования 100 целых чисел. Регистр СХ использован в качестве счетчика циклов, и во время инициализации в него записывают число 100 тчруиуриг 318
Инициализация Тело цикла Регулирующая логика Тест на окончание Рис. 8.2. Структура цикла сложения ста целых чисел. необходимых повторений. В ячейке памяти с символи- ческим адресом SUM записывается 0. Тело цикла про- изводит накопление суммы в ячейке SUM. Регулирую- щая логика состоит из команды LOOP, которая уменьшает содержимое регистра СХ и тем самым кон- тролирует число повторений. Окончание цикла насту- пает при выполнении заданного числа повторений (в данном случае 100). Эта процедура, написанная на языке ассемблера, представлена на рис. 8.3, Структура процедуры Если одну и ту же последовательность команд тре- буется выполнять в различных местах программы, нет никакой необходимости записывать эти команды мно- гократно. Для этого достаточно в одну процедуру сгруппировать машинные коды, решающие одну и ту же задачу. Далее, в каждом месте программы, где требуется выполнение определенной последо- 319
0000 ADDITION PROQ NEAR процедура сложения 100 целых чисел 0000 8D351B00 LEA Si, TABLE ;Таблица содержит 100 8-битовых чисел 0004 FC CLD. 0005 2BDB SUB ВХ,ВХ ;Иницйализация 0007 2ВС0 SUB АХ, АХ 0009 А31900 MOV SUM,АХ 000С В96400 MOV СХ,100 ;Счетчик итераций нй 100 повторений 000F АС ADD: LODSB ;Взять целое из таблицы 0010 03D8 ADD ВХ.АХ Суммируются все целые 0012 E2FB LOOP ADD ;Цикл повторяется 100 раз 0014 891Е1900 MOV SUM,BX ;СумМа 100 целых чисел 0018 СЗ RET 0019 ?? SUM DW ? 001В TABLE DB , . 10,12,14,1 16,18,17,3,3,4,2,0,0,0,1,2,1,0,0,0,0 db 1,2,3,4,5 ,5,5,70,12,14,16,12,17,14,15,16,8,7,1,2 DB 2,4,5,2,3, ,14,32,21,12,16,18,12,11,И,И,16,17,12,19,0 DB 66,12,13,6,0,0,0,0,1,1,1>1.2,3,3,3,4,0,0,0 DB 77,8,1,2,0,0,0,0,0,1,2,121,12,12,15,16,17,18,19,20 007F ADDITION ENDP г'” Рис. 8.3. Процедура сложения ста целых чисел.
Вызов последователь- ности А Вызов последователь- ности А Вызов последователь- ности А Пдследователь- ностьА Рис. 8.4. Примеры участков программ. А —программа без процедур; В — программа с процедурами. вательности команд, надо передавать управление со- ответствующей процедуре. Однако при этом следует еще сообщать процедуре достаточную информацию о данных, с которыми ей предстоит работать, и о том, куда после своего завершения вернуть управление. В системах семейства МП 8088 информация о воз- врате управления вызывающей программе обычно хранится в стеке. Параметры, передаваемые процедуре основной программой, обычно хранятся в регистрах централь- ного процессора или загружаются в стек. Таким обра- зом, процедура является блоком команд и данных, имеющим свое имя, и может быть вызвана для выпол- нения определенной функции другой программой или процедурой. Для определения начальной и конечной точек про- цедуры могут использоваться ассемблерные директи- вы PROC (определение процедуры) и ENDP (конец процедуры). Применение процедуры иллюстрируется на рис. 8.4, где сравниваются структура памяти и уп- равления для двух возможных случаев. В языке ассемблера 8088 вызов процедуры осуще- ствляется просто. Для передачи управления процеду- ре служит команда CALL. Если процедура объявлена как NEAR, ассемблер генерирует внутрисегментную V2‘Д’ Дао 321
команду CALL. Для правильного возврата из про- цедуры в стеке сохраняется перемещаемый адрес команды, следующей за CALL. Если процедура объ- явлена как FAR, генерируется межсегментная коман- да CALL. В стеке сохраняются также содержимое регистра СХ и перемещаемый адрес следующей за CALL команды. Возврат из процедуры осуществляет- ся по команде RET. Использование такой структуры позволяет упро- стить программу путем разбиения большой и слож- ной задачи на множество небольших, каждая из ко- торых выполняет определенную функцию и имеет ми- нимальное число связей с другими. Эти части (или процедуры) задачи могут быть составлены и отлаже- ны независимо друг от друга, что существенно при отладке нового программного обеспечения. Такой под- ход экономит также и память вследствие уменьшения размеров программы, поскольку при этом исключается надобность переписывать процедуру в каждом необ- ходимом месте. Но основным достоинством процедуры является то, что она пишется один раз и затем ис- пользуется как “строительный” блок при создании больших программ. Единственной “платой” за все это является необходимость сохранения в стеке информа- ции, требуемой для возврата из процедуры. Рис. 8.5. Встроенные процедуры, 322
Процедура может вызвать другую процедуру (встроенные процедуры), как показано на рис. 8.5,.. или саму себя (рекурсивная процедура). “Пузырьковая" сортировка Такая сортировка является одним из наиболее распространенных способов сортировки небольшого числа данных или упорядочения небольшого количе- ства элементов таблицы. Элементы могут выстраи- ваться как в восходящем, так и нисходящем порядке в соответствии с их “весами”. При упорядочении в порядке возрастания наибольший по “весу” элемент помещается на так называемое дно таблицы, в то время как наименьший “всплывает” подобно пузырь- ку на ее вершину. Поскольку буквы алфавита пред- ставляются в МП 8088 последовательным кодом ASCII, эта техника сортировки очень эффективна при упорядочении текстов. Простой пример “пузырьковой” сортировки пред- ставлен на рис. 8.6. Таблица содержит четыре числа (65, 70, 67 и 69), которые надо упорядочить в порядке возрастания. После сортировки получаем таблицу в виде последовательности 65, 67, 69, 70 с числом 65 на ее вершине и с числом 70 на дне. В соответствии с алгоритмом метода сравниваются два верхних (или два нижних) элемента таблицы. Если элемент, распо- ложенный ниже, имеет меньшую величину, т. е. “лег- че” верхнего, они меняются местами; в противном слу- чае оба остаются на своих местах. Процесс продолжа- ется до тех пор, пока не произойдет сравнение всех пар. На рис. 8.6 показана сортировка, начинающаяся с верхних элементов таблицы, а на рис. 8.7 — тот же самый процесс, но начинающийся от дна таблицы; результаты сортировок одни и те же. Если числа в этих примерах рассматривать как буквы, представленные кодом ASCII, то получим: А. (65 или 41Н), F (70 или 46Н), С (67 или 43Н) и Е (69 или 45Н). Легко видеть, что пузырьковая сорти- ровка может быть применена для упорядочения букв в алфавитном порядке. Процедура, показанная на рие. 8.8, упорядочивает в алфавитном порядке файл имен каталога дискета персонального компьютера ‘/all* 323
65 65 67 67 70 69 69 70 70 >69 Перемена (с) 69 <70 Закончено за один проход (d) Фис. 8.6. Пример “пузырьковой” сортировки, начинающейся о верхнего элемента. 65 65 4— 65 <— 65 70 70 67 67 67 67 70 70 69 69 69 69 67<69 Перемен нет (а) 70>67 Перемена. (Ь) . 65 <67 65<67 Перемен нет Конец первого прохода (с) (d) 65 65 65 4— 65 67 67 67 67 70 69 69 69 69 70 70 70 70 >69 Перемен нет (в) 67<69 Перемен нет tf) 65<67 Перемен нет J (д) 65 <67 Конец второго прохода 00 Фис. 8.7. Пример “пузырьковой” сортировки, начинающейся с нижнего элемента. (На рис. 8.7(e) должно быть: Перемена.) 324
IBM. На рис. 8.9 показано состояние каталога до и после сортировки. Перевод алгебраического выражения в обратную польскую запись Рассмотрим пример процедуры, полностью исполь- зующей структуру стека семейства микропроцессоров 8086/8088. Процедура может быть вызвана любой программой. Предполагается, что параметры, необхо- димые для инициализации процедуры, содержатся в нескольких регистрах общего назначения. Процедура реализует распространенный метод перевода выраже- ния, написанного в обычной алгебраической форме (со скобками и алгебраическими операторами, распола- гающимися между операндами), в так называемую обратную польскую запись, в которой никогда не ис- пользуются скобки, а операторы пишутся после опе- рандов, с которыми они работают. Такая запись очень удобна для построения компи- ляторов. Она позволяет представить сложные уравне- ния на языках высокого уровня (Фортран или Бей- сик) в форме, для которой вычислительный процесс может быть организован более простыми компактны* ми средствами. Пример. Обратная польская запись: АВ + С/ Первый знак в записи (+) означает арифметиче- ское сложение двух операндов, находящихся левее знака. Знак (+) встречается первым, если читать выражение слева направо, и это значит, что сложение операндов А и В выполняется первым. После завер- шения сложения выражение считывается до тех пор, пока не встречается следующий оператор, в данном случае деление. Эта операция применяется к двум предшествующим ей операндам, которыми теперь яв- ляются (А + В) и С. Рассмотренная польская запись эквивалентна обычному алгебраическому выражению (А + В)/С. Процедура, представленная на рис. 8.10, выпол- няет перевод алгебраического выражения в обратную польскую запись. Для вызова процедуры необходимы следующие данные: 325
0000 SORT SEGMENT ASSUME CS : SORT,DS : SORT,ES : SORT, SS : NOTHING ;B этом примере предполагается, что файл имен хранится в памяти, начиная с ячейки ;INPUT_BUFFER. Каждое имя в файле может иметь до 11 символов. Количество сортируемых имен файла записано в ячейке NO_ENTRIES. Упорядоченные имена ;запнсываются в память, начиная с ячейки OUTPUT-BUFFER. Группа указателей, определяющих позицию каждого имени, указывается ячейкой SORT-TABLE. Метод ‘/'пузырьковой" сортировки применяется к именам, определенным в буфере ;INPUT_BUFFER Соответственно изменяются указатели в SORT-TABLE. При этом изменяются не сами ;имена файла, а указатели в SORT-TABLE 0000 0000 9С MAIN PROC PUSHF NEAR оо 0001 1Е PUSH DS N3 О'. 0002 2ВС0 SUB AX,AX 0004 50 PUSH AX 0005 06 PUSH ES 0006 1Е PUSH DS Сохранение содержимого регист- ров для последующего возврата ;в DOS 0007 8СС8 MOV AX,CS 0009 8ED8 MOV DS,AX 000В 8ЕС0 MOV ES,AX 000D Е89А01 CALL BUBBLE-SORT ;Имена в файле упорядочиваются ;по алфавиту 0010 8В2Е3700 MOV BP,NO_ENTRIES 0014 8D3E0501 LEA DI,OUTPUT-BUFFER 0018 0(НС 8D1E3B00 CONTINUE: LEA ВХ, SORT-TABLE Подготовка к выборке упорядо- ченных указателей
001С 8BF3 MOV SI,BX 001Е АС 00IF В400 LODSB MOV AH, 00 0021 В10В MOV CL,И 0023 F6E1 MUL CL 0025 8D366000 LEA SI,INPUT-BUFFER 0029 03F0 ADD SI,AX ;Позицня следующего упорядочен- 002 В В90В00 MOV ;ного имени в файле СХ,11 002Е F3A4 REP MOVSB 0030 43 INC ВХ ’.Следующий упорядоченный 0031 4D DEC ’.указатель ВР Останавливается количество 0032 75Е8 JNE оставшихся имен CONTINUE 0034 IF POP DS 0035 07 POP ES 0036 CF IRET ;Возврат в DOS 0037 0037 0037 0F00 MAIN ENDP WORK-AREA PROC NO-ENTRIES NEAR DW 15 ;B этом примере сортируется 0039 ?? CURRENT-POINTER ;15 имен DW ? ’.Текущий указатель 003В SORT-TABLE ;в SORT-TABLE DB 15 DUP(?) резервирование памяти под 15 004А 0055 SOURCE-STRING COMPARE-CTRING указателей DB 11 DUP(?) DB 11 DUP(?) Рис. 8.8. Процедура сортировки, упорядочивающая файл имен в алфавитном порядке.
0060 INPUT_BUFFER D3 DRESSER 00 g 0105 01AA 01AA 01AA 8D363B00 OUTPUT.BUFFER WORK-AREA ENDP BUBBLE-SORT PROC LEA DB 'TRW86 DB 'RAYMOND ' DB 'INTEGER DB 'PARADE ' DB 'COPYN ' DB 'XEROXLONGST' DB 'PENGUIN DB 'ELECTRONART' DB 'ORIGINAL DB 'RANDOM DB 'TEMP3 DB 'CHAPTERS DB 'APPENDIX DB 'SORT DB 165 DUP(?) NEAR SI, SORT-TABLE резервирование памяти под 15 упорядоченных имен ;Сортировка имен ;в INPUT-BUFFER 01AE 8B0E3700 MOV CX,NO-ENTRIES ;Число элементов списка, подле- 01B2 01B4 01B4 2BDB 8818 SUB LOOP-SORT: MOV BX,BX [BX 4- SI],BL жащих сортировке Инициализация указателей 01B6 01B7 01B9 43 E2FB B90B00 INC LOOP MOV BX LOOP-SORT CX,11
12 Л. Дао 01 ВС 8D3E4A00 LEA 01С0 В82020 MOV 01 СЗ 01С5 F3AB 8D3E5500 REP LEA 01С9 8D366000 LEA 01CD В90В00 MOV 01D0 F3A4 REP 01D2 01D8 С70639000100 MOV WORD LOOP-CHECK: 01D8 E84900 CALL 01DB E87200 CALL 01DE 762D JBE DI, SOURCE-STRING AX,2020H ;3апись пробелов в два буфера, Содержащие имена сравниваемых элементов списка STOSW DI,COMPARE-STRING SI,INPUT-BUFFER CX,11 MOVSВ , s PTR CURRENT-POINTER,! ;B списке не менее двух элементов 01E0 FF363900 01E4 01E4 8D363B00 01E8 03363900 01EC 8A04 PUSH LOOP-SWAR: LEA ADD MOV STRING-MOVE STRING-COMPARE NEXT-ENTRY CURRENT-POINTER SI, SORT-TABLE SI, CURRENT-POINTER AL,[SI] ;Порядок элементов пра- вильный 01EE 8644FF 01 Fl 8804 01F3 832E390002 XCHG MOV SUB WORD 01F8 720F 01FA E82700 01FD E85E00 0200 FF063900 JB CALL CALL INC WORD [SI],AL PTR CURRENT-POINTER,2 EXIT-SWAP STRING-MOVE STRING-SWAP PTR CURRENT-POINTER ; Me ня юте я два элемента ;только в буфере ;Переход через элементы, ;которые поменяли Рис. 8.8 (продолжение).
0204 Е84900 CALL STRING-COMPARE 0207 77DB JA LOOP-SWAP ;Начало следующего шага 0209 EXIT-SWAP; /'пузырьковой" сортировки 0209 8F063900 POP CURRENT-POINTER 020D NEXT-ENTRY: 02QD А13900 MOV AX, CURRENT-POINTER 0210 40 INC AX 0211 3B063700 CMP AX,NO-ENTRIES 0215 7201 JB CHECK-NEXT-ENTRY 0217 СЗ RET ;Сортировка завершена 0218 CHECK_NEXT_ENTRY: 0218 А33900 MOV CURRENT-POINTER, AX 021В 8D363AOO LEA SI, SORT-TABLE -1 021F Е81300 CALL STRING-RESTORE 0222 ЕВВ4 JMP SHORT LOOP-CHECK 0224 BUBBLE-SORT ENDP 0224 STRING-MOVE PROC NEAR 0224 8D36550Q LEA SI, COMPARE-STRING 0228 8D3E4A00 LEA DI, SOURCE-STRING 022С В90В00 MOV CX,U 022F F3A4 REP MOVSB 0231 8D363B00 LEA SI, SORT-TABLE ;Взять в файле другое имя 0235 STRING-RESTORE: 0235 03363900 ADD SI,CURRENT-POINTER 0239 АС LODSB 023А В400 MOV AH,00 023С В10В MOV CL,11 ;1! символов на имя 023Е F6E1 MUL CL 0240 8D366000 LEA SI, INPUT-BUFFER
0244 03F0 ADD SI, AX 0246 В90ВОО MOV CX.ll ;Взять другой элемент 0249 8D3E5500 LEA DI.COMPARE.STRING 024D 024F 0250 0250 0250 0253 0257 025В 025D 025Е 025Е 025Е 0261 0265 0269 0269 026А 026С 026F 0270 0272 0273 0273 F3A4 СЗ В90В00 8D364A00 8D3E5500 F3A6 СЗ В90В00 8D364A00 8D3E5500 АС 8605 8844FF 47 E2F7 СЗ REP MOVSB RET STRING-MOVE ENDP STRING-COMPARE PROC NEAR MOV CX,11 LEA SI, SOURCE. STRING LEA DI, COMP ARE-STRING REPE CMPSB RET STRING-COMPARE ENDP S TRING-S WAR PROC NEAR MOV cx,u LEA SI, SOURCE-STRING LEA DI,COMPARE-STRING SWAR-LOOP: LODSB XCHG AL, [DI] MOV [SI-1],AL INC DI LOOP SWAP-LOOP RET STRING-SWAP ENDP SORT ENDS END ;списка Рдс. 8.8. (окончание).
tf мена в файле Имена в файле до „пузырьковой* - «юоле „'пуэмридавои сортировки сортировки DRESSER APPENDIX TRW86 CHAPTERS RAYMOND COPYN INTEGER DRESSER PARADE ELECTRONART COPYN INTEGER XEROXLONGST ORIGINAL PENGUIN PARADE ' ELECTRONART PENGUIN, ORIGINAL RANDOM RANDOM RAYMOND TEMP3 SORT CHAPTERS TEMP3 APPENDIX TRW86 SORT XEROXLONGST Рис. 8.9. Файл имен каталога дискеты до и после сортировки, • регистр SI указывает на начальный адрес последо- вательности кодов ASCII, представляющих алгебраи- ческое выражение; • регистр DI указывает начальный адрес области па- мяти, зарезервированной для хранения польской за- писи; • регистр СХ содержит количество символов входной последовательности, означающей алгебраическое вы- ражение; Предполагается также, что соблюдение синтаксиса в исходной последовательности проверено другой про- цедурой. Для простоты использованы однобуквенные операнды и операции (+), (—), (*) и (/). Каждому оператору присваивается свой приоритет. Приоритет операторов (*) и (/) выше, чем у (+) и (—). Это соответствует правилу, по которому операции умно- жения и деления предшествуют операциям сложения и вычитания. Перевод осуществляется с помрщыа ал- горитма, включающего следующие шаги; 332
Исследуется. текущий, символ, входной последов вательности. ’ 2. Если символ является операндом, он записы* вается в выходную последовательность, 3. Если символ является открывающей скобкой, он загружается ^ стек с приоритетом 0. 4. Если символ является оператором, его приори- тет сравнивается с приоритетом оператора, находяще- гося на вершине стека. Если его приоритет выше, то этот оператор загружается на вершину стека. В про- тивном случае оператор с вершины стека передается в выходную последовательность. Сравнение с новой вершиной стека продолжается до тех -пор, пока не будет найден оператор с приоритетом ниже, чем у те- кущего, или пока стек не окажется пустым. Затем те- кущий оператор загружается на вершину стека. 5. Если символ является закрывающей скобкой, все операторы из стека передаются в выходную по- следовательность до тех пор, пока на вершине стека не окажется открывающая скобка. : 6. Если алгебраическое выражение закончилось, все оставшиеся операторы с вершины стека переда- ются в выходную последовательность. На рис. 8.11 показаны операции, необходимые для перевода в польскую запись выражения А 4- В * С 4- (D 4- Е) *F. Рекурсивное программирование Процедура, которая вызывает сама себя (непо- средственно или через другие процедуры) с помощью команды CALL, называется рекурсивной. Некоторые языки высокого уровня, например Фортран, не позво- ляют выполнять подобную операцию. Когда рекур- сивная процедура вызывается впервые, говорят, что глубина рекурсии равна 1, а процедура исполняется на 1-м уровне. Если процедура вызывается N раз, го- ворят, что уровень рекурсии спускается до уровня N + 1. При возврате из процедуры (исполнение коман- ды RET) уровень рекурсии повышается. Рекурсивное программирование осуществляется с помощью запо- минания в стеке адресов возврата на каждом уровне 334
„ 0000 RPN SEGMENT PARA PUBLIC i, ' ASSUME CS : RPN,DS : RPN,ES: RPN, SS: Nothing ; [SI] Начальный адрес строки, содержащей алгебраическое Выражение ; [DI] Начальный адрес зоны памяти, содержащей выходную строку ; обратной польской записи 4 ' ; СХ Количество символов во входной строке ; DX Уровень стека ; ВХ Для временного хранения ; ВР Для временного хранения 0000 2BD2 SUB DX,DX фиксируется уровень стека 0002 AC LOOP: LODSB ;Берется символ из входной строки 0003 8ВЕ8 MOV ВР,АХ Сохранение выбранного символа 0005 ЗС2А СРМ AL,'*' ;Проверка наличия оператора умножения 0007 7519 JNE CHECKDIV 0009 85D2 MULDIV: TEST DX,DX ;Проверка того, что стек пустой (уровень 0) 000В 7411 JE PUSHSTACK OOOD 8BDC СНЕСК1: MOV BX,SP OOOF 803F2A CMP BYTE PTR[BX],'*' ;Проверка наличия в стеке операторов умножения ;цли деления 0012 7405 JE POP STACK 0014 803F2F CMP BYTE PTR[BX],'/' 0017 7505 JNE PUSHSTACK 0019 POP STACK: 0019 58 POP AX
001А 4А 001В АА DEC DX ^Выборка оператора STOSB 001С EBEF : 001 е 001Е 55 001F 42 JMP SHORT CHECK1 PUSHSTACK: PUSH BP INC DX 0020 Е2Е0 0022 0022 3C2F 0024 74ЕЗ 0026 ЗС2В 0028 7510 LOOP LOOP CHECKDIV: CMP AL, 7' JE MUL DIV CMP AL/+' JNE CHECKSUB ^Обработка всех символов входной строки 002А 85D2 002С 74F0 ADDSUB: TEST DX,DX JE PUSHSTACK ;Проверка того, что стек пустой 002Е 8BDC CHECK2: MOV BX,SP 0030 803F28 0033 74Е9 0035 58 CMP BYTE PTR[BX],'(' JE PUSHSTACK POP AX ;Проверка на открывающую скобку 0036 4А DEC DX приведение в соответствие уровня стека 0037 АА 0038 EBF0 003А STOSB JMP SHORT ADDSUB CHECKSUB: ;Выборка оператора ООЗА 3C2D 003С 74ЕС CMP AL/-' JE ADDSUB *,Проверка наличия оператора вычитания 003Е ЗС28 0040 74DC CMP AL/(' JE PUSHSTACK ;Проверка на следующую открывающую скобку Рис, 8,10. Процедура преобразования алгебраического выражения в обратную польскую запись.
0042 ЗС29 СМР AL/)' 0044 7509 JNE OPERAND ;Выборка операндов до появления открывающей ;скобки 0046 58 POPALL: POP АХ 0047 4А DEC DX 0048 ЗС28 СМР AL/)' 004А 7404 JE LOOP1 004С АА STOSB 004D EBF7 JMP SHORT POPALL 004F OPERAND; 004F АА STOSB ;Выборка операндов 0050 Е2В0 LOOP!: LOOP LOOP 0052 8ВСА MOV CX.DX 0054 85С9 TEST СХ,СХ ;Проверка того, что стек пустой 0056 7404 JE RETURN 0058 LOOP2: 0058 58 POP АХ ’ 0059 АА STOSB 005А E2FC LOOP LOOP2 ;3апись в выходную Строку остатка стека- 005С RETURN: 005С СЗ RET 005D RPN ENDS END Рис. 8.10, (окончание}.
• МфМММИЯМЬк' -- Л+ B*C+ (0 + £>F Входная строка - Выходная строка Стек (алгебраическая) (Обратная польская запись) (Вершина стека справа) A+B*C+flD+E)*F Пусто Пусто 4B»C+(D+E)*F А Пусто B*C+(D+E)*F А »C+(D+E)*F АВ •4» C-HD+E)*? АВ +(D+E)*F АВС (D+E)»F АВС*+ •+* D+E)*F АВС*4- +( 4E)*F ABC*+D •+( E)*F ABC*+D 4(+ )*F ABC*+DE 4-(+ *F ABC *+DE 4- Ч- F ABC*+OE-F 4-« Пусто ABC*+DE+F Н-* ABC*+DE+F*-i- Пусто Рис. 8.11. Действия, выполняемые при переводе алгебраического выражения в обратную польскую запись. рекурсии при его понижении и с помощью считыва- ния этих адресов из стека при его повышении. Разра- батывая рекурсивную процедуру на языке ассемблера 8088, необходимо помнить о возможности переполне- ния стека (максимальный объем стековой памяти в семействе 8088—32 К слов). Процедура, приведенная на рис. 8.12, является при- мером решения задачи, известной под названием “Башни Ханоя”. Решение этой задачи, которое трудно получить привычными методами, упрощается при ис- пользовании рекурсивного программирования. Задача формулируется следующим образом: имеются пять дисков А, В, С, D и Е и три башни 0, 1 и 2, располо- женные так, как показано на рис. 8.13. Диски имеют различные диаметры и располагаются последователь- но один над другим. Наименьший диаметр имеет диск А, расположенный на вершине, а наибольший диаметр — диск Е, размещенный внизу. Требуется пе- 337
0000 TOWER SEGMENT 0000 0000 9C 0001 IE 0002 2BC0 0004 50 0005 IE 0006 06 0007 8CC8 0009 8ED8 MAIN ASSUME CS : TOWER,DS : TOWER,ES : TOWER,SS : TOWER PROC NEAR ;Ведущая программа PUSHF PUSH DS SUB AX,AX PUSH AX PUSH DS PUSH ES Сохранение содержимого регистров ;для последующего возврата в DOS MOV AX,CS MOV DS,AX ;Перекрытие сегмента команд и сег- О» 000В 89265401 000F 8C165601 ;мента данных MOV SP-SAVE,SP MOV SS-SAVE,SS Сохранение содержимого регистров 0013 8EC0 0015 8ED0 0017 8D265805 001В 8D3E5400 001F B400 0021 B001 0023 B602 0025 B205 0027 E80F00 002A B8FFFF 002D AB ;SS и SP MOV ES,AX ;Перекрытие сегмента команд и дополнительного сегмента MOV SS,AX ;Перекрытие сегмента команд и ;стекового сегмента LEA SP,TOP-OF-STACK LEA DI,OUT-AREA ;Область памяти для хранения необходимых перемещений MOV АН,00 ;С башни 0 MOV AL,01 ;На башню 1 MOV DH,02 ;Башня 2 временного хранения MOV DL,05 количество дисков, которые необходимо перенести CALL TOWER-HANOI MOV AH,0FFFFH STOSW ;Индикация конца последовательности /
339г ' 002Е 0032 Ю036 0037 0038 0039 8Е165601 MOV 8В265401 MOV 07 POP IF POP CF IRET MAIN . ENDP SS,SS_SAVE I SP,SP_SAVE ES DS ;Возврат в дисковую операционную ;систему (DOS) TOWER-HANOI PROC NEAR ;Рекурсивная процедура АН Номер башни, с которой должны быть перемещены диски AL Номер башни, на которую должны быть перемещены диски DH Номер башни временного хранения дисков DL Количество дисков, которые перемещаются Последовательность перемещений генерируется и отображается в виде шестнадцатеричных чисел FFFFH. Перемещение записывается в форме НА-С, НА-С и т. д. Например, последовательность 01 00 02 00 02 01 означает. ; Переместить на башню ; другой диск с башни 0] 1 диск с башни 0, затем переместить на башню 2 , затем переместить на башню 2 диск с башни 1 и т. д. 0039 80FA01 СМР DL,01 Проверка на последний диск 003С 7502 JNE RECURSIVE 003Е АВ STOSW 003F СЗ RET ,0040 RECURSIVE; 0040 50 PUSH АХ Рис, 8.12, Процедура решения задачи „Башни Ханоя’*.
310 0041 52 PUSH DX 0042 FECA DEC DL 0044 86F0 XCHG dh.al Переместить n — 1 диск с башни 0 ;на башню 2 0046 0049 E8F0FF CALL FIRST-RETURN: TOWER-HANOI 0049 5А POP DX 004А 58 POP AX 004В АВ STOSW Переместить диск 1 с башни 0 ;на башню 1 после того, как будут перемещены на башню 2 п~ 1 ;верхних диска 004С 86Е6 XCHG AH,DH Переместить п —> 1 диска обратно ;на башню 1 . 004Е FECA DEC DL 0050 0053 0053 E8E6FF СЗ CALL SECOND-RETURN: RET TOWER-HANOI 0054 0154 OUT_AREA DB 256 DUP(0) TOWER_HANOI ENDP 0154 STACK PROC NEAR ^Область стека . 0154 ?? SP-SAVE DW ? 0156 ?? SS_SAVE DW ? 0158 0558 055А 055А DB 128 DUP('STACK TOP_OF_STACK DW ? STACK ENDP TOWER ENDS END Рис, 8,12 (окавдаиие).
Перемещения, построенные процедурой TOWER-HANOI 01 00 02 00 02 01 01 00 00 02 01 02 01 00 02 00 02 01 00 01 00 02 02 01 01 00 02 00 02 01 01 00 00 02 01 02 01 00 00 02 02 01 00 01 00 02 01 02 01 00 02 00 02 01 01 00 00 02 01 02 01 00 FF FF Оптимальные перемещения С башни На башню С башни На башню 0 1 2 0 0 2 2 1 1 2 0 1 0 1 2 0 2 0 1 2 2 1 1 0 0 1 2 0 0 2 2 1 1 2 0 1 1 0 0 2 2 0 1 2 1 2 0 1 0 1 2 0 0 2 2 1 1 2 0 1 0 1 Рис. 8.14. Оптимальные перемещения пяти дисков с одной бащ- ни на другую в задаче „Башни Ханоя”. реместить все пять дисков с башни 0 на любую из башен 1 или 2. При этом разрешается снимать диск с вершины любой башни и помещать его иа любую другую. Единственным ограничением является то. что. 341'
больший диск нельзя класть поверх меньшего. Про* цедура, показанная на рис. 8.12, представляет со* бой оптимальное (с точки зрения минимума опера* ций) решение задачи; определяемые ею перемещения запоминаются, начиная с ячейки MOVEMENT. На рис. 8.14 дана таблица всех перемещений, не* обходимых для перемещения дисков с башни 0 на башню 1. Башня 2 используется для промежуточного хранения дисков. Для перемещения пяти дисков не* обходимо произвести минимум 31 перестановку,
IX ЦИКЛИЧЕСКИЙ И ЛИНЕЙНЫЙ СДВИГ Команды циклического и линейного сдвига обеспечивают мани- пуляцию отдельными разрядами байта или слова. Они могут использоваться для модификаций или исключений по шаблону отдельных разрядов содержимого в регистрах или ячейках па- мяти, в том числе и в сочетании с логическими командами. Ко- личество битов, на которое может быть произведен любой сдвиг, может доходить до 255. Для задания числа сдвигов ис- пользуется регистр CL. При сдвиге разряды числа перемещаются в одну сторону, а при циклическом сдвиге они перемещаются по кольцу. В командах сдвига перемещение справа налево экви- валентно умножению на степень основания два, а перемещение слева направо эквивалентно делению на степень основания "два". Действия, производимые при сдвиге и циклическом сдвиге, по- казаны на рис. 9.1. _ .Команды циклического сдвига Флаг переноса можно интерпретировать как рас- ширение операнда. Биты регистра или ячейки памяти во время циклического сдвига в отличие от простого .(линейного) сдвига не теряются. Выходя с конца ре- гистра, они возвращаются в его начало или наоборот. С помощью счетчика, расположенного в регистре CL, может быть задано до 255 перемещений. Если содер- жимое счетчика равно 1, то нет необходимости ис- пользовать регистр CL, число сдвигов может быть частью самой команды. Использование регистра CL позволяет изменять число перемещений во время вы- полнения операции. Команды циклических сдвигов изменяют состояния только флагов переноса CF и переполнения OF. Флаг CF всегда указывает число, которое было последним выдвинуто из регистра-операнда. Если количество пе- ремещений больше 1, состояние флага переполнения OF становится неопределенным. При однобитовом 343
Рис. 9.1. Циклический и линейный (простой) сдвиги. циклическом сдвиге состояние флага OF становится единичным, если в результате операции изменяется значение старшего бита операнда (бита знака). В про- тивном случае (если этот бит не изменился) флаг переполнения обнуляется. RCL (Rotate through Carry Left — циклический сдвиг влево через перенос): выполняется циклический сдвиг битов байта или слова операнда влево на один бит или на число битов, определяемое регистром CL. Флаг переноса CF интерпретируется как расширение операнда. Его содержимое перемещается на место младшего бита операнда, а сам он заменяется стар- шим битом операнда. RCR (Rotate through Carry Right — циклический сдвиг вправо через перенос): выполняется циклический сдвиг битов байта дли слова операнда вправо на один бит или на число битов, определяемое регистром С L. Флаг переноса CF интерпретируется как расширение операнда. Содержимое флага сдвигается в старший бит операнда, а сам он заменяется младшим, битом последнего. 344
ROL (Rotate Left— циклический сдвиг влево): вы- полняется циклический сдвиг содержимого байта или Слова операнда на ©Дин бит или на число битов, опре- деляемое регистром CL, влево (в направлении самого старшего бита). ROR (Rotate Right — циклический сдвиг вправо): выполняется циклический сдвиг содержимого байта или слова операнда на один бит или на количество битов, определяемое регистром CL, вправо к(по на-, правлению к младшему биту). Команды линейного сдвига Существуют арифметический и логический сдвиги разрядов в байте или слове операнда. Заданием соот- ветствующего числа в регистре CL сдвиг как влево, ,так и вправо может доходить до 255 разрядов. Сдвиг на одну позицию может быть определен и частью са- мой команды. Использование регистра CL для зада- ния величины сдвига позволяет изменять его во вре- мя выполнения операции. * На состояния флагов сдвиг воздействует следую- щим образом. Флаг вспомогательного переноса AF в результате операции становится неопределенным. Со- стояния флагов паритета PF, знака SF и нуля ZF из- меняются так же, как и по другим логическим коман- дам. Флаг переноса CF всегда хранит последний бит, выдвинутый из операнда. При сдвиге, большем 1, со- стояние флага переполнения OF становится неопре- деленным. При сдвиге на одну позицию состояние флага OF становится единичным, если в результате операции изменяется значение старшего бита (бита знака), в противном случае флаг обнуляется. SHL/SAL (Shift Logical Left/Shift Arithmetic Left — логический сдвиг влево/арифметический сдвиг влево) *>: содержимое байта или слова операнда сдви- гается влево на 1 бит или на количество битов, опре- деляемое регистром CL. Справа (в позицию младшего бита) вписываются нули., SAR (Shift Arithmetic . Right — арифметический сдвиг вправо): биты байта или слова операнда Два мнемонических обозначения одной и той Же опе- рации. '
/ 0000 SHIFT PROC NEAR ;Процедура подсчета единичных битов с помощью г. ;команд сдвига ’ 0000 2BD2 SUB DX,DX Остановить счетчик битов в 0 0002 В91000 MOV CX.16 ;Число итераций boos 8BD8 COUNT: MOV BX.AX 0007 '250100 AND AX.0001H ;Обращение к самому младшему разряду 000А 03D0 ADD DX,AX прибавление его в счетчик ооос 8ВСЗ MOV AX,BX 000Е D1E8 SHR AX,1 ;Сдвиг следующего бита в нулевой разряд Оою E2F3 LOOP COUNT : 0oi2 СЗ RET р013 SHIFT ENDP 1 Рис. 9.2. Процедура подсчета единичных битов слова, использующая команды сдвига. ©> tf* о 0000 ROTATE PROC NEAR Процедура подсчета единичных битов, использующая ;команды циклических сдвигов 0000 2BD2 SUB DX,DX Остановка счетчика битов в 0 0002 В91000 MOV CX,16 ;Чнсло итераций .0005 COUNT- LOOP: > 0005 D1C0 ROL AX,1 ;Перенос бита во флаг переноса CF 0007 7301 JNC BIT0 ;Проверка, чему равен бит: 0 или 1 0009 42 INC DX ;Подсчет единичных битов 000А E2F9 BIT0: LOOP COUNT-LOOP ОООС СЗ RET 000D ROTATE ENDP Рис, 9,3. Процедура подсчета единичных битов слова, использующая команды циклического сдвига,,
сдвигаются вправо на I бит или на число битов, опре- деляемое регистром CL. Значение старшего бита (бита знака) дублируется и “вдвигается” слева в операнд. Таким образом, бит знака исходного операнда остает- ся без изменений. SHR (Shift Logical Right — логический сдвиг впра- во): биты байта или слова операнда сдвигаются впра- во на один бит или на число битов, определяемое ре- гистром CL. Слева (в позицию старшего бита — бита знака) вписываются нули. На рис. 9.2 в качестве примера приведена процеду- ра подсчета числа единичных битов слова. В качестве счетчика использован регистр DX. В регистре АХ со- держится обрабатываемое слово, каждый бит кото- рого перемещается в младший разряд и суммируется с содержимым регистра DX. Таким образом, содер- жимое в счетчике формируется как сумма единичных битов. Нулевые биты также участвуют в суммирова- нии, но никак не влияют на сумму. Организовать та- кое суммирование гораздо легче, чем распознавать, какие коды надо складывать, а какие нет. Поскольку слово состоит из 16 бит, цикл в этом примере для получения окончательного результата должен быть выполнен 16 раз. Процедура на рис. 9.3 также осуществляет подсчет единичных битов слова, но при этом вместо команд линейного сдвига использует команды циклического сдвига. Для накопления числа единичных битов так- же используется регистр DX. При каждом перемеще- нии содержимое флага переноса CF показывает, чему равняется последний из сдвинутых битов: нулю или единице, что служит признаком для изменения содер- жимого регистра DX. Окончательный результат так- же получают за 16 итераций. Декодирование машинных команд После преобразования написанной на языке ас- семблера программы в программу на машинном язы- ке образуется объектный модуль, состоящий из ма- шинных команд. Если его содержимое отобразить на бумаге или экране дисплея, то появятся не мнемони- 347
ческие обозначения, которые были использованы при написании исходной программы, а шестнадцатерич- ные числа; представляющие ’ собой г действительные машинные команды. В тех случаях когда при написа- нии новой программы на языке ассемблера требуются лишь незначительные изменения машинных кодов, иногда быстрее и удобнее внести изменения непосред- ственно в объектный файл, а не проходить всю це- почку редактирования исходной программы и осу- ществлять ее повторную трансляцию с внесенными изменениями. Разумеется, внесение изменений непосредственно в шестнадцатеричные коды машинных команд явля- ется довольно сложной работой. Кроме того, чрезвы- чайно важно иметь возможность проверки изменений, внесенных в объектный файл, с тем чтобы быть уве- ренными в том, что новые объектные коды действи- тельно соответствуют машинным командам. Для этих целей желательно иметь средства, позволяющие транслировать шестнадцатеричные коды машинных команд в мнемонические эквиваленты языка ассемб- лера. Такое обратное преобразование сравнительно несложно, поскольку наборы битов каждого байта объектных кодов однозначно определяют машинную команду и способ адресации. Если машинная коман- да состоит более чем из одного байта, обратное пре- образование возможно только при условии, что изве- стен адрес ячейки памяти, содержащей начальный байт команды. Рассмотрим пример восстановления мнемониче- ских обозначений команд, принадлежащих к группе операторов, работающих с. непосредственными данны- ми. В языке ассемблера МП 8088 в эту группу входят: ADD (сложение), OR (логическое ИЛИ), ADC (сло- жение с переносом), SBB (вычитание с заемом), XOR (исключающее ИЛИ) и СМР (сравнение). Первый байт машинной команды из этой группы имеет шест- надцатеричное значение между 80 и 83. Второй байт, Обозначающий тип ' адресации, может помочь выде- лить из группы саму команду. Приведем. примеры того, как группа битов из третьей, четвертой и пятой позиций второго байта определяет мнемоническое обо- значение команды в языке ассемблера: 348
Вайт типа адресации Мнемонические команды ассемблера Mod 000 Rm Mod 001 Rm Mod 010 Rm Mod Oil Rm Mod 100 Rm Mod 101 Rm Mod 110 Rm Mod ill Rm ADD OR ADC SBB AND SUB XOR CMP Поля Mod и Rm байта типа адресации описаны в Гл. 2. Процедура, изображенная на рис. 9.4, предпола- гает, что соответствующая группа битов этого байта Занесена в регистр AL. Соответствующее мнемониче- ское обозначение хранится в ячейке памяти, адресуе- мой регистром DI. Для организации декодирования в процедуре использованы команды сдвига. {Применение префикса переназначения сегмента В микрокомпьютерах семейства 8088 все простран- ство памяти рассматривается как группа 64-килобай- товых сегментов. Четыре регистра сегментов CS, DS, ES и SS однозначно определяют в памяти соответ- ственно текущие сегменты команд, данных, дополни- тельный сегмент и сегмент стека. Эти сегменты могут как перекрываться, так и находиться в разных местах памяти. Когда регистр SI указывает перемещаемый адрес ячейки памяти, он всегда определяется относительно базового адреса сегмента данных, содержащегося в регистре сегмента данных DS. Используя сегментный префикс, можно заставить микропроцессор 8088 опре- делять этот перемещаемый адрес относительно лю- бого из четырех введенных сегментов. На машинном языке байт сегментного префикса определяется сле- дующим образом: 001ХХ110 где XX —это два бита, определяющие сегмент, отно- сительно которого задается перемещаемый адрес. Комбинации битов XX расшифровываются так: Пара битов XX Соответствующий сегмент 00 ES (дополнительный сегмент) 01 CS (сегмент команд) 349
0000 DECODE PROC NEAR процедура декодирования машинной команды ! 0000 0002 0004 0006 0008 ОООС 000Е 0010 0012 2438 В103 D2E8 F6E1 8D361300 03Е0 В500 F3A4 СЗ AND MOV SHR MUL LEA ADD MOV REP RET AL,00111000B CL,3 AL,CL CL SI,TABLE SI,AX CH, 00 MOVSB ;Выделение битов в позициях 3, 4 и 5 ;Число сдвигов ;Сдвиг группы битов к правому концу Относительное положение в таблице мнемоник ;SI указывает первый символ мнемоники ;Выборка мнемонического обозначения команды I ?g ; 0013 001F ч 002В TABLE DECODE DB DB ENDP 'ADD','OR','ADC','SBB' 'AND',' S UB', 'XOR',' CMP' Рис. 9.4. Процедура декодирования машинной команды. MOV AX, ES:NEXT-LOCATION Переназначение пр фиксом дополнительного сегмента CMP DI,CS:[SI] Переназначение префиксом сегмента команд TEST BYTE PTR SS : [BP + 1234H],0l Переназначение префиксом стекового сегмента ADD DL,DS : [DI + 02] Переназначение префиксом сегмента данных Рис. 9.5. Примеры использования. сегментного .префикса в командах языка ассемблера МП 8088.
0000 ENCODE PROC NEAR ;Процедура формирования байта сегментного префикса 0000 50 PUSH AX Сохранение исходного содержимого АХ 0001 FC CLD ;Сброс в 0 флага направления 0002 В90400 MOV CX,4 Считывание четырех возможных сегментных префиксов 0005 8D3E1D00 LEA DATABLE ;Таблнца содержит название сегмента 0009 8BD7 MOV DX,DI ;Начальный адрес таблицы 000В F2AF REPNE SCASW ;Перебор префиксов в поисках подходящего 000D 2BFA SUB DI,DX 000F 8ВС7 MOV AX, DI ООН 48 DEC AX ООП 48 DEC AX ; Группа битов XX 0012 D0E0 SHL AL,1 0015 D0E0 SHL AL,1 Перемещение битов XX на соответствующие ;позиции 0017 0С26 OR AL,00100110B ^Формирование байта сегментного префикса 0019 8AD0 MOV DL,AL 001В 58 POP AX ;Восстановление исходного содержимого АХ 001С СЗ RET 001D TABLE DB 'ES','CS','SS', 'DS' 0025 ENCODE ENDP Рис. 9.6. Процедура формирования байта сегментного префикса*
K> SS (стековый сегмент) 11 _ , < В языке ассемблера название регистра сегмента,. определяющее соответствующий сегментный префикс переназначения, указывается перед операндом-источ- ником или операндом-приемником и отделяется двое- точием. На рис. 9.5 приведено несколько примеров предложений на языке ассемблера, содержащих сег- ментные префиксы. На рис. 9.6 представлена про- цедура перевода мнемонических обозначений сегмент- ных префиксов в соответствующие машинные коды. Предполагается что регистр АХ содержит имя сег- ментного префикса в коде ASCII. Процедура форми- рует байт префикса и помещает его в регистр DL. Для выполнения перевода использованы команды сдвига.
ОГЛАВЛЕНИЕ Предисловие к русскому изданию......................... 5 Предисловие ........................................ . 7 Глава I ОБЩИЕ ПРИНЦИПЫ ПОСТРОЕНИЯ МИКРО-ЭВМ Аппаратная часть .................................... 10 Программное обеспечение компьютера...................18 Представление информации в микро-ЭВМ...................26 Персональная микро-ЭВМ фирмы IBM.....................37 Глава II МИКРОПРОЦЕССОР Intel 8088 Машинный язык...........................................47 Архитектура процессора .................................48 Организация памяти и адресации .........................64 Режимы адресации........................................69 Работа со стековой памятью . ...........................80 Прерывания работы микропроцессора.......................86 Глава III ЯЗЫК АССЕМБЛЕРА МИКРОПРОЦЕССОРА 8088 Почему необходим язык ассемблера?.....................'98 Формат программы .....................................100 Распространенные ошибки программирования на языке ас- семблера ...........................................120 Макрокоманды..........................................126 Глава IV СИСТЕМА КОМАНД AAA-коррекция кода ASCII при сложении...............128 AAD-коррекция кода ASCII при делении..........131 ААМ-коррекция кода ASCII при умножении.........133 AAS-коррекция кода ASCII при вычитании............... 134 ADC-сложение с переносом............................135 ADD-сложение....................................... • 137 AND-логическое умножение ....................139 CALL-вызов процедуры................................141 353
CBW-преобразование байта в слово.........................144 CLC-сброс флага переноса ................................145 CLD-сброс флага направления . . ........................,145 CLI-сброс флага прерываний.................... ... 146 СМС-инверсия флага переноса..............................147 CMP-сравнение операндов . ...............................148 CMPS-сравнение строк . ................................ 149 CWD-преобразование слова в двойное слово.................151 DAA-десятичная коррекция при сложении....................152 DAS-десятичная коррекция при вычитании...................153 DIV-деление *........................................ 155 ESC-выдача...............................................157 HLT-останов . ...........................................I58 IDIV-целочисленное деление............................. 159 IMUL-целочисленное умножение.............................151 IN-ввод из порта..........................*..............153 INC-инкремент........................................... 164 INT-программное прерывание...............................165 INTO-прерывание по переполнению .......... 167 IRET-возврат из прерывания ..............................158 JA/JNBE-переход, если больше/переход, если не меньше или равно............................................. 159 JAE/JNB/JNC-переход, если больше или равно/переход, если не меныпе/переход, если нет переноса...................ПО JB/JNAE/JC-переход, если меныпе/переход, если не больше или равно/переход, если есть перенос..................171 JBE/JNA-переход, если меньше или равно/переход, если не больше.............................................. 173 JCXZ-переход, если содержимое регистра СХ равно нулю 174 JE/JZ-переход, если равно/переход по нулю................175 JG/JNLE-переход, если больше чем/переход, если не мень- ше чем или равно.................................... 176 JGE/JNL-переход, если больше или равно/переход, если не ’ меньше чем.................. ........................ 177 JL/JNGE-переход, если меныпе/переход, если не больше или равно ................................................178 JLE/JNG-переход, если меньше или равно/переход, если больше................................................179 JMP-безусловный переход...............................181 JHE/JNZ-переход по неравенству/переход, если не нуль . . 183 JNO-переход, если нет переполнения............ ... 184 JNP/JPO-переход при отсутствии четности...............185 JNS-переход, если нет знака...........................186 JO-переход по переполнению............................187 JP/JPE-переход по четности ..............................188 JS-переход по знаку .....................................189 LAHF-загрузка регистра АН из регистра флагов . . . .190 LDS-загрузка указателя в регистр DS ........ 191 LEA-загрузка исполнительного адреса................. . 192 LES-загрузка указателя с использованием регистра ES 193 LOCK-захват шины . . . . .............................. 194 LODS-загрузка строки . 195 | LOOP-цикл . ......................... . .............196 LOOPE/LOOPZ-цикл если равно/цикл если нуль . . . . . 19? LOGPNE/LOOPNZ-цикл если не равно/цикл если не яуль Г99
200 MOV-пересылка .................. MOVS-пересылка строки ......................... MUL-умножение ................................. NEG-отрицание ................................ NOP-отсутствие операции ....................... NOT-логическое отрицание ........... . . OR-логическое ИЛИ ................... OUT-вывод в порт ....... . .................... PUSHF-запись в стек содержимого регистра флагов . . POPF-чтение из стека содержимого регистра флагов . . . PUSH-запись в стек..................... POP-чтение из стека ........................... 202 204 200 206 207 206 210 211 212 213 215 RCL-циклический сдвиг влево через перенос ...... 216 RCR-циклический сдвиг вправо через перенос..............218 REP/REPE/REPZ-повторение/повторение если равно/повто- рение если нуль................................... 21» RET-возврат из процедуры.............................. 220 ROL-циклический сдвиг влево........................... 222. ROR-циклический сдвиг вправо.......................... 223 REPNE/REPNZ-повторение если равно/повторение если нуль 225 SAHF-запись содержимого регистра АН в регистр флагов 226 SAL/SHL-арифметический сдвиг влево/логический сдвиг влево 227 SAR-арифметический сдвиг вправо .......... 228 SBB-вычитание с заемом..................................230 SCAS-сканирование строк ................................232 SHR-логический сдвиг вправо ............................234 STC-установить флаг переноса............................235 STD.-установить флаг направления.................... . 236 STI-установить флаг прерывания.......................236 STOS-запомнить строку................................. 237 SUB-вычитание........................................238 TEST-тест............................................240 WAIT-ожидание .........................*................242 XCHG-замена ............................................243 XLAT-передача из таблицы............................. . 244 XOR-исключающее ИЛИ.....................................245 Глава V АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ НАД ЦЕЛЫМИ ЧИСЛАМИ Арифметические команды............................. 248 Арифметические операции с 32-разрядными числами . . . 252 Генерация псевдослучайных чисел......................262 Перевод чисел из шестнадцатеричного представления в де- сятичное ............................... . . . . . 269 Глава VI ЛОГИЧЕСКИЕ ОПЕРАЦИИ Стандартные операции.............................. 272 Логические команды ...................................273 Преобразования разрядов операндов................. 275 Буквенные преобразования . . .. . * . . ,. . . . . . 276 Засекречивание и восстановление данных . • • • . - * 283, 355
Глава VII ПЕРЕСЫЛКА ДАННЫХ Команды пересылки данных..............................295 Перемещение данных. в перекрывающихся последовательно- стях-строках ........................................ 297 Взаимные преобразования кодов ASCII и EBCDIC * . . 299 Поиск последовательности знаков . . . ..............302 Преобразования дважды связанных списков............303 Глава VIII . ПЕРЕДАЧА УПРАВЛЕНИЯ Команды переходов.....................................313 Цикл..................................................316 Структура процедуры...................................319 «Пузырьковая» сортировка..............................323 Перевод .алгебраического выражения в обратную польскую запись ........................ л ................325 Рекурсивное программирование .........................333 Глава IX ЦИКЛИЧЕСКИЙ И ЛИНЕЙНЫЙ СДВИГ Команды циклического сдвига ........................ 343 Команды линейного сдвига . . . ... . .................345 Декодирование машинных команд.........................347 Применение префикса переназначения сегмента ...... 349
УВАЖАЕМЫЙ ЧИТАТЕЛЬ! Ваши замечания о содержании книги, ее оформлении, качестве перевода и дру- гие просим присылать по адресу: 129820, Москва, И-110, ГСП, 1-й Рижский пер., д. 2, изд-во «Мир».
Учебное издание Ленни Дао ПРОГРАММИРОВАНИЕ МИКРОПРОЦЕССОРА 8088 Зам. зав. редакцией Э. Н. Вадиков Старший научный редактор Т. П. Сапожкова Младший научи, редактор Н. И. Сивилева Художник В. И. Шаповалов Художественный редактор Н. М. Иванов Технический редактор И. И. Володина Корректор В. И. Киселева ИВ № 6403 Сдано в набор 08.09.87. Подписано к печати 23.06.88. Формат 84ХЮ87з2. Бумага кн.-журн. Печать высо- кая. Гарнитура литературная. Объем 5 ./53 бум. л. Усл. печ. л. 18,9. Усл. кр.-отт. 18,9. Уч. Изд. л. 18,49. Изд. Я» 6/5508. Тираж 50000 экз. Зак. № 753. Цена 1 р. 90 к. ИЗДАТЕЛЬСТВО <МИР» В/О «Совэкспорткнига» Государственного комитета СССР по делам издательств, полиграфии и книж- ной торговли 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2 Ленинградская типография № 2 головное пред- приятие ордена Трудового Красного Знамени Ле- нинградского объединения «^Техническая книга» им. Евгении Соколовой Союзполиграфпрома при Государственном комитете СССР по делам изда- тельств, полиграфии и книжной торговли. 198052, г. Ленинград, Л-52, Измайловский проспект, 29,
В 1987 г. в издательстве “Мир“ вышли в свет следующие книги: Прицкер А. ВВЕДЕНИЕ В ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ И ЯЗЫК СЛАМ II: Пер. с англ. — М.: Мир. 1987. Книга известного американского ученого посвяще- на методологии имитационного моделирования и функциональным возможностям имитационного языка СЛАМ II. Рассмотрены вопросы построения сетевых и дискретно-событийных имитационных моделей на языке СЛАМ II и проведено сравнение функциональ- ных возможностей языка СЛАМ II и ряда наиболее распространенных имитационных языков. Для специалистов в области имитационного моде- лирования сложных систем различных классов, а так- же студентов старших курсов вузов и аспирантов со- ответствующих специальностей.
Органик Э. ОРГАНИЗАЦИЯ СИСТЕМЫ ИН- 1ТЕЛ 432: Пер. с англ. —М.: Мир, 1987. В книге американского специалиста рассматрива- ется новая вычислительная система Интел 432, по- строенная на базе 32-разрядного микропроцессора и представляющая собой выдающееся достижение ми- кроэлектроники и вычислительной техники. Имея ма- лые габариты, она обладает высокой производитель- ностью и широкими функциональными возможностями современных больших ЭВМ. Приводится реализация структур языка Ада в системе Интел 432. Для специалистов, работающих в области вычис- лительной техники.
(, ISBN 0 8306-0888-5 (СШ^А)