Глава 8. Выбор, тестирование и подключение ПК к электросети
Важнейшим вопросом, возникающим при приобретении и установке компьютера, является вопрос о правильном его выборе. Важность правильного выбора обусловлена тем, что:
● номенклатура выпускаемых ПК очень велика;
● характеристики компьютеров существенно отличаются друг от друга;
● стоимость компьютеров достаточно высока.
Следует разобраться с многочисленными рекламными сообщениями об имеющейся в продаже вычислительной технике. Это не так просто, поскольку в этих сообщениях часто используются нестандартные сокращенные обозначения параметров ПК, понятные зачастую лишь самому подателю объявления. Рассмотрим и расшифруем одно рекламное объявление о продаже компьютера, содержащее общепринятые обозначения:
CPU: Pentium II Celeron 500 А, Socket-370. 128К cashe;
М8: Chaintech 6BJM. 1440BX, Socket-370, ATX. '4 DIMM, AGP. 5 PCI. 2 ISA. Flash BIOS; RAM: 01ММ, 64 МЬ. SDRAM. РС100, 6-8 ns;
HDD: 10,2 Gb, Seagate. UDMA/66, 2048 Cashe; FDD: 1,44, 3,5";
Video: 15", CTX PR500T, 0,25, Trinitron, 1024x768/85 Hz, ТСО'99; SVGA, Matrox, 16МЬ, AGP;
CD-ROM: 40х. Acer, ООМА:
SC: Creative Labs SB. PCI. 128.
Указанный в объявлении компьютер среднего класса имеет:
● CPU: микропроцессор фирмы Intel Celeron А с кэш-памятью 1 уровня 128 Кбайт, работающий на тактовой частоте 500 МГц, с разъемом Socket-370;
● MB: системную (материнскую) плату 6BJM фирмы Chaintech формата АТХ с чипсетом i440BX и разъемом Socket-370; на плате также установлены: 4 слота для микромодулей DIMM оперативной памяти, разъемы для интерфейсных шин: 2 разъема системной шины ISA, 5 разъемов локальной шины PCI и разъем ускоренного графического порта AGP, на плате установлена микросхема BIOS типа Flash;
● RAM: оперативную память типа SDRAM емкостью 64 Кбайт на микромодулях DIMM, работающую на частоте 100 МГц и имеющую время обращения 6 — 8 не;
● HDD: накопитель на жестких магнитных дисках (винчестер) фирмы Seagate емкостью 10,2 Гбайт с внутренней кэш-памятью Ш уровня емкостью 2048 Кбайт и контроллером прямого доступа к оперативной памяти ультра-DMA, обеспечивающим скорость передачи данных 66,6 Мбайт/с;
● FDD: дисковод для гибких магнитных дисков емкостью 1,44 Мбайт с форм- фактором 3,5 дюйма;
● Video: видеоподсистему включающую в себя:
● электронно-лучевой монитор (дисплей) CTX PR500T профессионального класса фирмы СТХ на трубке с плоским экраном Trinitron, с размером диагонали трубки 15 дюймов и зерном 0,25 мм, работающей при разрешении 1024 х 768 пикселов с частотой кадровой развертки 85 Гц, монитор удовлетворяет международному стандарту защиты от излучений ТСО 99; видеоадаптер (видеокарту) SVGA фирмы Matrox с внутренней памятью 16 Мбайт и ускоренным графическим портом AGP;
● CD-ROM: дисковод для компакт-дисков фирмы Acer, работающий с коэффициентом кратности по скорости до 40х и контроллером прямого доступа к оперативной памяти ультра-DMA;
● SC: звуковую карту SB (Sound Blaster) фирмы Creative Labs с поддержкой голосов 128 музыкальных инструментов, подключаем к шине PCI.
При выборе ПК следует знать, что рейтинг основных характеристик компьютера по данным зарубежных пользователей определяется следующими параметрами (перечислены в порядке убывания их значимости): надежность, разрядность, производительность (тактовая частота), емкость основной памяти, емкость жесткого диска, вид принтера, вид операционной системы, совместимость с другими компьютерами, режимы работы, поддержка сети, габариты. Некоторые из этих параметров, в частности стоящий на первом месте параметр надежности, ни в рекламных сообщениях, ни в паспорте ПК обычно не указываются.
Очень важно правильно оценить конфигурацию компьютера:
● тип основного микропроцессора и материнской платы;
● объем и быстродействие основной и внешней памяти;
● номенклатуру устройств внешней памяти;
● виды системного и локального интерфейсов;
● тип видеоадаптера и видеомонитора;
● типы клавиатуры, принтера, мыши, модема и т. д.
Важнейшей характеристикой является производительность компьютера.
Основные факторы повышения производительности ПК в общем случае выглядят следующим образом.
1. Увеличение тактовой частоты.
2. Увеличение разрядности МП.
3. Увеличение внутренней частоты МП.
4. Конвейеризация выполнения операций в МП и наличие кэш-памяти команд.
5. Увеличение количества регистров МПП.
6. Наличие и объем кэш-памяти.
7. Возможность организации виртуальной памяти.
8. Наличие математического сопроцессора.
9. Пропускная способность системной шины и локальной шины.
10. Объем ОЗУ и его быстродействие.
11. Быстродействие НМД.
12. Пропускная способность локального дискового интерфейса.
13. Организация кэширования дисковой памяти.
14. Объем памяти видеоадаптера и его пропускная способность.
15. Пропускная способность мультикарты, содержащей адаптеры дисковых интерфейсов и поддерживающей последовательные и параллельные порты для подключения принтера, мыши и т. д.
Следует иметь в виду, например, что увеличение оперативной памяти в 2 раза повышает производительность ПК примерно на 75%, а наличие кэш-памяти емкостью 256 Кбайт — на 20%. Важно знать, что производительность современного, ПК зависит не только от тактовой частоты, характеристик МП, ОП, НМД и видеосистемы, но и существенно — от интерфейса.
Весьма сложно в наше неспокойное время дать действенные советы по приобретению компьютера. Поколения микропроцессоров и других компьютерных компонентов меняются каждые 1,5 — 2 года. Производители компьютеров обещают, что пройдет совсем немного времени — и новая техника будет работать в два, а то и в три раза лучше, а стоить при этом она будет столько же или даже меньше. Но не успело появиться новое оборудование в продаже, а производители объявляют о расширенных возможностях проходящей испытания суперновой техники. И она на самом деле появляется.
Как же разобраться в такой кутерьме, да так, чтобы не остаться через несколь лет у разбитого корыта? Вот некоторые полезные советы.
Условно все компьютеры можно разделить на две группы:
● ПК группы brand name, собранные фирмами-производителями основных блоков компьютера (IBM, Compaq и т. д.);
● ПК группы по паше — прочие компьютеры, сборку которых осуществляли из комплектующих не фирмы-производители.
Компьютеры brand паше должны иметь товарные знаки, указывающие на изготовителя ПК, производителей его комплектующих, торгующую фирму (товарный знак дилера). Наличие товарного знака, помимо всего прочего, определяет перечень услуг, качество обслуживания и другие сервисные факторы, существенные для покупателя.
Компьютеры brand паше должны быть сертифицированы (certum — верно, facere— делать: «сделано верное), что свидетельствует о качестве ПК. Сертификация имеет много видов и аспектов и соответствующую символику. Важны сертификаты соответствия по совместимости, качеству, безопасности, энергосбережению, внешнему излучению и т. п.
ПК brand паше очень дороги, тем более имеющие многочисленные сертификаты. Поэтому часто приходится ограничиться выбором компьютера среди «прочих».
Выбор микропроцессора. Микропроцессоры быстро совершенствуются, изменяются и устаревают. Популярные еще несколько лет назад МП 80486 сейчас уже практически непригодны для серьезных прикладных программ: многие новые программные продукты и периферийные устройства несовместимы с этим МП. По всей видимости, участь МП Pentium через несколько лет будет аналогична. Поэтому желательно приобретать перспективный МП, невзирая на его более высокую стоимость, то есть выбирать МП Pentium Ш или Pentium 4 (или того же типа).
Системный интерфейс ISA существенно устарел; локальный интерфейс PCI в роли шины расширения совместно с интерфейсом AGP — приемлемый вариант. Подобное же можно сказать и относительно выбора дискового интерфейса: IDE (АТА) сегодня устарел, но EIDE (АТА 2) совместно с ATAPI вполне может удовлетворить средние потребности, и SCSI выбирать вовсе не обязательно (очень дорого). Желательно иметь периферийный интерфейс USB — интерфейс IEEE 1394 пока не предмет первой необходимости.
Общем основной памяти не менее 64 Мбайт, а лучше 128 и более, поскольку многие прикладные программы с меньшими объемами ОП просто не работают либо работают очень медленно. Сегодня наиболее популярна оперативная память типа SDRAM (РС100, РС133), но для системной платы с микропроцессором Pentium 4 следует выбрать память DDR SDRAM или DRDRAM. Номенклатура устройств внешней памяти:
● жесткий диск — необходим обязательно;
● НГМД — с форм-фактором 3,5 дюйма;
● для локального (не в сети) компьютера необходим и CD-ROM, так какие говоря уже о мультимедийных приложениях, он поможет существенно сэкономить на емкости жесткого диска, тем более что большинство новых программных продуктов выпускаются на CD. Для хорошего мультимедийного ПК полезен DVD-ROM.
● Желательно приобрести модем, что даст возможность приобщиться к системе телекоммуникаций, а это сегодня уже весьма полезно.
Модем следует выбирать высокоскоростной (56 Кбит в секунду), это позволит существенно выиграть на оплате за аренду канала связи (передача по факсу 1 Мбайт данных потребует около 20 часов при скорости 300 бит/с и всего 4 минуты при скорости 56 Кбит/с), тем более что популярные модемы Genius и U.S. Robotics Sportster недороги.
Объем дисковой памяти 10 Гбайт сегодня еще приемлем, но, по прогнозам специалистов, многие программные продукты будут требовать для работы 128 Мбайт оперативной и несколько гигабайтов внешней памяти. Кроме того, расход внешней памяти, вызванный текущим накоплением программных продуктов и данных на жестком диске, составляет в среднем 500 Мбайт ежегодно. Следовательно, покупать нужно жесткий диск емкостью не менее 40 — 60 Гбайт.
При выборе жесткого диска следует обратить внимание на время доступа к информации, которое должно быть порядка 5 — 7 мс. Трансфер (скорость передачи данных) жесткого диска должен быть в пределах 1500 — 3000 Кбайт/с. При трансфере меньше 1500 Кбайт/с будет существенно снижаться эффективное быстродействие всего ПК. Следует также обратить внимание на наличие у дисковода внутренней кэш-памяти, заметно улучшающей показатели времени доступа и трансфера.
Очень важно правильно выбрать видеомонитор, и не только потому, что его' " стоимость весьма велика и достигает 30% цены всего компьютера, но и потому, что от монитора зависит комфортность работы и здоровье пользователя.
Монитор должен иметь четкое и ясное изображение, иначе можно испортить; зрение. От чего зависит четкость? В первую очередь от размера зерна люминофора, от соответствия этого размера разрешающей способности видеосистемы, от цветности монитора. Монохромный (черно-белый) монитор для профессиональной работы предпочтительнее, так как он менее вреден для зрения, имеет более четкое изображение, да и значительно дешевле цветного. Величина зерна не должна быть больше 0,28 мм, требуемый размер диагонали экрана — не менее 15 дюймов.
Мониторы с частотой кадровой развертки менее 70 Гц и с чересстрочной разверткой нежелательны, так как мерцание экрана пагубно отражается на зрении. Визуально следует проверить четкость фокусировки, а у цветного монитора и сводимость лучей (попадание лучей всех трех цветов в одну точку). Для обеспечения хорошей разрешающей способности монитор должен работать с видео адаптером SVGA, имеющим видеопамять не менее 16 Мбайт. Экран у монитора желательно иметь плоский, антибликовый, с антистатическим покрытием (типа AS — AntiStatic), с низким уровнем излучения (тип LR — Low Radiation). Монитор должен удовлетворять одной из спецификаций ТСО.
Итак, при выборе CRT-видеомонитора (дисплея) нужно учесть следующие факторы: цветность, тип монитора (аналоговый или цифровой), параметры экрана, размер зерна экрана, разрешающую способность, частоту кадровой развертки, тип строчной развертки, объем памяти видеоадаптера, уровень радиации.
В последние годы все большую популярность приобретают плоские мониторы: они компактнее, безопаснее для здоровья, а стоимость их неуклонно падает, приближаясь к стоимости CRT-мониторов.
Лучшие современные плоские мониторы имеют диагональ 17 дюймов и больше, яркость 350 кд/м (кд — кандела, свеча), контрастность 400:1, угол обзора 140 — 170', разрешение 1280 х 1024 пикселов, толщину 5 — 10 см, вес до 3 кг и потребляют менее 30 Вт электроэнергии (в ждущем режиме 3 Вт). Отметим некоторые особенности выбора плоских мониторов.
● плоские мониторы бывают только цифровыми;
● из-за идеальной прямоугольности и плоскости реальный размер их экрана при той же диагонали несколько больше, чем у CRT-мониторов;
● частота обновления изображения у них из-за послесвечения практически не зависит от частоты кадровой развертки, генерируемой видеокартой, и вполне достаточной является величина 60 — 70 Гц;
● разрешающая способность плоского монитора является постоянной и также не зависит от видеокарты.
При выборе плоского монитора следует в первую очередь оценить: с) яркость и видимый контраст изображения;
● цветовой баланс и приятность изображения;
● комфортные углы обзора экрана;
● инерционность картинки на экране;
● элементы дизайна монитора.
Прежде всего нужно решить, какой принтер вам нужен: черно-белый или цветной, с широкой (для печати развернутого листа) или узкой кареткой. При выборе типа принтера следует иметь в виду, что наилучшее качество печати, разрешающую способность (20 — 30 точек/мм) и скорость печати (до 1000 знаков/с) имеют лазерные принтер
ы; но они очень дорогие. Струйные принтеры, в среднем и по качеству печати, и по стоимости занимают промежуточное положение. Матричные принтеры похуже, но, выбрав 24-игольчатый вариант, можно иметь вполне качественное устройство (разрешающая способность до 10 точек/мм, скорость печати до 300 знаков/с).
Принтеры имеют внутреннюю оперативную память, используемую как буфер при обмене данными с ПК и для хранения загружаемых шрифтов. У матричных принтеров объем памяти небольшой — несколько десятков килобайтов, а у лазерных принтеров — до нескольких мегабайтов. Принтеры при печати используют разные типы шрифтов (от 3 до 15 типов). Шрифты в принтерах могут храниться во внутренних ПЗУ (резидентные шрифты) находиться во внешних, подключаемых с помощью специальных разъемов, кассетах (загружаемые аппаратно шрифты) помещаться в буферную память принтера с помощью специальных драйверов (программно загружаемые шрифты). Удобнее, конечно, резидентные шрифты, и, в частности, важно, чтобы был резидентным шрифт кириллицы (в последнем случае принтер считается русифицированным).
Нужно рассмотреть и оценить стоимость (и дефицитность) необходимых расходных материалов: бумаги — обычной, качественной или специальной термореагентной; картриджей с красящей лентой (у матричных принтеров), со специальными чернилами (у струйных принтеров), с красящим порошком (у лазерных принтеров). Самые дорогие расходные материалы нужны для струйных принтеров. Важны и сервисные возможности принтера: автоподача бумаги, наличие лотков для приема листов, возможность работы с листовой и рулонной бумагой и т. д.
Итак, при выборе принтера нужно учесть: цветность, тип принтера (матричный, струйный, лазерный и т. п.), количество игл или сопел, ширину печати, разрешающую способность, скорость печати, русификацию, количество и удобство смены шрифтов, емкость памяти, интерфейс, расходные материалы (в том числе тип и качество используемой бумаги), сервисные возможности.
При покупке компьютера не следует полностью доверяться устной информации о характеристиках ПК, полученной от продавца. Более надежную информацию о компьютере можно получить, проведя его частичное или полное тестирование.
Тестирование компьютера и его основных устройств
Тестовые программы используются для идентификации конфигурации компьютера, его системных ресурсов, а также для его диагностики и оценки его относительной производительности. Тестовые программы можно разделить на две группы:
● специализированные продукты, ориентированные на анализ какой-либо од-
ной подсистемы компьютера. Например, широко используются программы для оценки производительности процессоров, жестких дисков; существуют программы, тестирующие работу оперативной памяти, видеоконтроллеров, звуковых карт и т. д.;
● универсальные программы, позволяющие выполнять комплексный анализ всех подсистем компьютера.
Несмотря на распространенность специализированных программ, наибольшую популярность в качестве тестов получили средства, позволяющие выполнять комплексный анализ подсистем компьютеров. Самыми известными из программ, используемых для тестирования аппаратных средств компьютеров, работающих под управлением систем DOS и Windows З.хх, являются: SysInfo, CheckIt, PC-CONFIG. Для операционных систем типа Windows 9х это могут быть такие тестовые программы, как WinCheckIt, WinBench, WinStone и т. п. Указанные программы помогают провести комплексный анализ работы как отдельных устройств, входящих в состав системы компьютера, так и их совместного функционирования.
В операционную систему DOS входит утилита Microsoft Diagnostics (MSD.ЕХЕ). С ее помощью можно определить ряд несложных неисправностей аппаратуры и/или неправильного конфигурирования системных файлов. Эту программу полезно хранить на системном гибком диске. Часто используются для этой цели и такие программные продукты, как Norton Diagnostic (из пакета Norton Utilities) фирмы Symantec, различные версии пакета CheckIt (Pro, Deluxe) фирмы Touch- Stone; подробнейшую информацию о компьютере можно почерпнуть из программы Sandra, ASTRA и др.
CheckIt позволяет определить системную конфигурацию ПК, протестировать основные его компоненты и оценить производительность отдельных подсистем. Среди возможностей программы CheckIt можно отметить:
● просмотр содержимого первого мегабайта адресуемой памяти;
● проверку назначения номеров прерываний и каналов прямого доступа к памяти;
● контроль содержимого памяти СМОК;
● получение полного списка драйверов DOS, установленных в системе.
В программе имеются тесты всех типов памяти (стандартной, расширенной и дополнительной), компонентов системной платы (процессора, сопроцессора, контроллеров), часов реального времени, последовательных и параллельных портов, принтеров. Для жесткого диска применяются также операции неразрушающего контроля, проверяющие каждую физическую дорожку. При контроле видеоподсистемы отдельно тестируются текстовые и графические режимы, а также видео память. Программа предусматривает интерактивный контроль устройств ввода: клавиатуры, мыши. Могут быть выполнены: идентификация модемов, сетевых плат, приводов CD-ROM, тестирование приводов гибких дисков, редактирование CMOS RAM. Наконец, можно получить оценки производительности для системной платы, жесткого диска (время доступа и скорость передачи), видео- подсистемы (скорость обмена).
Но, пожалуй, наиболее популярной является программа SysInfo, выполняющая тестирование и мониторинг всех основных подсистем компьютера. Утилита SysInfo (System Information) входит в пакете Norton Utilities (NU, ч. 7.0), предоставляет информацию о системной конфигурации компьютера, его основных компонентах и их характеристиках, информацию из CMOS-памяти, сведения о резидентных программах DOS и драйверах устройств, сводку задействованных аппаратных и программных прерываний и вектор-адреса программ их обработки. Утилита также позволяет оценить сравнительную (относительно выбранных типовых моделей ПК) производительность компьютера в целом и отдельных его подсистем.
Ниже кратко рассмотрим возможности тестирования и определения основных параметров компьютера, предоставляемые более новой утилитой System Information из пакета Norton Utilities 2002. При работе программы на дисплее в диалоговом режиме отображаются информационные вкладки, содержащие интересующую пользователя информацию.
Каждый экран имеет:
● верхнее меню для интерактивного произвольного доступа к любому информационному разделу в утилите;
● картинку, схематично воспроизводящую тестируемый компонент и/или его характеристики;
● основную часть — информационный бокс раздела с информацией (часто содержит пункты меню, которые могут быть раскрыты щелчком кнопки мыши для получения конкретной информации);
● нижнее меню для более детального отображения информации и регистрации кадров на принтере или в файле.
Верхнее меню содержит следующие разделы (вкладки):
● System (Система) — содержит подменю с командами для отображения общих сведений о компьютере в целом и основных его внешних устройствах;
● Display (Видеосистема) — показывает модели подключенных к компьютеру дисплея и видеокарты и основные характеристики дисплея;
● Printer (Принтер) — показывает модель принтера, вариант его подключения и основные параметры его функционирования;
● Memory (Память) — содержит подменю с командами для выдачи информации об оперативной памяти компьютера и ее логическом распределении;
● Drive (Дисковая память) — приводится подробная информация о дисковой памяти компьютера, содержащая основные сведения о физических и логических дисках компьютера;
● Input (Устройства ввода) — содержит сведения о клавиатуре и манипуляторе мышь, подключенных к компьютеру;
● Multimedia (Средства мультимедиа) — показывает подключенные к компьютеру мультимедийные компоненты и их основные характеристики;
● Network (Сетевое окружение) — содержит информацию о сетевых подключениях компьютера.
Рассмотрим кратко основные кадры утилиты и наиболее полезную информацию, в них содержащуюся.
Получение общей информации о компьютере
Первый кадр, появляющийся при запуске системы, содержит раздел System (Общая информация о системе) (рис. 8.1).
В информационном боксе кадра содержится информация:
● Hardware — об аппаратной конфигурации компьютера, в частности:
● Processor — тип центрального процессора, установленного в компьютере;
● Math Support — тип математического сопроцессора, если он представлен отдельной микросхемой, либо указание на то, что он встроен в центральный микропроцессор (On Chip) или отсутствует вовсе (none);
● clos — название и дата выпуска базовой системы ввода-вывода (BIOS), находящейся в ПЗУ и обеспечивающей взаимодействие операционной системы с компьютером;
● eus Туре — перечень интерфейсных шин, используемых в компьютере;
● Ports — количество имеющихся параллельных и последовательных портов;
● Memory — емкость основной памяти и ее занятость;
● Floppy Disks — емкость НГМД, имеющихся в ПК;
● Hard Disks — емкость подключенных к компьютеру жестких дисков;
● Multimedia — наличие и тип мультимедийных компонентов;
● Video — тип видеокарты и установленные режимы разрешения и цветности монитора;
● Operating System — информация об операционной системе, в частности:
● Windows — версия OC Windows; О DOS — версия ОС DOS;
● Net Clients — сетевые клиенты.
При нажатии кнопки Details можно извлечь много дополнительной информации,
например: положение каталогов Windows и SysInfo, количество процессоров в ПК, размер и атрибуты кэш-памяти 1-го и 2-ro уровней, поддерживаемые режимы процедур, разрядность, сведения об ММХ-технологии и т. д.
Получение, информации о видеосистеме
Перейти к вкладке Display (Дисплей) можно, нажав одноименную кнопку на верхнем меню.
Под изображением дисплея и в информационном боксе кадра (рис. 8.2) содержится разнообразная информация, в частности, указаны модели и типы дисплея и видеокарты, характеристики дисплея: размер экрана по горизонтали и верти- кали (в миллиметрах), максимальное и установленное горизонтальное и вертикальное разрешения экрана дисплея в пикселах, цветовой стандарт, разрядность цветоуказания и количество отображаемых цветовых оттенков и т. д.
Получение информации о принтере
Под изображением принтера и в информационном кадре (рис. 8.3) приводятся: название модели принтера и его тип, порт подключения, формат стандартного бумажного листа (размеры по горизонтали и вертикали в миллиметрах и в пикселах), разрешающая способность по горизонтали и вертикали в пикселах/дюйм, параметры цветопередачи и поддерживаемых цветовых шрифтов, а также другие характеристики.
Получение информации об основной и виртуальной памяти
Вкладка Memory (Память) обеспечивает отображение информации о наличии и использовании основной и виртуальной памяти ПК (рис. 8.4). Непосредственно под рисунком приводятся сведения об объемах и занятости основной и виртуальной памяти,
В исходном информационном боксе кадра дан список загруженных в память программ (в том числе и драйверов, а при установке флажка Display Libraries— u подключенных библиотек) указаны их типы и размеры.
При нажатии кнопки Details выводится та же информация о программах, драйверах и библиотеках, подключенных к системе, а также атрибуты основных физических и логических компонентов памяти.
Получение сведений о дисковой памяти
На вкладке Drive (рис. 8.5) приводится подробная информация о дисковой памяти компьютера, содержащая основные сведения о физических и логических дисках компьютера.
В информационном поле отображается полное иерархическое дерево дисковой памяти. Тип накопителя можно выбрать из раскрывающегося списка: это FDD, HDD и его логический диск, CD.
Непосредственно под рисунком указываются полный, свободный и занятый объемы выбранного в информационной секции типа памяти, а также размер выделенного в каталоге компонента.
При нажатии кнопки Details для выбранного накопителя выводятся:
● информация о типе, атрибутах и размещении файловой системы (FAT 32, 16 или 12);
● физическая структура диска (число цилиндров, количество секторов и дорожек, количество головок);
● логическая структура диска (количество секторов в кластере размер сектора, полное и свободное количество кластеров, полное и свободное количество байтов);
● другая информация.
Получение информации о клавиатуре и манипуляторе мышь
На вкладке Input (рис. 8.6) приводится краткая информация о клавиатуре и графическом манипуляторе мышь.
Получение информации о мультимедийных компонентах компьютера
На вкладке Multimedia (рис. 8.7) приводятся сведения о мультимедийных компонентах компьютера.
Непосредственно под рисунком приводятся названия мультимедийных групп и указывается количество основных компонентов, в них содержащихся.
В информационном боксе кадра можно посмотреть перечень этих компонентов по группам и их основные параметры: атрибуты CD-ROM, звуковой карты SB, FM- и WT-синтезаторов, голосового модема, наличие аппаратного порта MIDI и т. д.
Получение сведений о сетевом окружении компьютера
На вкладке (рис. 8.8) приводятся сведения о сетевом окружении компьютера, в частности об атрибутах входа в сеть Microsoft Network и Семейного входа в систему.
Нажав кнопку Reports, всегда можно получить отчет о параметрах компьютера — в виде файла или в отпечатанном виде. При формировании отчета из появляющегося меню можно выбрать:
● нужные режимы тестирования;
● степень подробности отображения параметров компьютера, от краткого до самого детального, включающего в себя информацию, показываемую при нажатии кнопки Details, и перечень всех файлов, имеющихся в памяти компьютера (в последнем случае, правда, отчет может занимать более i000 страниц текста).
К сожалению, программа System Information 2002, в отличие от SysInfo v. 7.0, не позволяет показать сравнительную (относительно выбранных типовых моделей) производительность CPU, жесткого диска и компьютера в целом, а так- же информацию из CMOS-памяти, сводку задействованных аппаратных и программных прерываний и вектор-адреса программ их обработки, характеристики Expanded- и Extended-разделов основной памяти. Подробно возможности утилиты SysInfo v. 7.0 и особенности ее использования рассмотрены в работе [11|.
Для надежной и бесперебойной работы компьютера необходимо предусмотреть специальную систему его питания от электрической сети, защищающую компьютер от различных неожиданностей. А этими неожиданностями в первую очередь являются всевозможные отклонения параметров электроснабжения от стандарта.
С технической точки зрения это:
● пропадание напряжения (blackout) — даже в столь благополучной Европе компьютер испытывает в среднем около 20 полных пропаданий питающего напряжения в год, а что уж говорить о наших электросетях, тем более в сельской местности... Вероятно, все пользователи компьютеров испытывали моральное потрясение, когда в результате даже кратковременного отсутствия напряжения терялась информация в основной памяти, на формирование которой были потрачены часы рабочего времени;
● провал напряжения (brownout) — падение амплитуды напряжения ниже номинальной на очень короткое время, вызванное одновременным включением нескольких мощных потребителей электроэнергии;
● броски напряжения (strike) — кратковременное повышение напряжения, амплитуда которого может достигать нескольких тысяч вольт, вызываемое как статическими разрядами и ударами молний, так и переходными процессами в электросети при включении и выключении мощных потребителей электроэнергии;
● электромагнитные помехи (electromagnetic interference) —, отклонение формы напряжения от синусоидальной вследствие индуктивных или гальванических наводок от работы различного оборудования;
● отклонение частоты (frequency deviation) — вызывается нестабильностью частоты источника напряжения.
Все эти отклонения, за исключением полного пропадания напряжения, практически незаметны для человека, но могут нарушить работу компьютера. По некоторым оценкам, до половины необъяснимых неполадок в работе ПК (“зависания”, сбои при работе программ, ошибки при обращениях к памяти) возникают по причине некачественного электропитания.
Поэтому, хотя бы затем, чтобы уберечь себя от ненужных стрессов, целесообразно оградить компьютер от неблагоприятных воздействий питающей электросети.
Можно рекомендовать использование двух типов устройств электропитания компьютера:
● сетевых фильтров;
● источников бесперебойного питания.
Сетевые фильтры (например типа Pilot) предназначены для защиты цепей электропитания компьютеров и другой электронной аппаратуры от бросков напряжения и электромагнитных помех.
Источники бесперебойного питания (ИБП) осуществляют комплексную защиту компьютера от неприятностей электропитания. Они выполняют две основные функции:
● обеспечение резервного электропитания при полном пропадании или длительном ощутимом снижении (за пределы установленного диапазона) входного напряжения;
● обеспечение приемлемого качества напряжения питания путем ликвидации неблагоприятных возмущений входного напряжения.
Для реализации названных функций ИБП имеют, соответственно:
● аккумуляторную батарею с зарядным устройством;
● входной фильтр для ликвидации импульсных и электромагнитных возмущений.
ИБП выпускаются трех типов:
● резервные (offline) — простейшие ИБП, обеспечивающие лишь минимальную защиту;
● интерактивные (line interactive), отличающиеся от резервных наличием схемы стабилизации входного напряжения; предотвращающей, в частности, быстрый разряд аккумулятора при пониженном напряжении питания;
● инвертирующие (online) или с двойным преобразованием напряжения, обеспечивающие самую высокую степень защиты, но и относительно дорогие (примерно в 2 раза дороже резервных).
При выборе ИБП следует в первую очередь обратить внимание на:
● выходную мощность устройства — она должна быть примерно на 40% больше мощности, потребляемой всеми блоками компьютера;
● время автономной работы при отключенном питании;
● допустимый диапазон входных напряжений, при котором ИБП работает от сети.
Обычно ИБП весьма требовательны к качеству заземления; если при первом включении источник начинает попискивать, рекомендуется заранее позаботиться о том, чтобы «земля» и нейтральный провод электросети прокладывались отдельно.
Не рекомендуется включать в ИБП лазерные принтеры — во время разогрева лазерного принтера ток, потребляемый им, может превысить номинальное значение в 10 раз.
В 2002 году фирма Guardian on Board выпустила источник бесперебойного питания, конструктивно выполненный в виде PCI-карты Powercard 420VA, размещаемой внутри ПК.
Часть III. Программное управление
Глава 9. Программное управление — основа автоматизации вычислительного процесса
Решение задач на компьютере реализуется программным способом, то есть путем выполнения последовательно во времени отдельных операций над информацией, предусмотренных алгоритмом решения задачи.
Алгоритм — это точно определенная последовательность действий, которые необходимо выполнить над исходной информацией, чтобы получить решение задачи. Понятие алгоритма — одно из важнейших понятий математики, так как назначением математики и является разработка рациональных алгоритмов решения задач. Существует раздел математики — теория алгоритмов, занимающаяся разработкой методов и форм построения алгоритмов решения задач. Алгоритм решения задачи на вычислительной машине — это частный случай математического алгоритма.
Основными свойствами правильно построенного алгоритма являются:
● результативность — алгоритм должен давать конкретное конструктивное решение, а не указывать на возможность решения вообще;
● достоверность — алгоритм должен соответствовать сущности задачи и формировать верные, не допускающие неоднозначного толкования решения;
● реалистичность — возможность реализации алгоритма при заданных ограничениях: временных, программных, аппаратных;
● массовость — алгоритм должен быть воспроизводимым, пригодным для решения всех задач определенного класса на всем множестве допустимых значений исходных данных;
● детерминированность (определенность) — алгоритм должен содержать набор точных и понятных указаний, не допускающих неоднозначного толкования;
● дискретность — допустимость расчленения алгоритма на отдельные этапы с возможностью последовательной их реализации на машине;
● экономичность — алгоритм должен обеспечивать необходимую и достаточную точность решения задачи.
Алгоритм должен быть понятен (доступен) пользователю и/или машине. Доступность пользователю означает, что он обязан отображаться посредством конкретных формализованных изобразительных средств, понятных пользователю. В качестве таких изобразительных средств используются следующие способы их записи: словесный, формульный, табличный, операторный, графический, макроязык программирования:
● при словесном способе записи содержание последовательных этапов алгоритма описывается в произвольной форме на естественном языке;
● формальный способ основан на строго формализованном аналитическом задании необходимых для исполнения действий;
● табличный способ подразумевает отображение алгоритма в виде таблиц, использующих аппарат реляционного исчисления и алгебру логики для задания подлежащих исполнению взаимных связей между данными, содержащимися в таблице;
● операторный способ базируется на использовании для отображения алгоритма условного набора специальных операторов: арифметических, логических, печати, ввода данных и т. д.; операторы снабжаются индексами и между ними указываются необходимые переходы, а сами индексированные операторы описываются чаще всего в табличной форме;
● графическое отображение алгоритмов в виде блок-схем — самый распространенный способ. Графические символы, отображающие выполняемые процедуры, стандартизованы. Наряду с основными символами используются и вспомогательные, поясняющие процедуры и связи между ними;
● алгоритмы могут быть записаны и в виде команд какого-либо языка программирования. Если это макрокоманды, то алгоритм читаем и пользователем-программистом, и вычислительной машиной, имеющей транслятор с соответствующего: языка.
Языки, представляющие алгоритмы в виде последовательности читаемых программистом (не двоично-кодированных) команд, называются алгоритмическими языками. Алгоритмические языки подразделяются на машинно-ориентированные, процедурно-ориентированные и проблемно-ориентированные. Машинно-ориентированные языки относятся к языкам программирования низкого уровня — программирование на них наиболее трудоемко, но позволяет создавать оптимальные программы, максимально учитывающие функционально- структурные особенности конкретного компьютера. Программы на этих языках, при прочих равных условиях, будут более короткими и быстрыми. Кроме того, знание основ программирования на машинно-ориентированном языке позволяет специалисту подробнейшим образом разобраться с архитектурой компьютера.
Именно последнее в большей степени и обусловливает целесообразность ознакомления с машинно-ориентированным языком, каковым и является язык ассемблер, при изучении вычислительных систем. Большинство команд машинно- ориентированных языков при трансляции (переводе) на машинный (двоичный) язык генерируют одну машинную команду.
Процедурно-ориентированные и проблемно-ориентированные языки относятся к языкам высокого уровня, использующим макрокоманды. Макрокоманда при трансляции генерирует много машинных команд: для процедурно-ориентированной макрокоманды это соотношение в среднем «i к десяткам машинных команд», а для проблемно-ориентированной команды это «1 к сотням машинных команд». Процедурно-ориентированные языки программирования являются самыми используемыми (Basic, Pascal, С++, PL, А1 601, COBOL и еще десятки популярных языков). В этом случае программист должен описывать всю процедуру решения задачи, тогда как проблемно-ориентированные языки (их называют также непроцедурными) позволяют лишь формально идентифицировать проблему и указать состав, структуры представления и форматы входной и выходной информации для задачи.
Все языки программирования, и языки машинно-ориентированные, и языки высокого уровня, для их восприятия компьютером требуют наличия программ перевода — трансляторов на машинный язык.
Трансляторы бывают двух типов: трансляторы-компиляторы и трансляторы- интерпретаторы.
Компиляторы при трансляции переводят на машинный язык сразу всю программу и затем хранят ее в памяти машины в двоичных кодах. Интерпретаторы каждый раз при исполнении программы заново преобразуют в машинные коды каждую макрокоманду и передают ее для непосредственного выполнения компьютеру. В памяти интерпретируемые программы хранятся в виде исходных макрокоманд и поэтому в любой момент читаемы человеком.
Откомпилированные двоично-кодированные программы практически человеком не читаемы. Но их можно вызвать в специальную программу-отладчик (DEBUG и его разновидности), которая переведет эти программы на язык ассемблер, то есть сделает их «человекочитаемыми» (еще один довод в пользу изучения языка ассемблер).
Итак, алгоритм непосредственно воспринимается и исполняется компьютером, если он представлен в двоичном коде на машинном языке.
Алгоритм решения задачи, заданный в виде последовательности команд на языке вычислительной машины (в кодах машины), называется машинной программой. Команда машинной программы (иначе, машинная команда) — это элементарная инструкция машине, выполняемая ею автоматически без каких-либо дополнительных указаний и пояснений.
Машинная команда состоит из двух частей: операционной и адресной.
Операционная часть команды (КОП — код операции) — это группа разрядов в команде, предназначенная для представления кода операции машины. Адресная часть команды (Адреса) — это группа разрядов в команде, в которых записываются коды адреса (адресов) ячеек памяти машины, предназначенных для оперативного хранения информации, или иных объектов, задействованных при выполнении команды. Часто эти адреса называются адресами операндов, то есть чисел, участвующих в операции.
По количеству адресов (а1, а2, а3, ...), записываемых в команде, команды делятся на безадресные, одно-, двух- и трехадресные.
● Типовая структура трехадресной команды:
а2 и а3 — адреса ячеек (регистров), где расположены, соответственно, первое и второе числа, участвующие в операции, а1 — адрес ячейки (регистра), куда следует поместить число, полученное в результате выполнения операции.
● Типовая структура двухадресной команды:
а1 — это обычно адрес ячейки (регистра), где хранится первое из чисел, участвующих в операции, и куда после завершения операции должен быть записан результат операции; а2 — обычно адрес ячейки (регистра), где хранится второе участвующее в операции число.
● Типовая структура одноадресной команды:
где а1 в зависимости от модификации команды может обозначать либо адрес ячейки (регистра), в которой хранится одно из чисел, участвующих в операции, либо адрес ячейки (регистра), куда следует поместить число — результат операции. Безадресная команда содержит только код операции, а информация для нее должна быть заранее помещена в определенные регистры машины. Наибольшее применение в ПК нашли двухадресные команды.
Пример двухадресной команды, записанной на языке символического кодирования:
Эту команду следует расшифровать так: сложить число, записанное в ячейке 0103 памяти, с числом, записанным в ячейке 5102, а затем результат (то есть сумму) поместить в ячейку 0103.
В кодах машины любая команда содержит только двоичные цифры записанных объектов.
Современные компьютеры автоматически выполняют несколько сотен различных команд. Например, стандартный набор современных ПК IBM РС содержит более 240 машинных команд.
Все машинные команды можно разделить на группы по видам выполняет операций:
● операции пересылки информации внутри компьютера;
● арифметические операции над информацией;
● логические операции над информацией;
● операции над строками (текстовой информацией);
● операции обращения к внешним устройствам компьютера;
● операции передачи управления;
● обслуживающие и вспомогательные операции.
Пояснения требуют операции передачи управления (или иначе — ветвления программы), которые служат для изменения естественного порядка выполнения команд. Существуют операции безусловной передачи управления и операции условной передачи управления.
Операции безусловной передачи управления всегда приводят к выполнению после данной команды не следующей по порядку, а той, адрес которой в явном или неявном виде указан в адресной части команды.
Операции условной передачи управления тоже вызывают передачу управления по адресу, указанному в адресной части команды, но только в том случае, если выполняется некоторое заранее оговоренное для этой команды условие. Это условие в явном или неявном виде указано в коде операции команды. Команд условной передачи управления насчитывается обычно до нескольких десятков — по числу используемых условий.
Команд безусловных передач управления обычно только три:
● команда передачи управления, которая просто передает управление по задан ному адресу и больше никаких действий не выполняет;
● команда передачи управления (ее часто называют командой вызова процедуры или подпрограммы), которая, кроме передачи управления процедуре, еще и запоминает в специальной стековой памяти адрес следующей команды (адрес возврата из процедуры);
● безадресная команда передачи управления (команда возврата из процедуры) возвращающая управление по запомненному адресу возврата.
Вторая и третья из названных команд безусловных передач управления работа- ют «на пару» — одна передает управление процедуре, другая возвращает из нее. Важную роль в выполнении этих команд передачи управления (да и при многих других ситуациях, отрабатываемых компьютером) играет специальным образом организованная область оперативной памяти — стековая память.
Обращение к ячейкам этой памяти выполняется по принципу «последний записанный операнд первым считывается» или иначе «первым вошел — последним вышел» (FILO —, first input, last output). Стековая память позволяет удобно реализовать процессы иерархического обращения ко многим процедурам (количество уровней иерархии практически не ограничено), последовательно записывая и выдавая по принципу FILO адреса возврата каждой из них.
Последовательность подготовки и решения задачи на компьютере обычно следующая.
1. Формулировка и формализованная постановка задачи.
2. Выбор математической модели и метода решения задачи.
3. Разработка алгоритма решения задачи, то есть последовательности процедур, которые необходимо выполнить для решения задачи.
4. Составление программы решения задачи, то есть запись алгоритма решения„ задачи на языке, понятном машине.
5. Ввод программы в компьютер и ее отладка.
6. Ввод исходных данных и решение задачи на компьютере.
7. Анализ полученных результатов и выводы по результатам решения.
Однопрограммные и многопрограммные режимы
Вычислительные машины могут выполнять обработку информации в разных режимах:
● однопрограммном (монопольном) режиме;
● многопрограммном режиме, который можно подразделить на:
● режим пакетной обработки информации;
● режим разделения машинного времени.
Последний, в свою очередь, имеет разновидности:
● диалоговый режим,
● режим реального времени.
Однопрограммный режим использования компьютера самый простой, применяется во всех поколениях компьютеров. Из современных машин этот режим чаще всего используется. в персональных компьютерах, где он называется реальным режимом работы микропроцессора. В этом режиме все ресурсы ПК передаются одному пользователю. Пользователь сам готовит и машину, и всю необходимую для решения задач информацию, загружает программу и данные, непосредствен; но наблюдает за ходом решения задачи и выводом результатов. Такой вариант, режима называют режимом непосредственного доступа.
Однопрограммный режим имеет и второй вариант — вариант косвенного доступа, при котором пользователь не имеет непосредственного контакта с компьютером. В этом варианте пользователь готовит свое задание и отдает его на машину. Задача запускается в порядке очередности и по мере готовности результаты, ее решения выдаются пользователю. Этот вариант, бывший когда-то самым распространенным, сейчас практически, по крайней мере на персональных компьютерах, не используется. Однопрограммный режим непосредственного доступа весьма удобен для пользователя, но для него характерен чрезвычайно низкий коэффициент загрузки оборудования — временные простои многих устройств машины и в период подготовки задачи для решения, и непосредственно при решении задачи (при вычислениях в процессоре простаивают внешние устройства, при печати простаивают процессор, основная и внешняя память и т. д.). Поэтому даже в современных ПК, для которых характерен именно однопрограммный режим (в силу их «персональности), последний в микропроцессорах обогащается многоступенчатой суперконвейерной обработкой данных, использующей некоторые элементы многопрограммность.
Многопрограммный (его также называют мультипрограммным, многозадачным, а в ПК и многопользовательским) режим обеспечивает лучшее расходование ресурсов компьютера, но несколько ущемляет интересы пользователя. Для реализации этого режима необходимо прежде всего разделение ресурсов машины в пространстве (на множестве устройств компьютера) и во времени. Естественно, такое разделение ресурсов эффективно может выполняться только автоматически, — следовательно, требуется автоматическое управление вычислениями. Автоматическое управление особо необходимо для распределения памяти между несколькими одновременно запускаемыми программами, поскольку программы готовятся пользователями независимо друг от друга, в них не выполняется предварительно статическое распределение памяти (как и других программных и технических ресурсов машины). В процессе решения задач недопустимо одновременное обращение двух программ к одному и тому же файлу, устройству.
Все названные проблемы решают операционные системы, обеспечивающие многопрограммную работу компьютера, помогают им в этом драйверы устройств машины и автозагрузчики (загрузчики) программ.
Важнейшая проблема — защита памяти. Недопустимо несанкционированное, пусть и неодновременное обращение двух программ к одним и тем же областям памяти для изменения информации. Для предотвращения такого несанкционированного случайного доступа к памяти, выделенной для другой задачи, служит специальная система защиты памяти. Важность проблемы защиты памяти подчеркивается тем фактом, что многопрограммный режим работы микропроцессора в ПК обычно называют защищенным режимом.
Простейшим вариантом многопрограммного режима является режим пакетной обработки. Он в максимальной степени обеспечивает загрузку всех ресурсов машины, но наименее удобен пользователю. В классических системах пакетной обработки информации все подлежащие решению задачи анализировались и объединялись в различные группы (пакеты) с тем, чтобы в пределах пакета обеспечивалась равномерная загрузка всех устройств машины. Например, задача, связанная с длительным выводом информации на печать, объединялась с задачей, интенсивно использующей внешнюю память, и с задачей, требующей сложных вычислений в процессоре и т. п. После формирования всех пакетов они по очереди запускались на обработку. Пользователь в этом режиме обращался к машине два раза: первый раз для ввода задания, второй раз для получения результатов — по современной терминологии такой режим относится к режимам группы «offline». В персональных компьютерах, ввиду небольшого количества одновременно решаемых задач, режим пакетной обработки претерпел существенные изменения и сводится по существу к последовательному решению одновременно поступивших задач (пакета задач) в соответствии с их важностью (приоритетностью) и временем поступления. Переход к решению следующей задачи выполняется только после окончательного завершения текущей. Правда, в развитых системах такой пакетной обработки при внезапном поступлении информации по более приоритетной задаче, выполняемая на компьютере менее приоритетная задача уступает свое место (прерывается).
Второй частный случай многопрограммного режима — режим разделения времени характерен тем, что на машине действительно одновременно решается несколько задач, каждой из которых по очереди выделяются кванты времени, обычно недостаточные для полного решения задачи. Условием прерывания решения текущей задачи служит либо истечение кванта выделенного времени, либо обращение к процессору какого-либо приоритетного внешнего устройства, например клавиатуры для ввода информации.
Прерывание задачи от клавиатуры является типичным для диалогового режима работы ПК, представляющего собой частный случай режима разделения времени. Диалоговые режимы характерны для многопользовательских систем: они обеспечивают одновременную работу нескольких пользователей при решении задач в интерактивном режиме. В процессе решения задачи пользователь имеет возможность корректировать ход выполнения своего задания. Диалоговые системы активно используются при совместной работе нескольких пользователей даже с одной программой: формирование и корректировка баз данных, программ, чертежей, схем и документов.
Режим реального времени — еще один вариант режима с разделением машинного времени. Этот режим применяется в основном в динамических системах управления и диагностики, когда строго регламентируется время ответа системы (выполнения задания) на случайно поступающие запросы.
Все режимы разделения машинного времени обеспечивают пользователю работу в режиме «online».
Основная нагрузка при реализации многопрограммных режимов, как уже говорилось, ложится на операционную систему. Все операционные системы обеспечивают выполнение этих режимов. Все современные операционные системы обладают эффективными возможностями, поддерживающими не только многозадачные и многопользовательские режимы с развитой системой приоритетного прерывания, но и многопроцессорность их исполнения, то есть распределение заданий между несколькими микропроцессорами, имеющимися в системе.
Система прерываний программ в ПК
Важнейшая роль в реализации сложных режимов работы отводится системе прерывания программ.
Прерывание — это приостанов выполнения в процессоре программы с целью выполнения какой-то более важной или нужной в данный момент другой программы или процедуры, после завершения которой продолжается выполнение прерванной программы с момента ее прерывания. Прерывание позволяет компьютеру приостановить любое свое действие и временно переключиться на другое, как заранее запланированное, так и неожиданное, вызванное непредсказуемой ситуацией в работе машины или ее компонента. Каждое прерывание влечет за собой загрузку определенной программы, предназначенной для обработки возникшей ситуации — программы обработки прерывания.
Организация и управление прерываниями функционально во многом смыкается с управлением задачами — одной из базовых функций операционных систем. Основой для управления процессом одновременного решения нескольких задач (равно как и управления прерываниями) являются процедуры:
● выбора очередной задачи или определения приоритета задачи;
● сохранения информации о статусе задачи при ее прерывании (формирование слова состояния программы);
● упреждения и устранения конфликтов между задачами (координации и синхронизации выполнения задач).
Последовательность действий процессора при реализации прерывания такова; При появлении запроса на прерывание, запланированное заранее или неожиданное, процессор, как правило, после завершения выполнения текущей команды программы анализирует допустимость (разрешенность и приоритетность) данного вида прерывания. Если оно разрешено, процессор производит следующие действия:
● запоминает в стековой памяти текущее состояние прерываемой программы (состояние некоторых регистров МПП, в частности регистров FL, С$, IP, а в микропроцессорах МП80286 и выше — и слова состояния программы, хранящегося в другом регистре МПП);
● посылает источнику запроса на прерывание запрос о причине (коде) прерывания;
● анализирует код запрошенного прерывания (номер прерывания — N,) и формирует адрес ячейки (A V), хранящей вектор прерывания (вектор-адрес программы обработки прерывания) по формуле А~= 4 N; (векторы прерываний занимают начальную i024-байтовую область ОП с адресами ячеек от 00000 до 00400h (шестнадцатеричный код) так, что адрес вектора вычисляется простым умножением номера прерывания на четыре, так как С$ и IP занимают по 2 байта каждый);
● считывает из ОП и записывает в регистры МПП (в регистры FL, CS, IP и т. д.) вектор прерывания и его атрибуты;
●сбрасывает (устанавливает в О) флаги прерывания (IF) и трассировки (TF); CI выполняет программу обработки прерывания (которую иногда называют драйвером прерывания);
● после выполнения программы обработки прерывания возвращает из стековой памяти параметры прерванной программы в регистры МПП и восстанавливает процесс выполнения прерванной программы.
Видов (номеров) прерывания может быть всего 256, и, соответственно, векторов прерывания (адресов С$:IP программ обработки прерываний) в ОП насчитывается до 256. Классификация видов прерываний показана на рис. 9.2.
Прикладные прерывания временно устанавливаются пользователем при многопрограммной работе МП для указания приоритета выполнения прикладных программ (при появлении необходимости выполнения более приоритетной программы текущая менее приоритетная программа прерывается).
Псевдопрерывания служат для запоминания важных фиксированных адресов, которые могут быть использованы в программах, в частности, при условных и без условных передачах управления (запоминание адресов передачи управления как векторов прерывания возможно благодаря аналогии выполнения прерывания и обращения к процедурам).
Аппаратные прерывания инициируются при обращениях к МП со стороны внешних устройств (таймера, клавиатуры, дисководов, принтера и т. д.) с требованием уделить им внимание и выполнить совместно с ними те или иные процедуры. Прерывания от таймера, например, повторяются 18 раз в секунду, от клавиатуры — при каждом программно не запланированном нажатии некоторых клавиш и т. п. Аппаратные прерывания не координируются с работой программы и могут быть весьма разнообразны. Для их систематизации и определения очередности выполнения при одновременном возникновении нескольких из них обычно используется контроллер прерываний.
Программные прерывания — это обычные процедуры, которые вызывает текущая программа для выполнения предусмотренных в ней стандартных подпрограмм, чаще всего подпрограмм — служебных функций работы с внешними устройствами, то есть фактически программные прерывания ничего не прерывают. Программные прерывания делятся на две большие группы, вызывающие служебные функции:
● базовой системы ввода-вывода — прерывания BIOS;
● операционной системы — прерывания DOS.
Программы обработки прерываний DOS, в отличие от программ обработки прерываний BIOS, не встроены в ПЗУ и для разных операционных систем могут быть разными. К программным прерываниям можно отнести также прерывания при пошаговом исполнении программы, при работе с контрольным остановом и т. д.
Технические прерывания (или, иначе, прерывания от схем контроля) возникают при появлении отказов и сбоев в работе технических средств (аппаратуре) ПК. Большинство технических прерываний не маскируются, то есть они разрешаются всегда, а некоторые из них относятся к категории «аварийных» (например, отключение питания), и при их возникновении даже не запрашивается причина прерывания, а просто, по возможности, спасаются важные промежуточные результаты — записываются в безопасное место, в НЖМД, например.
Логические прерывания возникают при появлении ошибок в выполняемых программах (деление на 0, потеря точности мантиссы, нарушение защиты памяти и т. п.). Многие из логических прерываний также относятся к категории немаскируемых.
Прерывания обслуживаются базовой системой ввода-вывода — модулем расширения BIOS и модулем обработки прерываний DOS. BIOS и блок расширения BIOS имеют дело в основном с непланируемыми техническими и логическими прерываниями, пользовательскими прикладными прерываниями, а также со многими планируемыми прерываниями, обслуживающими систему ввода-вывода, детализированными и не очень детализированными (прерывания, обслуживаемые BIOS, часто называют прерываниями нижнего уровня).
Модуль обработки прерываний DOS обслуживает в большинстве планируемые прерывания, в том числе и прерывания системы ввода-вывода. Прерывания DOS часто называют прерываниями верхнего уровня, так как, с одной стороны, в этих прерываниях меньше учитываются технические особенности элементов ПК, а с другой стороны, при обработке этих прерываний часто случаются обращения к программам прерываний системы BIOS. Большинство прерываний BIOS имеют близкие аналоги среди прерываний DOS.
Следует сказать, что использование прерываний BIOS позволяет, как правило, более детализированно выполнить обращения к различным системным ресурсам ПК, к элементам информационных структур и их атрибутам. Однако прерывания DOS более просты в использовании при программировании. Поэтому начинающим программистам рекомендовать работать с прерываниями DOS, особенно с расширенными функциями DOS для работы с файлами. Схема opгaнизации приема запросов на прерывания показана на рис. 9.3.
Для приема внешних прерываний имеются порты двух типов: NMI (None Masked Interrupt) для приема немаскируемых прерываний и INTR (Interrupt) — для приема прочих прерываний (INTR обычно используется для подсоединения контроллера прерываний). Если запрос на прерывание поступает по входу NMI, то прерывание не маскируется (имеет абсолютный приоритет) и сразу выполняется; по входу INTR прерывание разрешается, если в регистре флагов МПП флаг IF = 1.
Всего предусмотрено 256 типов (О — 255) прерываний. Из них только первые 5 жестко закреплены в МП, остальные используются системами BIOS и DOS.
● Тип 0 — прерывание возникает при делении на 0 или если частное от деления переполняет разрядную сетку МП.
● Тип 1 — в режиме «трассировка» (при TF = 1) после выполнения каждой команды программы происходит останов.
● Тип 2 — немаскируемое техническое прерывание.
● Тип 3 — прерывание по команде INT, включенной в программу: останов и отображение содержимого регистров МПП.
● Тип 4 — прерывание по команде INTO, включенной в программу, но только если при выполнении предыдущей команды произошло переполнение разрядной сетки.
● Типы 8 — 15 — аппаратные прерывания, инициируемые внешними устройствами, поступают на входы IRQO — IRQ7 контроллера прерываний (вход IRQO имеет высший приоритет, и прерывание, поступившее по этому входу, обрабатывается первым; всего уровней приоритета восемь и вход IRQ7 имеет низший приоритет).
● Типы 16 — 31 — планируемые программные прерывания BIOS.
● Типы 32-255 — программные прерывания DOS (жестко задействовано около 10, а вообще в разных версиях DOS их разное количество).
Прерывания с 0 по 31 и прерывание 64 относятся к прерываниям нижнего уровня, обслуживаемым BIOS; прерывания начиная с 32 — являются прерываниями верхнего уровня (за исключением прерывания 64); причем прерывание ЗЗ (21Ь) — это комплексное, чаще всего используемое в программах пользователя прерывание, имеющее около 100 разновидностей (служебных функций DOS).
В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерывание 10 (Ah) включает в себя 15 разновидностей, прерывание 33 (21Ь) около 100 разновидностей: в DOS 1.0 — 47, в DOS 2.0— 88, в DOS 3.0 и выше — 99 разновидностей (вид действия в рамках каждого прерывания определяется содержимым регистра АН).
В работе [10] приведен список прерываний нижнего и верхнего уровня, а также служебных функций DOS наиболее часто используемого программистами прерывания 2ih.
Адресация регистров и ячеек памяти в ПК
Адресация операндов в командах программы может быть:
● непосредственной;
● прямой;
● косвенной;
● ассоциативной;
● неявной.
Непосредственная адресация заключается в указании в команде самого значения операнда, а не его адреса.
Прямая адресация состоит в указании в команде непосредственно абсолютного или исполнительного адреса операнда.
Косвенная адресация имеет в виду указание в команде регистра(ов) или ячейки памяти, в которых находятся абсолютный, исполнительный адрес операнда или их составляющие.
Ассоциативная адресация — указание в команде не адреса, а идентифицирующего содержательного признака операнда, подлежащего выборке (применяется в ассоциативных запоминающих устройствах).
Неявная адресация — адреса операнда в команде не указано, но он подразумевается кодом операции.
Адресация ячеек основной памяти ПК имеет две важных разновидности: относительную и стековую.
Абсолютный (Аинд ) адрес формируется как сумма адресов исполнительного (Аисп) и сегментного (Асег):
Аабс= Асегм+ Аисп.
Асегм— 20-битовый начальный адрес сегмента, который является увеличенным в 16 раз (сдвинутым на 4 бита влево) 16-битовым адресом сегмента А'сегм хранящемся в одном из 16-битовых сегментных регистров. Начальный адрес сегмента в таком варианте всегда кратен 16 байтам, и он может быть полностью идентифицирован значением А'сегм (сегмент всегда состоит из целого числа параграфов, а параграф равен 16 байтам), то есть
Асегм= 16● А'сегм = А'сегм0000.
16-битовый исполнительный адрес может в ПК представлять собой сумму 3-х адресов:
Аисп =Асмещ[+Абаз ][+Аинд],
где
● Асмещ — 16-битовый адрес смещения относительно начала сегмента (или относительно базы, если есть A);
● Абаз— 16-битовый адрес смещения базы адреса операнда относительно начала сегмента;
● Аинд — адрес индекса (или просто индекс) — дополнительная составляющая адреса операнда, использующаяся часто при программировании циклических процессов с массивами и таблицами. Индекс должен быть непосредственно задан в соответствующем регистре МПП.
При адресации данных могут использоваться все составляющие адреса:
Аабс= Асегм + Аисп = Асегм + Асмещ[+Абаз ][+Аинд ].
Асегм = 16 А'сегм А'сегм берется из регистра DS по умолчанию или из регистра ES,
если это указано в программе. Аб и А„„берутся, соответственно, из регистров ВХ и индексных (SI или DI), а Асмещ в явном или неявном виде указываются в программе.
При адресации команд программы могут использоваться только две составляющие адреса:
16-битовый адрес сегмента берется из регистра SS, смещения относительно начала сегмента стека автоматически считываются из регистров BP (смещение базы стека — Аб ) и SP (смещение активной ячейки стека, в которую записывается или из которой считывается информация, — «вершины стека» относительно базы ).
В защищенном (многопрограммном) режиме работы микропроцессора начальные адреса сегментов хранятся в таблицах дескрипторов и имеют длину 24 или 32 бита (в зависимости от типа МП). В сегментных регистрах в этом режиме хранятся селекторы, содержащие адресные ссылки на соответствующие таблицы дескрипторов.
Элементы программирования на языке ассемблер
Пользователь компьютера, равно как и прикладной программист, программы составляет, как правило, на машинно-независимом алгоритмическом языке высокого уровня (Basic, Pascal, FORTRAN, С, PROLOG и т. д.), однако иметь представление об основах программирования и на машинно-ориентированных языках грамотному пользователю весьма полезно для:
● лучшего понимания архитектуры ПК и более грамотного использования компьютеров; для разработки более рациональных структур алгоритмов и программ решения прикладных задач;
● возможности просмотра и корректировки исполняемых программ с расширениями ЕХЕ и СОМ, компилированных с любых языков высокого уровня, в случае утраты исходных программ (вызвав указанные программы в отладчик программ DEBUG и деассемблировав их, можно получить их отображение на языке ассемблера);
● составления программ решения наиболее ответственных задач (программа, подготовленная на машинно-ориентированном языке, обычно эффективнее (короче и быстрее на ЗО — 60%) программ, полученных в результате трансляции с языков высокого уровня) и для реализации процедур, включаемых в основную программу в виде отдельных фрагментов в том случае, если они не могут быть реализованы ни на используемом языке высокого уровня, ни с помощью служебных процедур операционной системы.
Основные компоненты языка ассемблер
Алфавит языка
Алфавит языка составляют символы ASCII:
● буквы от А до Z (или от а до z, строчные и прописные буквы в ассемблере не различаются);
● цифры от 0 до 9;
● специальные символы: @, $,?,,,—, + и т. д.
Из букв, цифр и символов: @, $, ?,, формируются:
● простые сообщения: имена (идентификаторы) процедур (подпрограмм), переменных, директив, команд (метки), значения констант и переменных;
● составные сообщения: команды (операторы);
● директивы (псевдооператоры), модификаторы (операции) и т. д.
Имена меток, переменных, идентификаторов могут быть длиной до 31. символа и начинаться должны обязательно не с цифры.
Константы (числа и строки)
Числа — только целые
Различают:
● двоичные числа; заканчиваются буквой В;
● десятичные числа; без специального окончания или заканчиваются буквой
● шестнадцатеричные числа; заканчиваются буквой Н.
Для обозначения цифр 10, 11, 12, 13, 14, 15 в шестнадцатеричной системе счисления используются, соответственно, буквы А, В, С, D, Е, F, но начинаться шестнадцатеричные числа должны обязательно с цифры, например: выражение F19H— не число, а идентификатор, правильно число записывается так: OF19H. Запись отрицательных чисел:
● десятичные числа записываются обычным образом, просто со знаком: — 32, — 32D;
● двоичные числа записываются только в дополнительном модифицированном коде: — 32D -+ 11.100000В, — 19D -+ 11.01101В;
● шестнадцатеричные числа записываются только в дополнительном коде: -32D выглядит как 1.ЕОН, -119D — как 1.89Н.
Строки (литералы)
Строки символов: включают в себя любые буквы, цифры и символы, но заключаются в кавычки: "ПЭВМ IBM РС с микропроцессором 80386".
Команды (операторы)
Формат команды:
[Метка [:]] КОП [Операнд] [.Операнд] [;Комментарий].
Между элементами команды вставлены пробелы.
Здесь и далее элементы, заключенные в квадратные скобки, необязательны.
КОП (Код Оператора) — мнемокод команды (состоит из 2 — 6 букв). Может быть до 256 различных кодов (в ассемблере IBM РС их число изменяется в зависимости от типа МП. Например: 133 в МП 8088, 240 в МП 80386).
Операнд — явно заданный адрес (прямой или косвенный); имя метки, переменной; само значение переменной; ассоциативный признак и т. п. Количество необходимых в команде операндов ассемблер узнает по КОП. В большинстве двухадресных команд присутствуют операнды приемника (dst — destination) и источника (src — source); источник не изменяет своего содержания, в приемнике первое число, участвующее в операции, заменяется результатом.
Метка — имя команды ассемблера для ссылки (обращения) к этой команде (до 31 символа). Двоеточие, стоящее после метки, означает, что метка всегда находится в текущем сегменте памяти.
Комментарий — любой текст, поясняющий человеку программу (не воспринимается ассемблером, но выводится в листинге).
Директивы (псевдооператоры)
Директивы, в отличие от команд, выполняются только в процессе ассемблирования (трансляции) программы, а не в ходе решения задачи на компьютере.
То есть команды — это инструкции машине, а директивы — это инструкции ассемблеру (транслятору).
Формат директивы:
[Идентификатор] КПОП [Операнд] [,Операнд]... [;Комментарий]
Как и в случае команд, поле директивы может начинаться в любом месте строки
программы при условии, что оно отделено от предыдущего поля хотя бы одним пробелом.
Идентификатор — имя директивы (для обращения к ней).
КПОП (Код Псевдооператоре) — мнемокод директивы (состоит из 2 — 7 букв). Операнды — их в директиве может быть много; это уже не только адреса, но и различные процедуры. В операндах могут быть записаны простые выражения, использующие модификаторы (операции).
Модификаторы
В операторах и псевдооператорах языка ассемблер иногда используются модификаторы, которые определяют ту или иную операцию, учитываемую при трансляции программы. Существует 5 видов модификаторов: арифметические, логические, отношений, возвращения значений и присваивания атрибутов. Наиболее часто используются следующие модификаторы (mdf).
● Арифметические модификаторы: «+» — сложить, «» — вычесть, «*» — умножить, «/» — разделить, mod — остаток от деления и т. д. Формат: opr mdf opr.
● Логические модификаторы: and — «и», or — «или», not — «не» и xor — исключающее «или». Формат: opr mdf opr.
● Модификаторы отношения: eq — совпадения, пр — несовпадения, It — меньше, gt — больше, le — меньше или равно, ge — больше или равно. Формат: opr mdf opr.
● Модификаторы, возвращающие значения:
● $ — возвращает значение смещения адреса текущего оператора;
● seg — возвращает адрес сегмента адреса метки или переменной;
● offset — возвращает смещение адреса метки или переменной;
● length — возвращает длину операнда в единицах определения (байтах или словах);
● type — возвращает атрибут типа переменной (1, если byte; 2 — word, 3— dword) или метки (1 — near, 3 — far);
● size — возвращает произведение length*type. Формат: mdf opr.
● Модификаторы присваивания атрибута:
● ptr — изменяет атрибут типа (byte, word или dword) операнда или атрибут дистанции (near или far) адресного операнда. Формат: тип ptr opr. (здесь: тип — новый атрибут, орr — идентификатор операнда, чей атрибут должен быть изменен);
● ds:, еs:, сs:, ss: — изменяет атрибут сегмента адреса. Формат: rsegm:адрес (адрес может быть задан именем сегмента, переменной, меткой или адресным выражением);
"=.
● short — дополняет атрибут near метки оператора перехода, указывает, что переход осуществляется на расстояние не более +128 байтов от текущей команды. Формат: short метка;
● high — возвращает старший байт 16-битового значения opr. Формат: high opr;
● low — возвращает младший байт 16-битового значения opr. Формат: low opr.
В программах используются:
● атрибуты дистанции:
● near — близкий, в пределах одного сегмента;
● far — далекий, за пределами одного сегмента;
● атрибуты типа данных:
● byte — длиной 1 байт;
● word — длиной 2 байта;
● dword — длиной 4 байта.
Адресация регистров и ячеек памяти в ассемблере
При программировании на языке ассемблер используются неявный, непосредственный, прямой и косвенный методы адресации; причем для адресации регистров в МПП — только прямой, а для адресации ячеек ОП — прямой, косвенный и смешанный непосредственный методы. Рассмотрим их на примере адресации второго операнда в команде МОЧ (переслать).
Непосредственная адресация
Величина операнда ) (impendence) непосредственно указывается в поле команды и может быть задана числом в десятичной, двоичной и шестнадцатеричной системах счисления (последний символ числа должен быть, соответственно, D (или никакой), В и Н) или идентификатором, а также задана простым выражением, в котором указанные элементы связаны символами арифметических операций: +, -, * и /. Идентификатор (с соответствующим именем, например, const) должен быть предварительно описан в программе директивой типа: const equ 1024 или сопз1 = 1024.
Примеры непосредственной адресации:
MOV АХ, 1024D; МОV AL. 64: MOV ВХ. 1АН; MOV СН, 1011В:
MOV АХ, const; МОV АХ, 156*10Н/2 и т. п.
Следует помнить, что диапазон чисел, посылаемых в регистры, ограничивается вместимостью последнего: в 1-байтовый регистр (AH, AL, ВН и т. д.) можно посылать числа в диапазоне от 0 до +255 (целое, без знака) или от — 128 до +127 (целое со знаком); в 2-байтовый регистр (AX, ВХ, СХ и т. д.) — от 0 до +65 535 (целое без знака) или от — 32 768 до +32 767 (целое со знаком).
Прямая адресация регистров МПП
В качестве адреса операнда указывается имя регистра (его символьное обозначение: AX, AL, АН, ВХ, 81 и т. д.). Примеры:
MOV АХ, ВХ
MOV BХ, DХ
МОV АН. BL
Необходимо следить, чтобы разрядность второго операнда (его регистра) соответствовала разрядности принимающего регистра.
Адресация ячеек ОП
Напомним, что абсолютный (полный, физический) адрес (Аабс,) в общем случае является суммой адресов сегмента (Aсегм ) и исполнительного адреса (Аисп), в свою очередь формируемого как сумма максимум трех адресов: смещения (Асмещ ), базы (Абаз) и индекса (Аинд), то есть:
Существуют два варианта косвенной адресации ячеек ОП:
● косвенная обычная: MOV AX, [BX].
Исполнительный адрес извлекается из регистра BX, то есть А= [ВХ];
● косвенная с индексированием: МОЧ АХ, [BX+Sl].
Исполнительный адрес берется в виде суммы адресов, находящихся в регистрах BX и Sl,
А= [BX] + [SI].
Смешанная непосредственная адресация ячеек ОП имеет несколько вариантов:
● непосредственная обычная: МОV AX, offset pole.
В качестве операнда берется непосредственно смещение адреса первой ячейки поля памяти, отведенного для переменной Х; offset указывает, что берется не значение переменной Х, а именно смещение ее адреса;
● непосредственная с индексированием: МОV AX, [Sl+const].
В качестве операнда берется сумма значения, хранящегося в регистре Sl, и величины const; const может быть задана числом, идентификатором, смещением адреса переменной (offset pole) или их комбинацией — простым выражением;
● непосредственная с базированием: МОЧ AX, [BX+const].
Аналогично предыдущему варианту, но регистр Sl замещен BX;
●непосредственная с базированием и индексированием: МОV АХ, pole[SI+BX+
const].
Аналогично предыдущему, но вместо содержимого одного регистра берется сумма содержимого регистров ВХ и Sl.
Почти все команды ассемблера за редким исключением (исключения: POP, PUSH, CALL, RET, IRET) в качестве обычно используют по умолчанию адрес, находящийся в регистре DS (в исполняемых программах типа .СОМ — в регистре С$), но регистр сегмента может быть задан и явно, например: MOV AX, EX:pole; MOV AX, SS:[Sl] и т. п.
Последняя команда, в частности, позволяет реализовать прямой доступ к ячейке стековой памяти, стек при этом не изменяется.
Команды POP, PUSH, CALL, RET, IRET используют сегмент стека (регистр SS).
Основные команды языка ассемблер
По назначению можно выделить команды (в скобках приводятся примеры мнемонических кодов операций команд ассемблера ПК типа IBM PC):
●выполнения арифметических операций (ADD и ADC — сложения и сложения с переносом, SUB и SBB — вычитания и вычитания с заемом, MUL и IMUL— умножения без знака и со знаком, DIV и IDIV — деления без знака и со знаком, CMP — сравнения и т. д.);
● выполнения логических операций (OR, AND, NOT, XOR, TEST и т. д.);
● пересылки данных (MOV — переслать, XCHG — обменять, IN — ввести в микро- процессор, OUT — вывести из микропроцессора и т. д.);
● передачи управления (ветвления программы: JMP — безусловного перехода, CALL — вызова процедуры, RET — возврата из процедуры, J* — условного перехода, LOOP — управления циклом и т. д.);
● обработки, строк символов (MOVS — пересылки, CMPS — сравнения, LODS— загрузки, SCAS — сканирования. Эти команды обычно используются с пре- фиксом (модификатором повторения) REP;
● прерывания работы программы (INT — программные прерывания, INTO— условного прерывания при переполнении, IRET — возврата из прерывания);
● управления микропроцессором ($Т* и CL* — установки и сброса флагов, HLT — останова, WAIT — ожидания, NOP — холостого хода и т. д.).
С полным списком команд ассемблера можно познакомиться в работах [1, 10, 35|.
Команды пересылки данных
● MOV dst, src — пересылка данных (move — переслать из src в dst). Пересылает'. один байт (если src и dst имеют формат байта) или одно слово (если src и dst имеют формат слова) между регистрами или между регистром и памятью, а также заносит непосредственное значение в регистр или в память. Операнды dst и src должны иметь одинаковый формат — байт или слово.
Src могут иметь тип: r (register) — регистр, m (memory) — память, i (impedance)— непосредственное значение. Dst могут быть типа r, m. Нельзя в одной команде использовать операнды: rsegm совместно с i; два операнда типа m и два операнда типа rsegm. Операнд i может быть и простым выражением:
mov АХ. 156*10Н
mov АХ, (152 + 1018) / 15
и т. п.
Вычисление выражения выполняется только при трансляции. Флаги не меняет.
● РUSН src — занесение слова в стек (push — протолкнуть; записать в стек из src). Помещает в вершину стека содержимое src — любого 16-битового регистра (в том числе и сегментного) или двух ячеек памяти, содержащих 16-битовое слово. Флаги не меняются;
● POP dst — извлечение слова из стека (рор — вытолкнуть; считать из стека в dst). Снимает слово с вершины стека и помещает его в dst — любой 16-битовый регистр (в том числе и сегментный) или в две ячейки памяти. Флаги не меняются.
В командах PUSH и POP операнды dst и src могут быть только типов r и m.
Арифметические команды
Операнды могут быть двоичные (8 или 16 битов, целые, со знаком или без знака), двоично-десятичные (от 1 до 255 байтов, без знака, в упакованном или распакованном (ASCII-коды) форматах). Машина не обращает внимания на формат и обращается с ними формально, как с двоичными числами в дополнительном коде. Но для десятичной арифметики после операции требуется коррекция (операции только над одним байтом).
Команды сложения, вычитания и сравнения.
Команды сложения, вычитания и сравнения — двухадресные.
● ADD dst, src — сложение двоичных чисел (add — сложить). Прибавляет байт или слово из памяти, регистра непосредственно к содержимому регистра или прибавляет байт или слово из регистра непосредственно к памяти (содержимое src складывается с содержимым dst). Операнды dst и src должны иметь одинаковый формат (оба или байт, или слово) и тип данных: src — r, m, i; dst — r, m (невозможно rsegm, i и нельзя, чтобы оба типа были m или оба rsegm). Команда ADD формирует флаги AF, CF, OF, PF, SF и ZF.
● SUB dst, src — вычитание двоичных чисел (substract — вычесть). Вычитает байт или слово, взятое из памяти, регистра или непосредственно из содержимого регистра, или вычитает байт или слово, взятое из регистра или непосредственно из памяти (содержимое src вычитается из содержимого dst). Операнды dst и должны иметь одинаковый формат (оба или байт, или слово) и могут быть: src — r, m, i; dst — r, а (невозможно rsegm и нельзя, чтобы оба типа были m). Команда SUB формирует флаги AF, CF, OF, PF, SF и ZF.
●CMP dst, src — сравнение (compare — сравнить). Сравнивает содержимое двух полей данных; фактически команда вычитает второй операнд (src) из первого (dst), но значение dst не изменяет, а лишь формирует флаги. Операнды dst и src должны иметь одинаковый формат (оба или байт, или слово) и могут быть: src — r, m, i; dst — r, а (невозможно rsegm, i и нельзя, чтобы оба типа были m или оба rsegm). Команда CMP формирует флаги: CF, ZF при сравнении чисел без знака, CF, OF, SF, ZF при сравнении чисел со знаком; флаги AF, PF не определены.
Команды приращения
Команды приращения — одноадресные.
● Inc dst: инкремент (increment — нарастить). Прибавляет 1 к содержимому dst. Операнд dst может быть представлен оператором типа r или m. Команда INC формирует флаги PF, AF, ZF, SF, OF.
● DEC dst: декремент (decrement — уменьшить). Вычитает 1 из содержимого dst. Операнд dst может быть представлен оператором типа r или m. Команда DEC формирует флаги PF, AF, ZF, SF, OF.
Команды умножения
Команды умножения — одноадресные. Указывается только SRC (множитель); DST (множимое) задается строго определенным образом.
● MUL src — умножение (multiply — умножение без знака). Выполняет умножение беззнакового множимого (8 или 16 битов) на беззнаковый множитель (8 или 16 битов). Команда одноадресная — указывается только SRC (множитель); DST (множимое) берется строго определенным образом. SRC может быть представлен оператором типа r или m (i — нельзя). Если формат SRC— байт, то множимое (байт) находится в AL, произведение (слово) будет в AX;
●если формат SRC — слово, то множимое (слово) извлекается из AX, произведение (двойное слово) помещается в DX:AX (старшие два байта в DX, младшие — в АХ). Команда MUL формирует флаги CF, OF, воздействует на флаги AF, PF, SF, ZF (флаги не определены).
● IMUL src — целое умножение знаковых чисел (integer multiply — умножение целых со знаком). Выполняет умножение знакового множимого (8 или 16 битов) на знаковый множитель (8 или 16 битов). Команда одноадресная указывается только SRC (множитель); DST (множимое) берется строго определенным образом. SRC может быть представлен оператором типа r или m (i — не допускается). Если формат SRC — байт, то множимое (байт) извлекается из AL, произведение (слово) будет в AX; если формат SRC — слово, то множимое (слово) находится в AX, произведение (двойное слово) заносится в ОХ:АХ (старшие два байта результата в DX, младшие — в AX). Команда IMUL формирует флаги CF, OF, воздействует на флаги AF, PF, SF, ZF (флаги не определены).
Команды деления
Команды деления — одноадресные, указывается только SRC (делитель); DST (делимое) задается строго определенным образом.
● DIV src — деление (divide — деление без знака). Выполняет деление беззнакового делимого (16 или 32 бита) на беззнаковый делитель (8 или 16 битов). Команда одноадресная — указывается только SRC (делитель); DST (делимое) берется строго определенным образом. SRC может быть представлен оператором типа r или m (i — нельзя). Если формат SRC — байт, то делимое (слово) находится в AX, частное от деления (байт) будет в AL, остаток от деления (байт) помещается в AH; если формат SRC — слово, то делимое (двойное слово) заносится в DX:AX (старшие два байта в DX, младшие — в AX), частное от деления (слово) — в AX, остаток от деления (байт) сохраняется в DL. Команда DIV формирует флаг IF (IF = 1 при делении на 0 и при делении большого числа на очень малое, если частное вне диапазона), воздействует на флаги AF, CF, OF, PF, SF, ZF (флаги не определены).
● IDIV src — деление целых чисел со знаком (integer divide — деление целых чисел со знаком), Выполняет деление знакового делимого (16 или 32 бита) на знаковый делитель (8 или 16 битов). Команда одноадресная — указывается только SRC (делитель); DST (делимое) берется строго определенным образом. SRC может быть представлен оператором типа r или m (i — нельзя). Если формат SRC — байт, то делимое (слово) — в AX, частное от деления (байт) будет в AL, остаток от деления (байт) — в AH; если формат SRC — слово, то делимое (двойное слово) попадает в DX:AX (старшие два байта в DX, младшие в АХ), частное от деления (слово) — в AX, остаток от деления (байт) — в DL. Команда IDIV формирует флаг IF (IF = 1 при делении на 0 и при делении большого числа на очень малое, если частное вне диапазона), воздействует на флаги AF, CF, OF, PF, SF, ZF (флаги не определены).
Логические команды
Это двухадресные команды, они используются для сравнения, сброса и установки битов операнда в операциях преобразования кодов и при выполнении арифметических операции в кодах ASCII.
● OR dst, src — логическое сложение (or — или). Команда выполняет поразрядную дизъюнкцию (логическое сложение — операцию «ИЛИ) битов двух операндов, устанавливает 1 в тех битах операнда dst, в которых была 1 хотя бы у одного из исходных операндов. Операнды dst и src должны иметь одинаковый формат (оба или байт, или слово) и могут быть: src типа r, в, i; dst типа r, в (невозможно rsegm и нельзя, чтобы оба типа были m). Команда OR сбрасывает OF = О и CF = О, формирует PF, SF, ZF, значение AF не определено.
● AND dst, src — логическое умножение (and — и). Команда выполняет поразрядную конъюнкцию (логическое умножение — операцию «И~) битов двух операндов, устанавливает 1 в тех битах операнда dst, в которых у обоих исходных операндов были 1. Операнды dst и src должны иметь одинаковый формат (оба или байт, или слово) и могут быть: src типа r, m, i; dst типа r, m (невозможно rsegm и нельзя, чтобы оба типа были m). Флаги: OF = 0 и CF = О, команда формирует PF, SF, ZF, значение AF не определено.
Команды безусловной передачи управления
JMP opr — команда безусловной передачи управления (jump unconditionally— перейти безусловно). Операнд орг может быть задан прямым или косвенным адресом.
● По прямому адресу: JMP метка. Если метка в том же сегменте, что и команда JMP, переход считается внутренним (near), если не в том же сегменте — переход внешний (far). В написании самой команды JMP разницы нет; тип перехода определяется видом метки: после метки для внутреннего перехода ставится двоеточие «:к Транслятор по таблице меток и их адресов сам определяет атрибуты near или far, и соответственно транслирует команду передачи управления в более короткую или более длинную команду (более длинную, так как надо менять не только содержимое смещения IP, но и регистра сегментов С$). Несколько сократить длину команды может указание программиста «1МР short метка» о том, что метка не далее +128 байтов от первого байта команды JMP (это указание не обязательно, но если оно есть и ошибочно, то транслятор выдаст ошибку).
● По косвенному адресу. Косвенный адрес может быть задан: в регистре: JMP r или в памяти: JMP символьное имя.
● В памяти с косвенной адресацией: JMP near ptr [Sl]; JMP far ptr [ВХ] и т. д.
В последних двух командах near ptr и far ptr указывать обязательно, так как какое
слово содержится в регистре Sl — обычное или двойное, — ассемблер заранее не знает и ему нужно помочь.
Команды перехода к подпрограмме и выхода из подпрограммы
Подпрограммы оформляются как процедуры. Процедура начинается меткой— именем процедуры, и заканчивается командой выхода ret (return). В программе процедура помещается в операторные скобки:
proc ... endp
Около оператора proc могут быть указаны атрибуты дистанции: near — близкая
процедура (в том же сегменте) или far — дальний вызов (если этот атрибут опущен, то подразумевается near).
Пример: DISP proc far; в отличие от метки после имени процедуры двоеточие не ставится.
Команда перехода к подпрограмме: CALL opr
Вызов процедуры (call а procedure — вызов процедуры), безусловная передача
управления, выполняющая короткий или дальний вызов процедуры. Флаги: не меняются.
В команде CALL атрибуты near или far указывать не надо, так как ассемблер нужную информацию получит сам из директивы определения процедуры. По команде CALL должно быть выполнено:
● запоминание в стеке адреса возврата (содержимого IP и CS для следующей команды: 16 битов, если near, и 32 бита, если far);
● переход к выполнению процедуры (инициируется записью в IP и в С$ (если far) нового адреса команды).
Операнд opr, определяющий адрес процедуры, бывает:
● непосредственным: CALL имя процедуры;
● прямым — процедуру с атрибутом near можно вызвать через регистр, в котором содержится смещение адреса процедуры: CALL r;
● косвенным:
● процедура с атрибутом near вызывается с использованием переменной размером в слово: CALL word ptr символьное имя,
● процедура с атрибутом far — с использованием переменной размером в двойное слово: CALL dword ptr символьное имя.
Команда выхода из подпрограммы
RET — возврат из процедуры (return from procedure). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой CALL. Необязательный числовой параметр команды RET указывает количество байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут near, то команда RET извлекает из стека одно слово и заносит его в регистр IP; если процедура имеет атрибут far, то команда RET извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента, и заносит их соответственно в регистр IP и в регистр CS. Флаги не меняются. Процедуры могут быть вложенными, глубина вложения допускается любая (ограничивается лишь емкостью стека).
Команды условной передачи управления
Есть 31 команда условной передачи управления (УПУ), но некоторые попарно совпадают, например: «если )» и «если не ( Разных команд всего 17. Условная передача управления может быть только ближней (near) и короткой (short), то есть метка перехода должна быть в том же сегменте и не далее +128 байтов от УПУ.
Общий формат команды:
J* метка
где J* — условие передачи управления при выполнении условия. Команда передает управление по прямому адресу — метке, если условие, указанное в команде, соблюдается; в противном случае выполняется следующая по порядку команда. Выполнение условия определяется состояниями флагов регистра FL, которые установлены по результатам предыдущих формирующих условие перехода операций: арифметических, логических, сравнения и т. д.
Команды условной передачи управления могут быть знаковыми (условие проверяется с учетом знака операндов) и беззнаковыми (условие проверяется по абсолютным значениям операндов). Каким типом УПУ пользоваться, определяется по содержанию решаемой задачи и, соответственно, типами данных (знаковых или беззнаковых), над которыми выполнялись операции, формирующие условие перехода.
Надо четко различать J' без знака (если сравниваются целые бёз знака) и со знаком (если сравниваются целые со знаком), иначе результат будет совсем не тем (неверным).
Например, пусть регистр AX содержит 11000110, а регистр BX — 00010110, и команда CMP AX, ВХ сравнивает содержимое этих регистров. Если данные беззнаковые, то число в AX больше, а если знаковые — то меньше (поскольку в последнем случае единица в крайнем левом разряде определяет знак числа — в AX число отрицательное).
Команды условной передачи управления для беззнаковых данных
● JA/JNBE Jump if Above/Not Below nor Equal) — переход, если выше/не ниже или равно (переход, если флаги ZF = 0 и CF = 0).
●JAE/JNB jump Above or Equal/Not Below) — переход, если выше или равно/не ниже (CF = 0).
● JB/JNAE Jump if Below/Not Above nor Equal) — переход, если ниже/не выше или равно (CF = 1).
● JBE/JNА Jump if Below or Equal/Not Above) — переход, если ниже или равно/не выше (CF = 1 или AF =
1).
Команды условной передачи управления для знаковых данных
● JG/JNLE jump if Greater/Not Less nor Egual) — переход, если больше/не меньше или равно (ЕЕ = О и SF = OF).
● JGE/JNL Jump if Greater or Equal/Nоt Less) — переход, если больше или равно/не меньше (SF = OF).
● JL/JNGE Jump if Less/Not Greater nor Equal) — переход, если меньше/не больше или равно (SF >< OF).
●/JNG Jump if 1. or Equal/Not Greater) — переход, если меньше или равно/не больше (ZF = 1 или SF >< OF).
Команды условной передачи управления для прочих проверок
●JE/JZ Jump if Equal/Zero) — переход, если равно/нуль (ZF = 1).
● JNE/JNZ Jump if Not Equal/Not Zero) — переход, если не равно/не нуль (ZF = 0).
● JS Jump if Sign) — переход, если есть знак (отрицательно) (SF = 1).
● JNS Jump if Not Sign) — переход, если нет знака (положительно) (SF = 0).
● JC Jump if Carry) — переход, если есть перенос (аналог JB) (CF = 1).
● JNC Jump if Not Carry) — переход, если нет переноса (аналог JNB) (CF = 0).
● JO Jump if Overflow) — переход, если есть переполнение (OF = 1).
● JNO Jump if Not Overflow) — переход, если нет переполнения (OF = 0).
● JP/JPE Jump if Parity/Parity Even) — переход, если есть четность (PF = 1).
● JNP/JPO Jump if No Parity/Parity Odd) — переход, если нет четности (PF = 0).
● JCXZ Jump if СХ is Zero) — переход, если содержимое регистра CX равно 0
(СХ = 0).
Команды управления циклами
Используются для повторения цикла известное число раз. Количество повторений предварительно записывается в регистр СХ (счетчик циклов). Каждый цикл автоматически уменьшает показание CX на 1.
Основная команда: LOOP метка. Циклы повторяются до обнуления CX. Команда уменьшает значение в регистре CX на единицу и передает управление по прямому адресу — метке, если значение в регистре СХ не равно нулю; в противном случае выполняется следующая по порядку команда. Флаги не меняет. Существуют еще четыре альтернативные команды, в которых можно поставить дополнительные условия. Передачи управления командами типа LOOP только ближние и короткие (метки near и short).
Команды прерывания
У команд прерывания есть некоторая аналогия с командами вызова процедуры CALL: прекращается выполнение текущей программы и осуществляется переход к подпрограмме обработки прерывания; но при прерываниях нет деления на процедуры near или far, так как начальный адрес подпрограммы обработки прерывания (вектор прерывания) берется из таблицы векторов ОЗУ и всегда 32-бито- вый; кроме того, при вызове процедуры в стеке сохраняется только адрес возврата, а при прерывании еще и флаги.
Имеются три команды прерывания.
● INTopr
Прервать (interrupt) выполнение программы и передать управление по одному из 256 адресов (векторов прерывания), определяемых номером прерывания — орг. По этой команде микропроцессор:
● помещает в стек содержимое регистров: FL (флагов), CS (сегмента команд), IP (указателя команд);
● обнуляет флаги TF и IF (флаги системного прерывания и блокировки прерывания);
● загружает в С$ и IP, соответственно, второе и первое слова вектора прерываний, считанного из таблицы векторов в ОЗУ по адресу 4 х opr (4 х номер прерывания); вся таблица векторов занимает 1024 байта, то есть всего может быть 256 различных векторов прерывания. Например, команда INT 1Ah считает из ОЗУ вектор, находящийся по адресу 68h = 4 1АЬ, то есть в регистр CS будет загружен адрес сегмента из слова по адресу 6Ah, а в регистр IP — из слова по адресу 68h смещение программы обработки этого прерывания.
Команда сбрасывает флаги IF = 0 и TF = О.
● INTO
Прервать по переполнению (interrupt if overflow), при возникновении переполнения флаг OF = 1 и управление передается по адресу 10Н (аналог команды INT 4). Команда сбрасывает флаги IF = 0 и TF = О.
● IRET
Возврат из обработки прерывания (interrupt return) обеспечивает возврат из программы обработки прерывания. IRET — последняя команда подпрограммы обработки прерывания, по этой команде из стека извлекаются 3 последние слова и загружаются в регистры IP С$ и FL, при этом содержимое SP увеличивается на 6. Команда устанавливает значения всех флагов.
Напомним, что директивы (псевдооператоры) — это инструкции ассемблеру, они обрабатываются только при ассемблировании (транслирования) программы. Приведем некоторые из часто используемых директив.
Директивы определения идентификаторов
Присваивают идентификатору с данным именем некоторое текстовое или числовое значение (выражение). Формат директив:
имя EQU текст
имя = числовое значение (выражение)
Разница между псевдооператорами EQU и =:
● EQU — присваивает значение постоянно (изменять нельзя), текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т. д.;
● = — выполняет текущее присваивание (значение может быть переназначено, но только при трансляции, естественно); присваивает только числовое выражение, содержащее простые математические преобразования, которые при трансляции и будут выполнены (например: const+ 1, 15Н*4, 3*12/4 и т. п.).
Директивы определения данных
Используются для идентификации переменных и полей памяти. Формат директивы
[имя] D* выражение [,выражение] [....],
Ключевые слова D* могут быть следующими:
● DB — определить байт (1 байт);
● DW/ — определить слово (2 байта);
● DD — определить двойное слово (4 байта);
● DQ — определить 8 байтов;
● DT — определить 10 байтов.
Рассматриваемые директивы объявляют переменную (имя) или присваивают полям (ячейкам) памяти начальные значения; резервируют в памяти (с более поздним присвоением значения) один или несколько байтов — DB, слов — DW/,, двойных слов — DD и т. д.
Выражение показывает, какое количество элементов памяти необходимо выделить и какие данные там должны содержаться. Выражение может быть:
● константой: const DB 56; const DW 1936; const DD 3FFH. Обязательно следует учитывать диапазон и вместимость байта, слова и т. д.; так, для DB константа не может быть больше 255, для DW/ — 65 535, для DD — 65 535' — 1 = = 4 294 967 295;
● вектором или таблицей: table1 DB 30, 4, -15, 0, 0, 0, 56;
table2 DW/ 1936, 3004, 56, 15. В одном псевдооператоре допускается поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (0 в table1) можно использовать псевдооператор DUP (duplicate — дублировать):
table1 DB 30, 4, -15, 3 dup(0), 56);
● строкой символов: str1 DB 'Вы ввели слишком большое число",
str2 DB 'Bad command'; в псевдооператоре DB строка может содержать 255 символов, во всех остальных (DW, DD, DQ, DT) — только 2 символа.
● пустым полем: pole1 DB?; pole2 DW/ 12 dup(?), при этом в элементы резервируемой памяти при загрузке программы ничего не записывается (заносится не 0, как, например, в директиве pole3 DW/ 5 dup(0), а просто резервируются ячейки памяти);
● символическим именем переменной: чаг1 DW disp; чаг2 DD vector (одна переменная определяется адресом другой, в директивах указывать offset не надо, поскольку имя переменной воспринимается как ее адрес). Такой вариант подходит, например, для хранения адресов ячеек памяти, меток, на которые допустимо ссылаться в программе (чаг1 DW/ disp), причем, если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байта), то есть обойтись DW; если же переменная находится в другом сегменте, то необходимо указать и сегмент, и смещение (всего 4 байта), то есть следует использовать уже DD (var2 DD vector);
●простым выражением: fn1 DB 80*3; fn2 DW/ (disp) + 256, вычисляемым, разумеется, только при трансляции программы.
Директивы определения сегментов и процедур
Сегмент определяется псевдооператорами:
Имя_ сег segment
имя _сег ends
В программе можно использовать четыре сегмента (по числу сегментных регистров) и для каждого указать соответствующий регистр сегмента псевдооператором ASSUME (assume присвоить), например:
codeseg sedment
assume CS:codeseg, DS:dataseg. SS:stackseg
codeseg ends
В директиве ASSUME регистр сег :имя сег [, ], в частности ASSUME cs:codeseg, указывается, что для сегмента имя сег (codeseg) выбран регистр сег (CS). После директивы ASSUME следует явным образом загрузить адрес начала сегмента данных в регистр DS:
mov АХ, dataseg mov DS. АХ
Подобная же инициализация сегментных регистров С$ и SS выполняется автоматически.
Процедура определяется псевдооператорами:
имя процедуры proc [farj ...
ret
имя процедуры endp
При определении процедуры после ключевого слова ргос должен быть указан атрибут дистанции near или far; если этого атрибута нет, то по умолчанию подразумевается near. Обычно процедура должна заканчиваться командой ret (return). Если процедура объявлена как near, то обращение к ней (call) должно производиться из того же сегмента; если proc far, то из любого сегмента (в этом случае командой ret из стека при возврате будет извлечено два слова: для IP и для CS).
Директивы управления трансляцией
Их несколько, наиболее часто используется END. Директива END отмечает конец программы и указывает ассемблеру, где завершить трансляцию. Формат: END [имя программы.]
Краткие сведения о программировании процедур работы с устройствами ввода-вывода
Процедуры ввода-вывода в ПК выполняются, как правило, по прерываниям. Состав и использование основных видов прерываний и служебных функций DOS прерывания 21Н рассмотрены в работах [10, 35]. Ниже мы кратко остановимся на вопросах программирования ввода-вывода лишь прерываний для отображения информации на дисплее, ввода с клавиатуры, вывода на принтер и работы с файлами.
Программирование работы с дисплеем
Задание режимов работы и обмен данными с дисплеем можно выполнять при: прерываниях BIOS типа 1ОН, а вывод данных на дисплей и при прерываниях DOS типа 21Н. Для уяснения отличий прерываний BIOS от прерываний DOS рассмотрим в качестве примера несколько функций видеопрерываний BIOS.
Видеооперации с прерыванием 10Н BIOS
Это прерывание обеспечивает выполнение 16 различных процедур работы с дисплеем (идентифицируются содержимым регистра АН). Приведем самые важные из них.
1. Перемещение курсора в заданную позицию: АН = 2.
Координаты курсора (строка, столбец) предварительно засылаются, соответственно, в регистры ОН, 01 В регистре BH указывается номер страницы буфера: по умолчанию и в графическом режиме ВН = 0.
2. Очистка экрана дисплея: AH = 6 и AL =0, или AH = 7 и AL =0.
3. Чтение символа, находящегося в текущей позиции курсора и его атрибута, (только для текстовых режимов): AH = 8. В регистре ВН указывается номер страницы буфера. Считанный символ возвращается в AL, а его атрибуты в AH (атрибуты символа — это его характеристики: цвет, цвет фона, яркость, инвертирование, мигание и т. д.).
4. Установка видеорежима изображения (текстовый, графический, цветность, формат, разрешающая способность и т. п.): AH = 0. Видеорежим определяется: содержимым регистра AL.
5. Запись новых атрибутов символа и вывод символа в текущую позицию курсора: АН = 9. Прочие регистры должны содержать:
● AL — записываемый символ;
● BL — его атрибуты или цвет (в графическом режиме);
● ВН — номер видеостраницы;
● СХ — счетчик записываемых символов (число повторений символа).
6. Вывод символа в текущую позицию курсора: АН = 9 и BL = О. Содержимое А ВН и CX аналогично п. 5.
7.Чтение текущего видеостатуса: АН = OF11. Возвращает в: AL — текущий режим; АН — число столбцов на экране; ВН — активную страницу буфера.
8.Вывод строки символов: AH = 1311 и AL = О. Прочие регистры должны содержать:
● ES:ВР — указатель строки (ее начальный адрес в памяти);
● СХ — длину строки;
● DX — строку дисплея;
● BH — номер страницы буфера.
Видеооперации с прерыванием 21Н DOS
● Вывод символа на экран дисплея: АН = 2 или АН = 6 и DL <> OFF11. В регистре DL должен быть ASCII-код символа. Пример фрагмента программы (вывод символа «C» ):
mov АН. б
mov DL, 43H : 43H — это ASCII-код символа «С»
int 21Н
●Вывод строки символов: АН = 9 (чаще всего используемая функция). В регистрах DS:DX должен находиться начальный адрес строки символов, которая обязана заканчиваться символом 3. Пример фрагмента программы (отображение текста вывод строки символов):
Text db 'вывод строки символов mov АН, 9
mov DX, offset text : это адрес выводимой строки
int 21Н
●Ввод-вывод из файла через логический номер. Стандартные файловые логические номера определяют тип и устройство ввода-вывода:
● 0 — ввод с клавиатуры;
● 1 — вывод на экран дисплея;
● 2 — вывод на экран сообщения об ошибке;
● 3 — ввод-вывод на внешнее устройство;
● 4 — вывод на печать.
Для ввода предназначена функция AH = 3Fh прерывания 21Н, для вывода служит функция AH = 4011 прерывания 21H. В регистр CX предварительно заносится число вводимых- выводимых байтов, а в регистр DX записывается начальный адрес поля памяти для ввода-вывода. В случае успешного завершения процедуры ввода-вывода обнуляется флаг переноса CF, а в регистре AX возвращается количество фактически переданных байтов. При неудачной операции флаг CF устанавливается в 1, а в регистр AX заносится код ошибки. Приведенный ниже пример содержит фрагмент программы для вывода на экран текстового файла Text, содержащего 50 байт.
Программирование работы с клавиатурой
При программировании работы с клавиатурой могут быть использованы прерывание 16Н BIOS и прерывание 21Н (AH = 1, 6, 7, 8, А, В, С) DOS.
Прерывание 16Н BIOS предусматривает достаточно простые операции обмена данными с клавиатурой, полезные при написании программ, выполняемых независимо от операционной системы DOS. Так, при AH = 0 и 1 считываются из буфера клавиатуры scan-код клавиши в регистр AH и ASCII-код клавиши в регистр AL; при АН = 2 в AL возвращается байт состояния клавиатуры — состояние управляющих клавиш: Shift, Ctrl, Alt, Scroll Lock, Num Lock и Insert; при AH = 3— устанавливаются режимы работы клавиатуры в IBM PCjr.
Ввод с клавиатуры по прерыванию 21Н DOS предполагает следующее:
1. Чтение символа с клавиатуры (с ожиданием ввода) и отображением символа на экране дисплея: AH = 1 или AH = 6 и DL = OFF11; то же, но без эха-отображения символа на экране дисплея: АН = 7 или АН = 8. Считанный символ (ASCII-код) помещается в регистр AL (scan-код не передается). Если к моменту запроса на чтение символа клавиша еще не нажата, то управление прерванной программе не будет возвращено до тех пор, пока это не будет сделано. Если код клавиши расширенный (клавиши F1 — F10, Alt, Ctrl и т. д.), необходимо повторное чтение. Пример фрагмента программы чтения символа:
mov АН, 1 1nt 21Н
2. Чтение строки символов с буферизацией: AH = OAh. Для инициализации такого чтения необходимо:
● задать буфер, указав в нем число символов строки, подлежащих вводу, директивой: buf DB n, О,
● (buf — имя поля, которое, в принципе, может быть и любым другим); количество нулей в директиве должно быть на 2 больше, чем n (n — максимальное количество вводимых символов), на место следующего нуля будет после ввода записано количество фактически введенных символов, на место последующих «О» будут введены ASCII- коды символов строки и еще один 0 для ко
да клавиши Enter — 13;
● занести в регистр DX адрес буфера.
При выполнении рассматриваемого прерывания управление прерванной (основной) программе не возвратится до тех пор, пока не нажаты все нужные клавиши и клавиша Enter. При нажатии каждой очередной клавиши ее код записывается в буфер клавиатуры и отображается на дисплее, но из буфера по- ступит в основную программу (в поле buf) только после нажатия клавиши Enter. Если до Enter клавиш нажато больше, чем указано в буфере, то раздастся звуковой сигнал и лишние символы восприняты не будут.
Пример фрагмента программы чтения строки символов: buf DB 9.0,0,0,0,0.0.0.0.0.0,0
mov АН, ОАН
mov DX. offset buf tnt 21Н
В поле буфера будут записаны ASCII-коды символов строки, и, если в программе предусмотрены операции над двоичными кодами символов (цифр) строки, то есть она предполагает ввод числового значения, то необходимо преобразовать ASCII-коды в двоичный код числа.
3. Чтение состояния клавиатуры: AH = OBh. В регистр AL записывается 0, если в буфере клавиатуры содержится хотя бы один символ.
4. Очистка буфера клавиатуры и вызов функции: AH = 0Ch. Обнуляется буфер клавиатуры и инициируется выполнение одной из пяти функций прерывания 21Н; в этом случае номер вызываемой функции должен быть записан не в регистре AH, а в регистре AL (AL = 1, 6, 7, 8 или OAh).
5. Ввод с клавиатуры (из файла через логический номер): AH = 3Fh. Используется функция расширенного управления файлами MS DOS по файловому указателю. Ниже приведен пример фрагмента программы для ввода с клавиатуры файла text, содержащего 50 байтов:
text db 50 dup(' ') ; указание поля памяти для ввода
mov АН. ЗГН
mov ВХ, 0 ; указание устройства ввода
mov СХ, 50 ; указание числа вводимых байт
mov DX, offset text ; указание начального адреса ; поля памяти для ввода tnt 21Н
Программирование работы с принтерами
При работе с печатающими устройствами могут быть использованы прерывания: 14Н и 17Н BIOS и 21Н (AH = 4 и 5) DOS. Следует различать программирование для печатающих устройств параллельного типа (информация передается на принтер побайтовое по 8-битовой шине) и печатающих устройств последовательногo типа (информация передается по одному проводу последовательно по 1 биту), подсоединяемых к любому последовательному порту микропроцессора.
Печатающие устройства параллельного типа
●прерывание 17Н BIOS (номер принтера предварительно указывается в регистре DX):
● послать 1 символ в устройство печати: AH = О. ASCII-код символа предварительно должен быть помещен в регистр AL В регистре AH после завершения вывода символа возвращается признак успешности результата;
● инициировать принтер (посылка в порт служебных кодов): AH = 1;
● получить состояние принтера (в регистре АН): AH = 2. прерывание 21Н DOS, AH = 5:
● вывести на печать один символ: AH = 5. ASCII-код символа предварительно записывается в регистр DL Фрагмент программы печати символа С (ASCII-код символа С равен 43h):
mov АН, 5
mov DL, 43Н int 21Н
Если необходимо отпечатать строку, то следует, используя это же прерывание, организовать вывод символов в цикле, каждый раз помещая в регистр DL ASCII-код очередного символа, а в конце строки и код CR возврата каретки (ASCII-код = 13) и/или LF.
Печатающее устройство имеет свой буфер, где накапливает поступающие символы, пока не дождется символа CR или LF (поэтому возможна печать строки и в обратном направлении).
● Вывести на печать текстовый файл: АН = 40h. Используются функции расширенного управления файлами MS DOS по файловому указателю. Пример фрагмента программы для вывода на печать текстового файла, содержащего 50 байтов:
text db 50 dup(' ')
mov АН, 40Н
mov ВХ, 4 ; указание устройства вывода
mov СХ, 50 : указание числа выводимых байтов
mov DX, offset text ; указание начального адреса ; поля памяти содержащего текст
int 21Н
Печатающие устройства последовательного типа
● прерывание 14Н BIOS (номер последовательного порта записывается в регистр DX):
● инициализация параметров последовательного порта: АН = 0;
● послать в порт один символ (если к порту подсоединен принтер, то и печать): АН = 1 и др.
● прерывание 21Н DOS, AH = 4 (номер последовательного порта записывается в регистр DX):
● вывести на печать один символ: AH = 4. ASCII-код символа предварительно помещается в регистр DL;
● далее аналогично прерыванию 21Н DOS, AH = 5 для принтера параллельного типа и др.
Программирование работы с файлами
Файл — выделенная по какому-либо признаку поименованная совокупность информационных записей, хранящихся на диске. Каждой записи в пределах файла присваивается порядковый (тем самым уникальный) номер. Запись идентифицируется своим адресом: адрес записи = имя файла номер записи.
Файловая система поддерживает два типа доступа к записям файла:
●последовательный метод доступа;
● прямой метод доступа.
Механизм доступа к файлу и его записям при программировании также имеет два варианта:
● доступ к файлу с использованием специальной таблицы — управляющего блока файла (FCB);
● доступ к файлу по идентификатору (ASCIIZ) и логическому номеру. Использование FCB для обращения к файлу позволяет реализовать и произвольный, и последовательный методы организации доступа, но часто оказывается довольно сложным, поэтому на практике, если не требуется выполнять детализированные процедуры с отдельными дорожками и секторами диска, чаще применяется обращение к файлу по идентификатору.
Прерывания, используемые при работе с файлами на дисках
Прерывания BIOS:
● 13Н — обмен данными с жестким диском (при его отсутствии — с гибким диском);
● 40Н — обмен данными с гибким диском (если есть жесткий диск).
Эти прерывания обеспечивают выполнение многих функций, определяемых содержимым регистра AH, и полезных при разработке вспомогательных программ,
и средств защиты от копирования, поскольку они позволяют выполнять операции с отдельными дорожками и секторами диска.
Прерывание DOS 21Н. Имеется несколько десятков различных вариантов прерывания 21Н (определяемых содержимым регистра АН), реализующих так называемые универсальные функции управления файлами при наличии любых версий MS DOS (использующих при обращении к файлам FCB) и несколько десятков вариантов прерывания, предоставляющих так называемые расширенные функции управления файлами при наличии версии MS DOS 2.0 и выше (через строку ASCIIZ). Ниже обсуждаются лишь наиболее популярные варианты прерывания 21Н DOS, реализующие расширенные функции управления файлами.
При прерываниях этого типа файл полностью идентифицируется ASCIIZ- строкой, а после открытия файла — логическим номером, присваиваемым файлу при его создании и открытии (после закрытия файла его логический номер освобождается).
Вот сводка некоторых служебных функций DOS прерывания 21Н, О AH = 3Ch — создание файла: формируются ASCIIZ-строка, идентифицирующая файл, и атрибут файла; вектор-адрес ASCIIZ- строки файла помещают в регистры DS:DX, в регистр СХ помещают атрибут файла; в регистре AX возвращается логический номер файла.
● AH = 3Dh — открытие файла: вектор-адрес ASCIIZ-строки помещают в регистры DS:DX, в регистр AL записывается признак возможной работы с файлом (AL = 0 — файл открывается только для чтения, AL = 1 — только для записи, AL = 2 — и для чтения, и для записи); в регистре AX возвращается логический номер файла.
● AH = 3Eh — закрытие файла (высвобождение его логического номера): логический номер помещают в регистр ВХ.
● АН = 3Fh — чтение из файла: в регистр ВХ помещают логический номер, в CX — число считываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), отведенного для записи считываемой информации; число фактически считанных байтов возвращается в регистре AX.
● AH = 40h — запись в файл: в регистр ВХ помещают логический номер, в СХ— число записываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), хранящего записываемую информацию; в AX возвращается число фактически записанных байтов.
● AH = 41Ь — удаление файла: в регистры DS:DX заносится вектор-адрес ASCIIZ-строки файла.
● АН = 4211 — установка указателя текущей записи в файле: в регистр BX заносится логический номер, в регистр AL — указание на базовую установку указателя текущей записи (AL = 0 — начало файла, AL = 1 — прежнее значение текущей записи, AL = 2 — конец файла), в регистры СХ:DX — смещение указателя относительно базовой позиции (чаще всего); в регистрах ОХ:АХ возвращается смещение текущей записи файла относительно начала файла.
● АН = 4311 — установка новых атрибутов файла: в регистры DS:DX заносится адрес ASCIIZ-строки файла, в СХ — значения атрибутов, в А~ находится «1» (если в AL — «0», то происходит чтение атрибутов, которые возвращаются в СХ).
● AH = 56}1 — переименование файла: в регистровой паре DS:DX указывается адрес ASCIIZ-строки со старым именем файла, в регистры ES:
● заносится адрес ASCIIZ-строки с новым именем файла.
Во всех перечисленных случаях при появлении ошибки в выполнении процедуры в регистре FL флаг CF устанавливается в «1»; код ошибки возвращается в регистре АХ.
Ниже приводятся фрагменты программ работы с файлами по ASCIIZ-строке при следующих форматах данных:
Некоторые аспекты создания исполняемых программ
Язык ассемблер удобен тем, что, с одной стороны, он позволяет писать программы на уровне команд микропроцессора, с другой стороны, не требует использования и, соответственно, запоминания множества числовых кодов этих команд. Исходная программа, составленная на языке ассемблер, использующая мнемонические сокращения английских слов и введенная в машину с использованием любого текстового редактора (Word, NE, Brief, Xedit, Lexicon и т. д.), оформляется в виде файла с расширением ASM; после обработки исходной программы программой-ассемблером (ASM, MASM или TASM) формируется программа в машинных кодах — объектная программа с расширением OBJ, уже понятная микропроцессору (ASM выдает только коды ошибок, обнаруженных при трансляции, а MASM предоставляет более развернутую информацию об этих ошибках; MASM, в отличие от ASM, позволяет использовать в программах команды, ориентированные на современные микропроцессоры и сопроцессоры; возможности у TASM еще несколько шире, чем у MASM, но в настоящее время продолжает развиваться только MASM).
Объектная программа еще не является законченной и исполняемой микропроцессором: в ней окончательно оформлены еще не все адреса (программа является перемещаемой) и не объединены части (блоки), оттранслированные отдельно друг от друга (например, с целью более простой их отладки). Преобразование объектной программы в исполняемую (компоновка объектной программы) выполняется редактором связей LINK (либо TLINK). Исполняемый файл после загрузки имеет расширение ЕХЕ. Отладку исполняемой программы удобно выполнять с помощью отладчика DEBUG.
Процедуры формирования программы
Последовательность процедур формирования программы. показана на рис. 9А.
1. Составление программы и ее ввод под каким-нибудь именем на диск (дискету). При вводе программы используется любой текстовый редактор, например встроенный редактор Norton Commander.
2. Трансляция (ассемблирование) программы. При запуске транслятора MASM
вводится строка вида МАЯМ с:prog.asm или просто МАЯМ.
Появится запрос: Surce filename [.asm]. Следует указать путь к файлу и имя
исходного файла, если оно не было указано ранее. В ответ на запрос Object
filename [prog.obj) ввести имя объектной программы (объектного модуля), если оно отличается от имени исходного файла (иначе следует нажать клавишу Enter). Если нужен листинг программы в машинных кодах, в ответ на Source listing [nul.lst] укажите местоположение и имя формируемого файла, иначе— нажмите клавишу Enter. Для получения листинга перекрестных ссылок программы в ответ на Cross-reference [nul.crf] укажите местоположение и имя формируемого файла, иначе — нажмите клавишу Enter.
Альтернативный вариант вызова ассемблера: МАЯМ [c:]prog, с:, с:, с:. Листинг — распечатка, файл для распечатки; листинг программы содержит программу исходную и в машинных кодах, а также обнаруженные при трансляции ошибки в программе. Листинг перекрестных ссылок показывает имена переменных и номера строк программы, где эти переменные используются.
3. Компоновка объектного модуля (загрузка и редактирование связей). Вводится: LINK с:prog.obj или просто LINK. Появится запрос Object modules [.obj].
Следует указать имя файла .OBJ, если оно не было указано ранее. Следующий запрос: Run file [prog.exe]; если имя исполняемой программы другое, то следует его ввести, иначе — Enter. List file [nul.map], следует ввести CON; MAP-файл содержит таблицу имен и информацию о размере сегментов, а также ошибки, обнаруженные при загрузке; ввод CON означает требование вывода их на экран дисплея. Запрос Libraries [.Iib]:
нажмите Enter, если при сборке дополнительных библиотек связей не требуется. Альтернативный вариант вызова загрузчика: LINK [с:]prog.obj, с:, соп.
4. Отладка программы (при необходимости). Можно использовать отладчик
DEBUG. Вызов отладчика DEBUG: DEBUG c:prog.exe.
5. Выполнение программы.
При наличии приглашения к работе MS DOS ввести имя программы: с:prog[.ехе].
Структура программы на языке ассемблер для получения исполняемого файла формата ЕХЕ
Операционная система MS DOS предъявляет некоторые обязательные требования к структуре ASM-программы, предназначенной для последующего создания ЕХЕ- файла.
● Программа может использовать четыре сегмента памяти, начальные адреса которых должны быть загружены в регистры микропроцессора CS, SS, DS и ES, а сами сегменты в явном виде определены в программе в виде операторных скобок: имя сегмента segment ... имя сегмента ends (версии MS DOS 4.0 и выше допускают более простое указание сегментов в программе: имя сегмента).
● В программе должно быть указание, какие сегментные регистры закрепляются за используемыми сегментами памяти; при исполнении программы сегментные регистры CS, SS, ES в соответствии с этими указаниями загружаются автоматически.
●Сегмент данных Ds в ЕХЕ-программе не может быть загружен автоматически, поскольку он используется программным загрузчиком для формирования начального адреса служебной области памяти — префикса программного сегмента (PSP), непосредственно предшествующего любой исполняемой программе ЕХЕ. Регистр сегмента данных DS должен быть инициирован принудительно — для этого следует в самом начале ASM-программы записать в стек вектор-адрес возврата к служебной области PSP: содержимое регистра DS и нулевое смещение, а затем в регистр DS загрузить адрес сегмента данных. PSP — это группа служебных слов в оперативной памяти, формируемая для каждой загружаемой программы пользователя и занимающая обычно 256 байтов (100Ь). При запуске программы пользователя в ОЗУ автоматически формируется PSP, и ее начальный адрес помещается в регистр DS.
●Обеспечение после завершения выполнения программы возврата к префиксу программного сегмента; проще всего это можно сделать, оформив обращение к исполняемой программе в виде обращения к процедуре (главной процедуре, обязательно с атрибутом far) и поместив в конце программы команду воз- врата ret (выход из программы можно выполнить также, используя прерывание 20Н DOS или функцию 4С11 прерывания 21Н DOS, но управление при этом передается не в PSP, а непосредственно в резидентную часть программы COMMAND.СОМ).
Рассмотрим программу расчета сложных процентов. Капитал Q вкладывается в некоторое мероприятие, обеспечивающее ежегодный прирост капитала D%. Задача: определить текущую величину капитала в течение
Основные сведения о листинге и его структуре
Листинг (распечатка) программы на ассемблере используется как при создании ассемблерных программ, так и в качестве источника информации для квалифицированных программистов при отладке и оптимизации программ, написанных на языках высокого уровня. Ни один другой компилятор и его листинг не дает программисту такого количества полезной технической информации, как ассемблер. Ведь одна из основных целей использования языков высокого уровня — как раз желание избежать не очень существенных технических подробностей. Но если программист хочет разобраться с подробностями созданной программы, то большинство отладчиков могут распечатать объектный эквивалент созданной программы на языке ассемблер. Эти распечатки позволяют программисту оценить качество программы и являются весьма полезными при ее оптимизации. Листинг состоит из 2-х частей: из листинга программы и сводной информации, о сегментах и идентификаторах программы.
Листинг программы имеет три столбца, в которых отображаются команды исходной ассемблерной программы и соответствующие им объектные коды:
● левый столбец содержит шестнадцатеричное значение смещения адреса команды (счетчик команд — IP) от начала сегмента;
● правый столбец содержит операторы и псевдооператоры ассемблера (команды и директивы программы);
● в средней части размещены коды: для сегмента стека и сегмента данных числа, запоминаемые в соответствующих ячейках памяти; для сегмента, команд это коды машинных команд МП, соответствующих операторам ассемблера.
Сводная информация о сегментах и идентификаторах дает подробную их характеристику.
В конце листинга приводятся сообщения об ошибках в программе.
При ассемблировании и редактировании связей могут быть получены еще двафлистинга с дополнительной информацией:
● карта перекрестных ссылок указывает номер строки программы, в которой определен каждый идентификатор, и номера тех строк, в которых имеются на него ссылки (этот листинг можно получить, если на запрос ассемблера о перекрестных ссылках (Cross references) ввести имя файла prog (а не Nul.CRF по умолчанию), при этом в основном листинге программы добавится столбец с номерами строк);
● карта распределения памяти содержит подробные сведения о сегментах всех блоков программы, объединяемых редактором связей LINK (листинг содержится в файле
prog.map).
Особенности структуры машинных команд
Объектные коды, приведенные в среднем столбце листинга — это, по существу, машинная исполняемая (.ЕХЕ или .СОМ) программа, записанная в шестнадцатеричных кодах. Структура команды в исполняемой программе может существенно быть не похожа на породившую ее команду ассемблера. Например, стандартная двухадресная команда типа mov, add, sub, and и т. д. с адресацией типа m, r или r, m в исполняемой программе способна занимать четыре байта:
Первый байт (байт кода операции) содержит код операции (КОП) и два одно битовых поля: d (направление) и w (слово). Поле б определяет направление передачи данных (записи результата) внутри команды. Если d = 1, то передача производится в reg, если d = О, то происходит передача из reg. Поле w определяет' формат данных: слово (w = 1) или байт (w = 0).
Второй байт команды (байт способа адресации) имеет три поля: reg (адрес регистра, где находится один из операндов), mod (режим адресации) и r/m (регистр/память). Если mod = 11, то второй из операндов тоже в регистре и поле r/m — адрес этого регистра. Если mod 11, то второй из операндов в памяти, причем при mod = 00: disp = 0 — смещение отсутствует (нет полей dispL и dispH), при mod = 01: disp = dispL — старший байт смещения отсутствует, при mod = 10: disp =
Если mod = 00 и r/m = 110, dispL — исполнительный адрес находится в команде (прямая адресация).
Третий и четвертый байты команды рассматриваемой структуры содержат 16-битовый код смещения поля памяти второго операнда (dispH — старший байт, dispL — младший байт).
Более подробно с объектными кодами команд ассемблера можно познакомиться в работах [10, 35].
Последовательность работы ПК ~ при выполнении программы
Программа решения задачи состоит из последовательности команд, которые выполняются, друг за другом. Исключения составляют команды передачи управления, изменяющие естественный ход выполнения программы путем передачи управления по указанному в них явному или неявному адресу.
Каждая команда программы начинает исполняться сразу, как только ее адрес (смещение) поступит в регистр микропроцессора Instruction Pointer (IP). Для выполнения любой, даже самой короткой команды в МП типа CISC требуется несколько тактов.
1. Первый такт у всех команд одинаковый — по адресу, поступившему в IP, выполняется считывание кода команды и передача этого кода в блок регистра команд (БРК) микропроцессора. Более подробно последовательность работы машины на этом такте можно описать следующим образом (здесь и далее указываются только основные управляющие сигналы):
● в регистр IP поступает сигнал считывания информации, и считанный код адреса смещения команды поступит на вход узла формирования адреса в УУ;
● на второй вход этого устройства из МПП поступит считанный из регистра сегмента кода (CS) начальный адрес кодового сегмента;
● в УФА эти коды сложатся и сформируется абсолютный адрес команды z5г. формуле
● абсолютный адрес по кодовым шинам адреса (КША) поступит в регистр адреса оперативного запоминающего устройства (ОЗУ), и будет подготовлена соответствующая этому адресу ячейка памяти для считывания информации;
● в ОЗУ поступит управляющий импульс считывания, и код команды из, ячеек памяти будет передан на кодовые шины данных (КШД). Количество считанных ячеек зависит от длины кода считываемой команды;
● по КШД код команды пройдет на регистр данных ОЗУ и будет записан обратно в ячейки памяти, из которых он считывался (будет регенерирован);
● одновременно по тем же КШД код команды пройдет в УУ и будет записал в БРК.
Второй и последующие такты команды зависят от кода этой команды, и в первую очередь, от кода операции (КОП). Рассмотрим дальнейшую работу ПК применительно к выполнению ассемблерной команды ADD АХ, Pole.
2. В соответствии с данной командой на втором такте должен быть расшифрован код операции команды для определения набора управляющих сигналов, необходимых для выполнения команды, из регистра AX считано первое число, участвующее в операции, и это число помещено в регистр Per f АЛУ. Для этого:
● в начале второго такта выполнения команды код операции, соответствующий мнемонике ADD, поступит из БРК на вход дешифратора операций (ДШО) устройства управления, в котором по данному коду будет выбрана одна из шин;
● эта шина является адресной шиной ПЗУ микропрограмм, инициирующей группу ячеек памяти, содержащих сигналы, необходимые для управления выполнением операции сложения. Под действием этих управляющих сигналов в этом же втором такте из БРК будет считан адрес первого числа — AX, код которого пройдет транзитом через УФА и по КША поступит в МПП;
● в МПП будет подготовлен для работы регистр AX и из этого регистра будет считано первое число, которое по КШД пройдет в Per f АЛУ.
3. На третьем такте выполнения команды ADD АХ, Pole из инициированных ячеек ПЗУ микропрограмм будут считаны сигналы, которые выполнят следующие действия:
● считают второй адрес из команды, находящейся в БРК. Символическое имя этого адреса Pole, но в коде машинной команды будет находиться уже двоичный код адреса взятый из таблицы адресов именованных полей памяти (эту таблицу можно видеть в конце листинга программы);
● передадут этот адрес на вход УФА. На второй вход УФА поступит начальный адрес сегмента данных из регистра DS. В УФА будет сформирован абсолютный адрес второго числа:
● адрес А по КША пройдет в ОЗУ, где по этому адресу будет считано второе число;
● по КШД считанное число поступит в Рег2 АЛУ и обратно в ОЗУ для pereнерации.
4. На четвертом такте все управляющие сигналы поступят в АЛУ, где: О число из Рег1 будет передано на один вход сумматора;
● число из Рег2 будет передано на второй вход сумматора;
● в сумматоре числа сложатся, и сумма поступит в Per f АЛУ.
5. В пятом последнем такте выполнения команды ADD АХ, Pole сумма чисел из
АЛУ должна быть передана и записана в регистр AX МПП, а в регистре IP— сформирован адрес смещения следующей команды программы. Для этого:
● из кода команды в БРК будет считан первый адрес — AX, который транзитом через УФА пройдет по КША в МПП, где инициирует для приема информации регистр AX;
● из Рег1 АЛУ будет считана сумма чисел, которая по КШД пройдет на вход МПП и будет записана в регистр AX;
● в регистр IP будет добавлено число 6, равное длине выполненной команды (в нашем случае команда ADD AX, Pole имеет длину 6 байтов);
Поскольку в регистре IP сменился код адреса смещения, ПК приступит к выполнению следующей команды программы.
В случае выполнения команд передачи управления в конце такой команды к содержимому IP добавится не длина выполненной команды, а разность между адресом смещения текущей команды и адресом смещения команды, к которой передано управление (при передаче управления в другой сегмент будет измене- но и содержимое регистра С$).
Краткие сведения об отладчике программ DEBUG
Программа DEBUG обеспечивает интерактивную отладку программ в формате EXE- и СОМ-файлов. Обычно он используется для отладки исполняемых программ, полученных с языка уровня ассемблера. Он позволяет отлаживать и исполняемые файлы .EXE и .СОМ, скомпилированные с языков более высокого уровня.
Отладчик DEBUG умеет:
● прослеживать выполнение и управлять выполнением программ;
● вносить изменения в ход выполнения и данные отлаживаемой программы;
● вводить небольшие программы на языке ассемблер, выполнять ассемблирование этих программ и создавать исполняемые программы с расширением СОМ;
● выполнять преобразование машинных шестнадцатеричных кодов команд в формат языка ассемблер (деассемблирование);
● отображать текстовые файлы в ASCII и шестнадцатеричном формате;
● просматривать и изменять содержимое регистров памяти МП и ячеек основной памяти;
● загружать информацию с дисковых накопителей в основную память и наоборот (считывать информацию с дисков и записывать на них);
● осуществлять поиск конкретных данных в текстах сообщений и программ (с выдачей адреса их хранения);
● просматривать регистр флагов с отображением мнемокодов значений этих флагов (см. табл. 9.2).
Для вызова отладчика DEBUG следует набрать в командной строке DOS слово debug и, если необходимо, имена файлов, с которыми мы будем работать, на- пример: debug prog.exe. Приглашение к вводу команд — «-». После завершения работы с DEBUG для выхода из него следует набрать q. После набора каждой команды следует нажимать Enter.
Основные команды отладчика DEBUG
● N (name) — объявление имени файла.
● R m (register) — отображение на экране дисплея содержимого регистра памяти МП с именем m. Если m не указано, показывается содержимое всех регистров памяти МП, вектор-адрес следующей команды (С$:IP), машинный и мнемокод этой команды, например:
-R
АХ=0005 ВХ=0005 СХ=0000 DX=0001 SP=FFEE ВР=0000 SI-0000 DI=OOOO DS-1А8Е ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC 1А8Е:010А 881500 МОУ АХ,0015;
Если отображается содержимое одного регистра, то команда R позволяет изменить его содержимое:
-R ах
АХ 0005 :45
-R ах
AX 0045
● А n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — начальный вектор-адрес машинных команд.
Пример ввода программы:
-А 100
1А8Е:0100 ах,15 1А8Е:0103 mov bx.5
1A8E:0106 add ах. 1ABE:0108 1A8E:010А
U n1, n2 LI (unassembler) — преобразование машинных кодов команд в команды на языке ассемблер и отображение их на экране дисплея, п1 — вектор- адрес первой, а n2 — смещение последней из машинных команд, подлежащих деассемблированию, 1 — длина программы (может указываться либо п2, либо LI). Пример деассемблирования программы:
-0100 la 1АBЕ:0100 881500 MDV АХ,0015 1АВЕ:0103 880500 МОЧ ВХ,0005 1АВЕ:0106 0108 ADD АХ,ВХ 1АВЕ:0108 F7FЗ DIV ВХ
Т k (tracing) — выполнение очередных k команд программы: если k не указано, то выполняется одна команда (пошаговая трассировка программы). Команды обращения к процедурам и внутренние прерывания командой Т не выполняются, так как по Т будут последовательно выполняться команды процедуры и команды обработки прерывания соответственно. В этих случаях следует использовать команду процедурной трассировки P (procedure), почти аналогичную команде Т, но позволяющую автоматически полностью выполнять встречающиеся при трассировке процедуры, или команду G n. После выполнения
команд (команды) на дисплей выводится: О содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL показываются в мнемокоде (см. табл. 9.2);
У*
● вектор-адрес (CS:IP);
● машинный и мнемокоды текущей команды. Пример трассировки программы: R
АХ=ОООО ВХ=ОООО СХ=ОООО DX0000 DS 1A8E ES-1АBЕ SS=IABE CS=1ABE 1АBЕ:0100 881500 МОЧ АХ.0015
АХ=0015 ВХ=ОООО СХ=ОООО DX=OOOO DS-1АBЕ ES=1ABE SS=1ABE CS 1ABE 1АВЕ:0103 880500 МОЧ ВХ.0005
АХ=0015 ВХ=0005 СХ=ОООО DX=OOOO DS 1A8E ES=1A8E SS=1A8E CS 1A8E 1АВЕ:0106 0108 ADD АХ.ВХ
АХ001А ВХ=0005 СХ=ОООО DX-0000 DS=1A8E' ES=1A8E SS=1A8E CS=1A8E 1АBЕ:0108 F7FЗ DIV ВХ
АХ=0005 ВХ-0005 CX=OOOO DX=0001
DS 1A8E ES-1АВЕ SS=1ABE CS=1ABE
1АBЕ:010А 48 DEC АХ SP=FFEE ВР=ОООО SI=0000 DI=0000
IP=0100 NV UP EI PL NZ NA PD NC
SP=FFEE BP OOOO SI=OOOO DI=OOOO IP-0103 NV UP EI PL NZ NA РО NC
SP-FFEE ВР-0000 SI 0000 DI=0000 IP=0106 NV UP. EI PL NZ NA РО NC
SP=FFEE ВР=ОООО SI 0000 DI=OOOO IP=0108 NV UP EI PL NZ NA РО NC
SP=FFEE ВР-0000 SI-0000 DI=OOOO IP 010A NV UP EI PL NZ NA РО NC
G n (go) — выполнение ЕХЕ- или СОМ- программы до команды с вектор- адресом п, при отсутствии п программа отрабатывает до конца.
После выполнения команд (команды) на дисплей выводятся:
● содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);
● флаги регистра FL выводятся в мнемокоде (см. табл. 9.2);
● вектор-адрес (CS IP), машинный и мнемокод текущей команды. После выполнения программы получим: -g 10а
АХ0005 ВХ0005 СХ-0000 DX=0001 SP FFEE BP 0000 SI 0000 Dli0000 DS=1A8E ES-1АВЕ SS 1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC 1АВЕ:010А 48 ОЕС АХ
● D n, s Lk (dump) — отобразить на экране дисплея содержимое k ячеек памяти, начиная с ячейки по вектор-адреса n (по умолчанию n — текущий вектор-адрес + 1 и k = 128), то есть, нажав клавиши D и Enter, можно посмотреть следующие 128 ячеек:
Частные случаи:
● если L и k не указаны, то до ячейки, имеющей в том же сегменте, смещение равное S;
● если S не указано, то показываются k ячеек памяти в частности:
● п Lk— одна ячейка памяти с вектор- адресом n);
Примеры: -D Зb43 LЗ
1АВЕ:3840 бС 6С 65 11е -0 Зb43 Ll
1АВЕ:3840 бС 1
● если S и Lk не указаны (есть только D n), то отображаются 128 ячеек памяти, например:
Содержимое выводится в шестнадцатеричном коде и в соответствующих символах ASCII (символы расширенного набора ASCII замещаются точкой (.)).
● Е п "текст1", " текст2"... (enter) — изменение содержимого ячеек памяти начиная с вектор-адреса п; количество ячеек определяется размером и количеством указанных в команде текстов, так, по команде -е 200 'pole', 'файл', 'file' вы- водится следующая информация: -d 200 Lc
1А8Е:0200 70 6F бС 65 Е4 АО А9 АВ-66 69 6С 65 pole.;
При вводе числовой информации (машинных кодов команд) следует набрать E п, нажать клавишу Enter и после отображенного байта информации и точки ввести новое значение (i байт), например: -е 300 1А8Е:0300 73.20
Для ввода последующих байтов нужно нажать клавишу Брасе и выполнить ввод очередного байта.
F n Lk "текст1" (fill) — заполнение блока памяти длиной k байт начиная с вектор-адреса п однобайтовыми фрагментами «текста»: например, -f 400 L20 'file'. Результат выполнения команды: -d 400 130
1АВЕ:0400 66 69 6С 65 бб 69 бС 65-66 69 бС 65 бб 69 6С 65 filefilefilefile 1АВЕ:0410 бб 69 6С 65 бб 69 6С 65-66 69 6С 65 бб 69 6С 65 f1lefilefilefile
1А8Е:0420 00 44 СО 21 F6 С2 80 74-'05 F6 С2 10 75 05 Е8 52 .
8 п & "текст" (search) — поиск фрагмента «текст» в поле памяти длиной k
ячеек с выдачей вектор-адреса ячейки, хранящей искомый текст: -s 200 L10 'fi'. Результат работы команды: 1А8Е:0208.
W (write) — запись программы на диск; в регистр CX должна быть предварительно указана длина программы в байтах, в регистр BX занесен нуль, а командой N задано имя файла (N имя файла);
L (load) — загрузка файла с диска в ОП; предварительно следует в BX записать нуль, в регистр CX записать длину, файла в байтах и объявить его имя N; для стандартно оформленных СОМ- и ЕХЕ-программ это же можно выполнить, набрав debug имя файла.
Заметим, что:
● ввод всех числовых данных осуществляется в шестнадцатеричной системе счисления, текстов — в символах ASCII, помещенных в кавычки;
вектор-адрес имеет форму адрес сегмента: адрес смещения; адрес сегмента может быть определен в явном виде шестнадцатеричным кодом или указанием соответствующего сегментного регистра; сегмент команд может быть задан по умолчанию; адрес смещения описывается в явном виде шестнадцатеричным кодом. Примеры задания вектор-адреса: 4FC5:10В, 13С6:1ABB, DS:О, С$:100;
● при выводе и отображении двухбайтовых слов старший байт размещается правее младшего. Пример: при отображении машинного кода команды mov АХ, 0123 на экране получим: В82301 (В8 — код 'mov ах'}. 1