Язык программирования ассемблер. Содержание язык программирование ассемблер Введение Язык программирования ассемблер История языка Программирование на языке ассемблер Преимущества и недостатки
Скачать 1.36 Mb.
|
Содержание язык программирование ассемблер Введение Язык программирования ассемблер История языка Программирование на языке ассемблер Преимущества и недостатки языка Turbo Assembler (TASM) Система прерывания программ Механизм прерывания Работа механизма прерывания Заключение Список литературы Приложение Введение Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Существует множество языков программирования, но мы остановимся на Ассемблере. Несмотря на то, что в настоящее время программист может использовать большое количество языков программирования, которые гораздо проще Ассемблера, знание Ассемблера и умение программировать на нем никогда не будут лишними. Этот факт подтверждается следующими доводами: 1. На других языках программирования не всегда возможно написать приложение, которое полно бы удовлетворяло требованиям. А в некоторых случаях полностью невозможно. На языке программирования Ассемблер можно написать любое приложение. 2. Иногда языки программирования высокого уровня не могут обеспечить требуемое быстродействие. А приложение созданное на Ассемблере всегда быстродействующее. 3. Размер приложений созданных на языках высокого уровня имею гораздо больший размер, чем приложения созданные на Ассемблере. 4. Язык Ассемблер позволяет работать непосредственно с аппаратными средствами, что в некоторых случаях дает программисту преимущество и требуемый результат. Приложение на языке высокого уровня работает с аппаратными устройствами через написанные модули, т. е. не позволит программисту что-либо изменить, а, следовательно, получить требуемый результат. 5. Знание языка Ассемблер дает большее преимущество перед теми, кто программирует только на языках высокого уровня. Знающий Ассемблер знает и структуру компьютера, и структуру аппаратных устройств. Цель работы: описать язык программирования Ассемблер; выявить преимущества и недостатки языка; описать Turbo Assembler; ознакомиться с механизмом прерывания. Язык программирования ассемблер История ассемблера Программисты уже были знакомы с понятием подпрограммы: Грейс Хоппер и ее коллеги применяли подпрограммы на гарвардском «Марке-1» во время второй мировой войны, однако каждая подпрограмма решала свою специфическую задачу. Подпрограммами называются независимые фрагменты компьютерной программы, используемые многократно и вызываемые из главной программы в случае необходимости. Например, одна подпрограмма может вычислять квадратный корень, а другая заставит компьютер вывести на дисплей литеру. Первые программисты почти всегда имели блокноты с записью наиболее употребляемых подпрограмм, чтобы в случае необходимости не составлять их заново. Проблема состояла в том, что адреса расположения команд и переменных подпрограммы в памяти менялись в зависимости от ее размещения в последней. Настройка подпрограмм на определенное место в памяти, очевидно, нуждалась в автоматизации, и впервые это было сделано на «Эдсаке». Программисты Кембриджа начали с написания набора унифицированных подпрограмм, которые и образовали библиотеку. После этого достаточно было ввести лишь короткую команду – и компьютер проделывал всю работу по настройке и размещению подпрограммы внутри программы. [1] Морис Уилкс назвал мнемоническую схему для «Эдсака» и библиотеку подпрограмм собирающей системой (по-английски assembly system – отсюда слово «ассемблер»), поскольку она собирала последовательности подпрограмм. Ассе́мблер (от англ. assembler – сборщик) – компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке. [2] Язык ассемблера в русском языке часто называют просто ассемблером. Транслятор с этого языка тоже обычно называют просто ассемблером, что в ряде случаев может создать путаницу. Процесс трансляции с языка ассемблера в машинный код нередко называют ассемблированием. Использование термина «язык ассемблера» может вызвать ошибочное мнение о существовании единого языка низкого уровня или хотя бы стандарта на такие языки, что абсолютно не соответствует истине. Поэтому при именовании языка, на котором написана конкретная программа, желательно уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана. Программирование на языке ассемблер Ассемблер – язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком. [3] Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данных через метки с символьными именами и директивы. Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла) ; повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др. Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера. [4] Ассемблерные программы могут быть очень эффективными. Из программистов, с равными навыками и способностями, работающих на языке Ассемблера создать программу более компактную и быстродействующую, чем такую же программу, написанную на языке высокого уровня. Это так практически для всех небольших или средних программ. К сожалению, по мере возрастания размеров, программы на языке Ассемблера теряют часть своих преимуществ. Это происходит из-за необходимого в ассемблерной программе внимания к деталям. Как вы видите, язык Ассемблера требует от вас планирования каждого действия компьютера. В небольших программах это позволяет оптимизировать работу программы с аппаратными средствами. В больших же программах огромное количество деталей может помешать вам эффективно работать над самой программой, даже если отдельные компоненты программы окажутся очень неплохими. Безусловно, программирование на языке Ассемблера отвечает потребностям не каждой программы. Программы на языке Ассемблера очень точны. Поскольку этот язык позволяет программисту непосредственно работать со всем аппаратным обеспечением, ассемблерная программа может делать то, что недоступно никакой другой программе. Несомненно, что в программировании устройств ввода-вывода, где требуется контроль над отдельными разрядами регистров устройства, программирование на языке Ассемблера – единственный подходящий выбор. Ясно, что эффективность и точность языка Ассемблера дают определенные преимущества. Но его детализированность создает и некоторые проблемы. Когда же стоит выбирать для программирования язык Ассемблера? Конечно, вы должны пользоваться программами на языке Ассемблера, когда нет другого способа написать программу. Например, программисты фирмы IBM писали с использованием процедур Ассемблера все программы управления устройствами ввода-вывода для IBM PC. Для управления устройствами ввода-вывода и системой прерываний, потребовалась та точность языка Ассемблера, которую не может обеспечить ни один другой язык программирования. Аналогично, на языке Ассемблера в фирме IBM писались процедуры диагностики, которые должны проверять каждую деталь аппаратуры. Язык Ассемблера необходим также и в тех случаях, когда главными являются рабочие характеристики программы. Это может быть время исполнения или конечный размер программы. Библиотека математических процедур Фортрана – пример программы, требующей хороших характеристик, как в отношении времени, так и размера. Математические процедуры являются частью любой программы на Фортране, поэтому они должны занимать как можно меньше места. Кроме того, эти процедуры управляют всеми математическими функциями в фортрановской программе и часто используются. Следовательно, они должны исполняться быстро. Какая программа не подходит для языка Ассемблера? Конечно, вы можете написать на нем любую программу, однако с большой программой лучше работать в языке высокого уровня, таком как C или C#. Эти языки позволяют вам сосредоточиться на своей проблеме. Вам не приходится непосредственно иметь дело с тонкостями аппаратного оборудования и процессора. Языки высокого уровня позволяют вам отступить назад и за деревьями увидеть лес. При программировании на языке Ассемблера и только через написание программ на этом уровне детализации вы можете понять, как работает машина на самом нижнем уровне. Если вы хотите узнать о компьютере все, вы должны быть знакомы с языком ассемблера. Единственный способ добиться этого: писать программы на этом языке. Самыми популярными на сегодняшний день являются пакеты Turbo Assembler (TASM) фирмы Borland, Macro Assembler for Windows32 (MASM32), созданный Hutch (на основе старого MASM фирмы Microsoft), а также Flat Assembler (FASM), и Netwide Assembler (NASM), развиваемый командой NASM Development Team. Все эти ассемблеры предоставляют весьма широкие возможности для программиста. На них можно писать программы как под DOS, так и под Windows. Существует также множество других видов ассемблера, число которых растет. Например: CodeX Assembler, Gema Assembler, Light Macro Assembler (LASM), Lazy Assembler (LZASM), Table Driven Assembler (TDASM), NewBasic++ Assembler (NBASM), TMA Macro Assembler и др. [5] Преимущества и недостатки языка Достоинства Искусный программист, как правило, способен написать более эффективную программу на ассемблере, чем те, что генерируются трансляторами с языков программирования высокого уровня, то есть для программ на ассемблере характерно использование меньшего количества команд и обращений в память, что позволяет увеличить скорость и уменьшить размер программы. Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов. При программировании на ассемблере возможен непосредственный доступ к аппаратуре, в том числе портам ввода-вывода, регистрам процессора, и др. Язык ассемблера применяется для создания драйверов оборудования и ядра операционной системы Язык ассемблера используется для создания «прошивок» BIOS. С помощью языка ассемблера создаются компиляторы и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ. + Существует возможность исследования других программ с отсутствующим исходным кодом с помощью дизассемблера. Недостатки Главное преимущество ассемблера практически полностью нивелируется хорошей оптимизацией в современных компиляторах языков высокого уровня. В силу своей машинной ориентации («низкого» уровня) человеку по сравнению с языками программирования высокого уровня сложнее читать и понимать программу, она состоит из слишком «мелких» элементов – машинных команд, соответственно усложняются программирование и отладка, растет трудоемкость, велика вероятность внесения ошибок. В значительной степени возрастает сложность совместной разработки. Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования. Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд (кроме двоично-совместимых). [4] Turbo Assembler (TASM) Турбо Ассемблер фирмы Borland представляет собой многопроходный ассемблер с разрешением опережающих ссылок, скоростью ассемблирования до 48000 строк в минуту (на компьютере IBM PS/2, модель 60), совместимый с макроассемблером фирмы Microsoft MASM и дополнительной возможностью использования режима расширенного синтаксиса. Независимо от вашего опыта в программировании вы, несомненно, оцените эти особенности, а также ряд других средств, которые значительно облегчают программирование на Ассемблере. Среди таких средств можно кратко упомянуть следующие: полная поддержка процессора 80386; улучшенная синтаксическая проверка типов; упрощенные директивы определения сегментов; улучшенное управление листингом; расширения инструкций POP и PUSH; расширенный оператор CALL с аргументами и необязательным параметром языка; локальные метки; локальные идентификаторы в стеке и аргументы вызова в процедурах; структуры и объединения; вложенные директивы; режим QUIRK, эмулирующий MASM; полная отладка на уровне исходного текста с помощью Турбо отладчика; встроенная утилита генерации перекрестных ссылок (TCREF) ; файлы конфигурации и командные файлы. [6] Турбо Ассемблер является мощным Ассемблером, работающим с командной строкой, который воспринимает ваши исходные файлы (файлы с расширением *. asm*) и создает из них объектные модули (файлы с расширением *. obj*). После этого вы можете использовать программу-компоновщик фирмы Borland TLINK. EXE, отличающуюся высокой скоростью компоновки, для компоновки полученных объектных модулей и создания выполняемых файлов (файлов с расширением *. exe*). Турбо Ассемблер создан для работы с процессорами серии 80х86 и 80х87 (более подробно набор инструкций процессоров серии 80х86/80х87 описан в соответствующих руководствах фирмы Intel). Turbo Assembler, помимо полной поддержки транслятора фирмы Microsoft имеет дополнительные возможности, объединённые в режиме, названном разработчиками Ideal. Использование этого режима даёт возможность начинающему программисту применять более наглядный и простой стиль разработки программ. Более опытные программисты, пишущие на ассемблере, могут использовать такие возможности режима Ideal, как вложенные структуры, объединения. Важной особенностью режима Ideal является применение проверки типов данных, подобно языкам высокого уровня, что позволяет выявить многие ошибки ещё на этапе трансляции. Среди многих других важных преимуществ режима Ideal можно выделить следующие: – возможность использования одинаковых имён для обозначения членов различных структур; – применение операторов HIGH и LOW; – предварительное вычисление выражений EQU; – корректное управление сегментами данных объединённых в группы; – усовершенствованное использования директив; – разумное использование скобок в выражениях. Turbo Assembler передаёт аргументы в процедуры на языках высокого уровня в кадре стека, помещая аргументы перед вызовом процедуры в стек. Процедуры, написанные на языках высокого уровня, считывают аргументы из стека по мере необходимости. При выходе процедура может удалять аргументы из стека или оставлять эту операцию для вызывающей процедуры. Традиционным способом, с помощью которого объединяются программы, написанные на С++ и Ассемблере, является разделительная компиляция с последующей компоновкой в один исполняемый файл. При этом можно использовать компилятор Borland C++, который вызывает Turbo Assembler для трансляции ассемблерной программы. [7] Разработка программы на языке Turbo Assembler включает четыре этапа: 1-й этап. Подготовка исходного текста программы и оформление его в виде текстового файла (одного или нескольких) с помощью какого-нибудь редактора в формате DOS с расширением *. asm*. 2-й этап. Ассемблирование программы с применением транслятора Tasm, результатом которого является объектный файл с расширением *. obj*. Когда программа состоит из нескольких файлов (модулей), то их ассемблирование производится независимо друг от друга. Если в процессе трансляции будут обнаружены ошибки, то объектный файл не создаётся, а формируется сообщение об ошибках. Ошибки устраняются, после чего трансляция повторяется. Объектный файл (двоично-кодированное представление программы) не может быть запущен на исполнение, так как в нём не содержится информация о загрузке сегментов программы в памяти компьютера. 3-й этап. Компоновка программы производится компоновщиком (редактором связей) Turbo Linker и заключается в объединении объектных модулей в один исполняемый файл с назначением стартового адреса программы. Исполняемый файл имеет расширение *. exe*. 2-й и 3-й этапы определяют процесс подготовки исполнительного файла программы, называемого трансляцией. 4-й этап состоит в отладке программы с использованием отладчика Turbo Debugger, который будет являться основным инструментом при изучении форматов команд, их кодирования, а также представления переменных программы в памяти. Система прерывания программ Одним из принципиальных отличий компьютера от любой другой машины, является то, что ПК способен реагировать на непредсказуемые события в процессе работы. Эта способность обеспечивается с помощью особого свойства компьютера – аппарата прерываний. Прерывание позволяет компьютеру приостановить любое свое действие и переключиться на другое в зависимости от того, что вызывает это прерывание. Например, нажатие соответствующей клавиши на клавиатуре. Способность к прерыванию разрешает, казалось бы, сложнейшую проблему эффективности работы нашего компьютера. С одной стороны, мы хотим, чтобы компьютер занимался той работой, которую мы ему дали. С другой стороны, нам нужно, чтобы он реагировал на любую нашу команду, подаваемую, например, с помощью клавиатуры. Если бы компьютер был способен только на то, чтобы не отвлекаясь выполнять то, что ему заранее было задано, он бы не смог ответить на наши запросы своевременно, не следя постоянно за деятельностью клавиатуры. Реагировать на сигналы, посылаемые клавиатурой, равно как и на другие сигналы, требующие внимания в то время, когда компьютер занят другой работой, позволяет ему система прерываний. Микропроцессор нашего ПК имеет “ врожденную” способность прерывать выполнение операций, при этом у него существует надежное средство откладывать на хранение работу, выполнение которой было прервано. Для этого используется стек микропроцессора. Когда происходит прерывание, запись того, что делал компьютер в этот момент, хранится в стеке, так что по завершении прерывания мы можем вернуться к тому месту, от которого нам пришлось отвлечься. Это один из нескольких способов применения стека, но он является самым важным. Без стека, куда мы можем положить на хранение информацию о выполняемой работе, не могла бы реализоваться сама идея прерывания. Механизм прерывания Прерывание (англ. interrupt) – сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код. [3] Программное прерывание – синхронное прерывание, которое может осуществить программа с помощью специальной инструкции. [5] Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель с тем, чтобы после восстановления питания можно было продолжить работу с того же места. Кажется очевидным, что возможны самые разнообразные прерывания по самым различным причинам. Поэтому прерывание рассматривается не просто как таковое: с ним связывают число, называемое номером типа прерывания или просто номером прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознавать, какое прерывание, с каким номером оно произошло, и запускает соответствующую этому номеру процедуру. Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так называемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы. В процессорах архитектуры x86 для явного вызова синхронного прерывания имеется инструкция Int, аргументом которой является номер прерывания (от 0 до 255). ВIBM PC-совместимых компьютерах обработку некоторых прерываний осуществляют подпрограммы BIOS, хранящиеся в ПЗУ, и это служит интерфейсом для доступа к сервису, предоставляемому BIOS. Также, обслуживание прерываний могут взять на себя BIOS карт расширений (например, сетевых или видеокарт), операционная система и даже обычные (прикладные) программы, которые постоянно находятся в памяти во время работы других программ (т. н. резидентные программы). В отличие от реального режима, в защищённом режиме x86-процессоров обычные программы не могут обслуживать прерывания, эта функция доступна только системному коду (операционной системе). MS-DOS использует для взаимодействия со своими модулями и прикладными программами прерывания с номерами от 20h до 3Fh (числа даны в шестнадцатеричной системе счисления, как это принято при программировании на языке ассемблера x86). Например, доступ к основному множеству функций MS-DOS осуществляется исполнением инструкции Int 21h (при этом номер функции и её аргументы передаются в регистрах). Это распределение номеров прерываний не закреплено аппаратно и другие программы могут устанавливать свои обработчики прерываний вместо или поверх уже имеющихся обработчиков, установленных MS-DOS или другими программами, что, как правило, используется для изменения функциональности или расширения списка системных функций. Также, этой возможностью пользуются вирусы. [8] Работа механизма прерывания Каждое определённое прерывание идентифицируется своим номером. Например, таймер и клавиатура и принтер имеют каждый свой собственный номер прерывания. Что касается базовой системы ввода/вывода, то её сервисные программы подразделяются на группы, причём за всеми программами группы закрепляется один номер прерывания. Когда происходит прерывание, его номер из таблицы используется для включения соответствующей программы обработки прерываний. Перед тем как такая программа начнёт свою работу, механизм микропроцессора, отвечающий за обработку прерываний, оставляет запись в стеке о том, какая работа производилась до прерывания. После этого выполняется программа обработки прерывания. Программа обработки прерываний начинает работу, приняв предохранительные меры против дальнейших возможных прерываний, в случае, если должны выполняться очень важные или сложные операции, которые нельзя прерывать. Обычно такие программы включают смену сегментного регистра, управляющего доступом в память, а также запись в стек дальнейшей информации о состоянии, которую необходимо сохранить в добавление к той, которая была автоматически записана в начале прерывания. После завершения своих операций программа обработки прерываний может снова привести в действие другие типы прерываний и выполнять необходимую работу. Когда операции прерывания заканчиваются, программа обработки прерываний восстанавливает исходное состояние машины, в котором она находилась до прерывания, и компьютер продолжает прерванную работу. [9] Для примера рассмотрим программу, которая представляет собой исполняемый *. exe файл, после запуска которого на экране периодически появляется государственный флаг России. Период появлений примерно 1 раз в 2 секунды (см. Приложение). Данная программа имеет следующий алгоритм работы (рис. 1) : Рис. 1. Алгоритм работы программы. Программное обращение к видеодрайверу BIOS реализуется с помощью прерывания INT 10h. При работе в текстовом режиме обычно используются следующие функции драйвера: 02h – установить позицию курсора; 03h – получить позицию курсора; 05h – установить видеостраницу; 06h – инициализировать или прокрутить вверх окно; 07h – инициализировать или прокрутить вниз окно; 08h – прочитать символ и атрибут в позиции курсора; 09h – вывести символ и атрибут в позицию курсора; 0Ah – вывести символ в позицию курсора; 0Eh – вывести символ в режиме телетайпа; 10h, подфункция 3h – переключить бит мерцание/яркость; 13h – вывести строку в режиме телетайпа. [10] С помощью функций 06h и 07h в заданном месте экрана дисплея создаются цветные прямоугольные окна заданного размера. Если в эти окна выведен какой-либо текст, то с помощью этих функций его можно прокручивать вверх и вниз. Функции 09h, 0Ah, 0Eh и 13h служат для вывода на экран отдельных символов и символьных строк (в цикле). Предусмотрен вывод одного и того же символа заданное число раз, что можно использовать при создании рамок и других орнаментов. Функция 0Eh реагирует на управляющие коды, выполняя соответствующие действия. Курсор перемещается после вывода каждого символа. Функция 13h предназначена для вывода строк с указанием атрибутов как каждого символа в отдельности, так и всей строки. Функция может выполняться в четырех вариантах в зависимости от кода режима, указываемого в регистре AL. При выводе на экран средствами драйвера BIOS необходимо иметь в виду, что ввод с клавиатуры Ctrl/C не приводит к завершению программы. Следует опасаться бесконечных циклов вывода на экран – выход из них возможен только путем перезагрузки компьютера. [10] Сигналы внешних аппаратных прерываний (от таймера, клавиатуры, дисков и проч.) поступают в процессор не непосредственно, а через контроллер прерываний, в качестве которого используется микросхема Intel 8259A. Обработка аппаратного прерывания обязательно включает в себя процедуры управления контроллером прерываний. Организация системы аппаратных прерываний заключается в том, что к восьми входным выводам контроллера подключаются выводы устройств, на которых возникают сигналы прерываний. Выход INT контроллера подключается к одноименному входу микропроцессора. При этом, кроме сигнала INT, инициирующего процедуру прерывания в микропроцессоре, контроллер передает в микропроцессор по линиям данных номер вектора, через который должна быть вызвана программа обработки поступившего прерывания. Передаваемый номер вектора образуется в контроллере путем сложения базового номера, записанного в одном из его регистров, с номером входной линии, по которой поступил запрос. Номер базового вектора заносится в контроллер автоматически в процессе начальной загрузки компьютера. Контроллер программируется через порты 20h и 21h. Поскольку базовый вектор всегда равен 8, то номера векторов, закрепленных за аппаратными прерываниями, лежат в диапазоне 8h,..., Fh. В нашем случае также необходимо рассмотреть прерывания вызванные сигналами системного таймера. Прерывания это готовые процедуры, которые компьютер вызывает для выполнения определенной задачи. Существуют аппаратные и программные прерывания. Аппаратные прерывания инициируются аппаратурой, либо с системной платы, либо с карты расширения. Они могут быть вызваны сигналом микросхемы таймера, сигналом от принтера, нажатием клавиши на клавиатуре и множеством других причин. Аппаратные прерывания не координируются с работой программного обеспечения. Когда вызывается прерывание, то процессор оставляет свою работу, выполняет прерывание, а затем возвращается на прежнее место. Для того чтобы иметь возможность вернуться точно в нужное, место программы, адрес этого места (CS: IP) запоминается на стеке, вместе с регистром флагов. Затем в CS: IP загружается адрес программы обработки прерывания и ей передается управление. Программы обработки прерываний иногда называют драйверами прерываний. Они всегда завершаются инструкцией IRET (возврат из прерывания), которая завершает процесс, начатый прерыванием, возвращая старые значения CS: IP и регистра флагов, тем самым, давая программе возможность продолжить выполнение из того же состояния. Все IBM PC используют микросхему таймера 8253 (или 8254) для согласования импульсов от микросхемы системных часов. Число циклов системных часов преобразуется в один импульс, а последовательность этих импульсов подсчитывается для определения времени, или они могут быть посланы на громкоговоритель компьютера для генерации звука определенной частоты. Микросхема 8253 имеет три идентичных независимых канала, каждый из которых может программироваться. Микросхема 8253 работает независимо от процессора. Процессор программирует микросхему и затем обращается к другим делам. Таким образом 8253 действует как часы реального времени – она считает свои импульсы независимо от того, что происходит в компьютере. Однако, максимальный программируемый интервал составляет приблизительно 1/12 секунды. Для подсчета интервалов времени в часы и минуты нужны какие-то другие средства. Именно по этой причине импульсы от нулевого канала микросхемы таймера накапливаются в переменной, находящейся в области данных BIOS. Это накопление обычно называется подсчетом времени суток. 18. 2 раза в секунду выход канала 0 обрабатывается аппаратным прерыванием (прерыванием таймера), которое ненадолго останавливает процессор и увеличивает счетчик времени суток. [10] Число 0 соответствует полночи 12: 00; когда счетчик достигает значения эквивалентного 24 часам, он сбрасывается на ноль. Другое время в течение суток легко определяется делением показателя счетчика на 18. 2 для каждой секунды. Счетчик времени суток используется в большинстве операций, связанных со временем. Заключение Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров. В данной курсовой работе изучен теоретический материал о языке низкого уровня – ассемблер, его преимущества и недостатки, основные этапы программирования на ассемблере. Были рассмотрены принципы обработки прерываний, вывода и ввода информации в графическом и текстовом режимах, обработка сообщений системного таймера, реализован алгоритм выполнения поставленной задачи, а также выполнена трансляция кода в исполняемый файл. Список литературы Касвандс Э. Г. Введение в программирование на языке Ассемблер. ч. 1 – М. : ЮНИТИ – ДАНА, 2006. Юров В. Assembler. Специальный справочник. – СПб. : Питер, 2007. Что такое ассемблер. [Электронный ресурс]. – Режим доступа: http://www.assembler.webservis.ru Ваулин А. С. Языки программирования. кн. 5 – М. : Школа-Пресс, 2008. Малютин Э. А. Языки программирования. – М. : Просвещение, 2008. Абель П. Язык Ассемблера для IBM PC и программирования /Пер. с англ. Ю. В. Сальникова – М. ; Высшая школа 2007 – 447 с. : ил. Программируем на ассемблере. [Электронный ресурс]. – Режим доступа: http://www.kalashnikoff.ru Зубков С. В. Assembler для DOS, Windows и Unix. – М. : ИНФРА-М, 2009. Богумирский Б. Эффективная работа на IBM PC в среде Windows 95 СПб, «Питер», 2007. Юров В., Хорошенко В. Assembler – Учебный курс. – СПб. : Питер, 2007. Приложение Код программы . model tiny . code start: org 100h main proc ; mov AX, data; инициализация mov DS, AX; сегментного регистра DS ; Прочитаем и сохраним исходное содержимое вектора 8 mov AX, 3508h int 21h mov word ptr old_08h, BX mov word ptr old_08h+2, ES ; Установим наш обработчик прерываний new_08h mov AX, 2508h mov DX, offset new_08h push DS; Сохраним на время DS push CS; Отправим содержимое CS pop DS; в DS int 21h; Вызов DOS (функции 25h) pop DS; Восстановим DS ; Сымитируем действия, выполняемые в течение 3 с, просто зациклив программу stop: jmp stop ; Вторая ветвь программы, активизируемая по истечении 3 с fin: ; белая полоса MOV AH, 07h MOV AL, 09h MOV BH, 0F7h MOV CH, 00h MOV CL, 00h MOV DH, 18h MOV DL, 4Fh INT 10h ; синяя полоса MOV AH, 07h MOV AL, 09h MOV BH, 097h MOV CH, 08h MOV CL, 00h MOV DH, 18h MOV DL, 4Fh INT 10h ; красная полоса MOV AH, 07h MOV AL, 09h MOV BH, 0C4h MOV CH, 18h MOV CL, 00h MOV DH, 18h MOV DL, 4Fh INT 10h mov CS: time, 20 jmp start main endp ; Прикладной обработчик прерываний от таймера, ; активизируемый 18, 2 раза в секунду new_08h proc push AX; Сохраним два используемых push BP; в обработчике регистра dec CS: time; Декремент интервала времени jnz outint; Пока не 0, выйти из прерывания ; Содержимое ячейки time уменьшилось до 0, выполнить переключение программы mov BP, SP; ВР=текущая вершина стека mov AX, offset fin; Смещение точки перехода mov [BP+4], AX; /Отправим его в стек на место IP mov AX, seg fin; /Сегмент точки перехода mov [BP+6], AX; /Отправим его в стек на место CS outint: mov AL, 20h; /Команда EOI в контроллер out 20h, AL; /прерываний MOV AX, 0600h ; AH=06 (прокрутка), AL=00 (весь экран) MOV BH, 07 ; нормальный атрибут MOV CX, 0000 ; верхняя левая позиция MOV DX, 184Fh ; нижняя правая позиция INT 10h ; передача управления в BIOS MOV AH, 02 ; номер функции MOV BH, 00 ; номер страницы MOV DH, 00 ; номер строки MOV DL, 00; номер столбца INT 10h ; устанавливаем курсор pop BP; /Восстановим оба pop AX; /сохраненных регистра iret; /Выход из прерывания time dw 20; /Ячейка для отсчета времени new_08h endp ; /Поля данных old_08h dd 0; /Ячейка для хранения исходного вектора end start. |