мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| asm:lesson3 [30/09/2010 11:31] – arabusov | asm:lesson3 [07/02/2012 10:38] (текущий) – arabusov | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ======Урок 3 ====== | + | ======Начало |
| - | Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, | + | Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, |
| * mount c ~/asm | * mount c ~/asm | ||
| * path=z: | * path=z: | ||
| Строка 6: | Строка 6: | ||
| * keyb ru | * keyb ru | ||
| Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован. | Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован. | ||
| + | |||
| ===== Сегментация программы ===== | ===== Сегментация программы ===== | ||
| По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http:// | По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http:// | ||
| Строка 20: | Строка 21: | ||
| ===== Написание программ на ассемблере ===== | ===== Написание программ на ассемблере ===== | ||
| Первое, | Первое, | ||
| + | == ВНИМАНИЕ!!! == | ||
| + | Имя файла в MS-DOS и в DOSBox не может превышать восьми символов!!! | ||
| + | |||
| ===== Программы типа *.com ===== | ===== Программы типа *.com ===== | ||
| Главная особенность com-программ: | Главная особенность com-программ: | ||
| Строка 26: | Строка 30: | ||
| ===== Программа на ассемблере ===== | ===== Программа на ассемблере ===== | ||
| Для того, чтобы приступить к работе, | Для того, чтобы приступить к работе, | ||
| - | Типичный формат записи команд: | + | ==== Команды ==== |
| [метка: | [метка: | ||
| - | | + | где опкод (код операции) — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, |
| - | Директивы | + | Метка (если имеется), |
| + | pазделяются по крайней | ||
| + | табуляции. | ||
| + | большинство предпочитают работать со строками в 80 символов | ||
| + | (соответственно ширине экрана). Примеры кодирования: | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | === Метки === | ||
| + | |||
| + | Метка в языке ассемблера может содержать | ||
| + | лы: | ||
| + | Буквы: | ||
| + | Цифры: | ||
| + | Спецсимволы: | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Первым символом | ||
| + | Ассемблер | ||
| + | буквами. | ||
| + | меток: | ||
| + | описательные | ||
| + | AX, DI или AL являются | ||
| + | только для указания | ||
| + | команде | ||
| + | ADD AX,BX | ||
| + | |||
| + | ассемблер " | ||
| + | Однако, | ||
| + | |||
| + | MOV REGSAVE, | ||
| + | |||
| + | ассемблер воспримет имя REGSAVE только | ||
| + | оно | ||
| + | приведен cписок всех зарезервированных слов ассемблера. | ||
| + | |||
| + | === Команда === | ||
| + | |||
| + | Мнемоническая команда указывает ассемблеру какое действие | ||
| + | должен выполнить данный оператор. | ||
| + | (или | ||
| + | константу. | ||
| + | например, | ||
| + | |||
| + | === Операнд === | ||
| + | |||
| + | Если команда специфирует выполняемое действие, | ||
| + | определяет | ||
| + | над которыми | ||
| + | примере | ||
| + | нулевое значение: | ||
| + | |||
| + | Метка | ||
| + | COUNTER | ||
| + | ; с нулевым значением | ||
| + | |||
| + | Команда может иметь | ||
| + | быть без операндов. Рассмотрим следующие три примера: | ||
| + | |||
| + | Команда Операнд | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Метка, команда и операнд не обязательно должны начинаться | ||
| + | с какой-либо определенной позиции в строке. Однако, | ||
| + | дуется записывать | ||
| + | программы. | ||
| + | вает табуляцию чепез каждые восемь позиций. | ||
| + | ==== Комментарии ==== | ||
| + | Использование | ||
| + | ясность, | ||
| + | непонятно. | ||
| + | исходного модуля с символа | ||
| + | полагает в этом случае, | ||
| + | от ; являются | ||
| + | любые печатные символы, | ||
| + | Комментарий может занимать | ||
| + | командой на той же строке, | ||
| + | примерах: | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | ==== Директивы | ||
| Программа на языке ассемблера может содержать директивы: | Программа на языке ассемблера может содержать директивы: | ||
| Строка 38: | Строка 131: | ||
| * всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования), | * всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования), | ||
| * макросы. | * макросы. | ||
| + | Директивы управления листингом: | ||
| + | |||
| + | |||
| + | Ассемблер | ||
| + | печати (или | ||
| + | использовать в любой программе. | ||
| + | |||
| + | === Директива PAGE === | ||
| + | В начале программы можно указать количест | ||
| + | во строк, | ||
| + | количество | ||
| + | директива | ||
| + | строк на страницу и 132 символа в строке: | ||
| + | |||
| + | PAGE 60,132 | ||
| + | |||
| + | Количество строк на странице межет быть в пределах | ||
| + | 255, а символов в строке - от 60 до 132. По умолчанию в | ||
| + | ассемблере установлено PAGE 66,80. | ||
| + | Предположим, | ||
| + | случае | ||
| + | листа | ||
| + | страницы | ||
| + | сделать прогон листа на конкретной строке, | ||
| + | сегмента. | ||
| + | операндов. | ||
| + | обработке диpективы PAGE. | ||
| + | |||
| + | === Директива TITLE === | ||
| + | Для того, | ||
| + | листинга печатался заголовок (титул) программы, | ||
| + | диpектива TITLE в следующем формате: | ||
| + | |||
| + | | ||
| + | |||
| + | Рекомендуется в качестве текста использовать | ||
| + | мы, под которым она находится в каталоге на диске. Например, | ||
| + | если программа называется ASMSORT, то можно использовать это | ||
| + | имя и описательный комментарий общей длиной до 60 символов: | ||
| + | |||
| + | TITLE ASMSORT - Ассемблерная программа сортировки имен | ||
| + | |||
| + | В ассемблере также имеется директива подзаголовка SUBTTL, | ||
| + | которая может оказаться полезной для очень больших программ, | ||
| + | содержащих много подпрограмм. | ||
| + | |||
| + | === Директива SEGMENT === | ||
| + | |||
| + | Любые ассемблерные | ||
| + | один | ||
| + | используется | ||
| + | для определения данных. | ||
| + | сегмента SEGMENT имеет следующий формат: | ||
| + | |||
| + | | ||
| + | | ||
| + | . | ||
| + | . | ||
| + | . | ||
| + | | ||
| + | |||
| + | Имя | ||
| + | уникальным | ||
| + | ассемблере. | ||
| + | директивы | ||
| + | Директива | ||
| + | определяющих выравнивание, | ||
| + | == Выравнивание == | ||
| + | Данный параметр определяет границу начала | ||
| + | сегмента. | ||
| + | сегмент устанавливается на границу | ||
| + | случае начальный адрес делится на 16 без остатка, | ||
| + | имеет | ||
| + | операнда ассемблер принимает по умолчанию PARA. | ||
| + | == Объединение == | ||
| + | Этот элемент | ||
| + | данный | ||
| + | компановки | ||
| + | следующем | ||
| + | следующие типы | ||
| + | выражение | ||
| + | следующим образом: | ||
| + | |||
| + | | ||
| + | |||
| + | Когда отдельно ассемблированные программы должны объединяться | ||
| + | PUBLIC, | ||
| + | должна объединяться | ||
| + | == Класс == | ||
| + | Данный элемент, | ||
| + | компановке: | ||
| + | |||
| + | | ||
| + | |||
| + | Фрагмент | ||
| + | иллюстрирует директиву SEGMENT и ее различные опции. | ||
| + | |||
| + | === Директива PROC === | ||
| + | |||
| + | Сегмент | ||
| + | Кроме | ||
| + | несколько процедур, | ||
| + | содержащий только одну процедуру имеет следующий вид: | ||
| + | |||
| + | | ||
| + | | ||
| + | . | ||
| + | . с | ||
| + | . | ||
| + | RET | ||
| + | | ||
| + | | ||
| + | Имя | ||
| + | уникальным и удовлетворять соглашениям по именам | ||
| + | ре. Операнд FAR указывает загрузчику DOS, что начало данной | ||
| + | процедуры является точкой входа для выполнения программы. | ||
| + | Директива | ||
| + | аналогичное | ||
| + | выполнение программы и в данном случае возвращает управление | ||
| + | в DOS. | ||
| + | Сегмент может содержать несколько процедур. | ||
| + | |||
| + | === Директива | ||
| + | |||
| + | Процессор | ||
| + | ркгистр | ||
| + | адресации | ||
| + | назначение каждого сегмента. | ||
| + | ASSUME, кодируемая в сегменте кода следующим образом: | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | Например, | ||
| + | ассоциировать | ||
| + | могут | ||
| + | также может присутствовать в числе операндов. Если программа | ||
| + | не использует регистр ES, то его можно опустить или указать | ||
| + | ES:NOTHING. | ||
| + | |||
| + | === Директива END === | ||
| + | |||
| + | Как уже показано, | ||
| + | директива | ||
| + | очередь полностью завершает всю программу: | ||
| + | |||
| + | Директива | ||
| + | END [имя_процедуры] | ||
| + | |||
| + | Операнд может быть опущен, | ||
| + | на для выполнения, | ||
| + | другим | ||
| + | модулем oперанд содержит | ||
| + | которое было oбозначено как FAR. | ||
| ===== Hello, world! ===== | ===== Hello, world! ===== | ||
| [[http:// | [[http:// | ||