мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
asm:lesson3 [30/09/2010 16:29] – arabusov | asm:lesson3 [07/02/2012 18:38] (текущий) – arabusov | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ======Урок 3 ====== | + | ======Начало |
- | Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, | + | Первым делом проверим конфигурацию dosbox. Зайдём в домашний каталог, |
* mount c ~/asm | * mount c ~/asm | ||
* path=z: | * path=z: | ||
* c: | * c: | ||
+ | * keyb ru | ||
Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован. | Если что-то не так, то доредактируем файл. После этого dosbox будет сконфигурирован. | ||
+ | |||
===== Сегментация программы ===== | ===== Сегментация программы ===== | ||
По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http:// | По знаменитой формуле Никлауса Вирта (создателя языка Pascal, [[http:// | ||
Строка 19: | Строка 21: | ||
===== Написание программ на ассемблере ===== | ===== Написание программ на ассемблере ===== | ||
Первое, | Первое, | ||
+ | == ВНИМАНИЕ!!! == | ||
+ | Имя файла в MS-DOS и в DOSBox не может превышать восьми символов!!! | ||
+ | |||
===== Программы типа *.com ===== | ===== Программы типа *.com ===== | ||
Главная особенность com-программ: | Главная особенность com-программ: | ||
Строка 25: | Строка 30: | ||
===== Программа на ассемблере ===== | ===== Программа на ассемблере ===== | ||
Для того, чтобы приступить к работе, | Для того, чтобы приступить к работе, | ||
- | Типичный формат записи команд: | + | ==== Команды ==== |
[метка: | [метка: | ||
- | | + | где опкод (код операции) — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, |
- | Директивы | + | Метка (если имеется), |
+ | pазделяются по крайней | ||
+ | табуляции. | ||
+ | большинство предпочитают работать со строками в 80 символов | ||
+ | (соответственно ширине экрана). Примеры кодирования: | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | === Метки === | ||
+ | |||
+ | Метка в языке ассемблера может содержать | ||
+ | лы: | ||
+ | Буквы: | ||
+ | Цифры: | ||
+ | Спецсимволы: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Первым символом | ||
+ | Ассемблер | ||
+ | буквами. | ||
+ | меток: | ||
+ | описательные | ||
+ | AX, DI или AL являются | ||
+ | только для указания | ||
+ | команде | ||
+ | ADD AX,BX | ||
+ | |||
+ | ассемблер " | ||
+ | Однако, | ||
+ | |||
+ | MOV REGSAVE, | ||
+ | |||
+ | ассемблер воспримет имя REGSAVE только | ||
+ | оно | ||
+ | приведен cписок всех зарезервированных слов ассемблера. | ||
+ | |||
+ | === Команда === | ||
+ | |||
+ | Мнемоническая команда указывает ассемблеру какое действие | ||
+ | должен выполнить данный оператор. | ||
+ | (или | ||
+ | константу. | ||
+ | например, | ||
+ | |||
+ | === Операнд === | ||
+ | |||
+ | Если команда специфирует выполняемое действие, | ||
+ | определяет | ||
+ | над которыми | ||
+ | примере | ||
+ | нулевое значение: | ||
+ | |||
+ | Метка | ||
+ | COUNTER | ||
+ | ; с нулевым значением | ||
+ | |||
+ | Команда может иметь | ||
+ | быть без операндов. Рассмотрим следующие три примера: | ||
+ | |||
+ | Команда Операнд | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Метка, команда и операнд не обязательно должны начинаться | ||
+ | с какой-либо определенной позиции в строке. Однако, | ||
+ | дуется записывать | ||
+ | программы. | ||
+ | вает табуляцию чепез каждые восемь позиций. | ||
+ | ==== Комментарии ==== | ||
+ | Использование | ||
+ | ясность, | ||
+ | непонятно. | ||
+ | исходного модуля с символа | ||
+ | полагает в этом случае, | ||
+ | от ; являются | ||
+ | любые печатные символы, | ||
+ | Комментарий может занимать | ||
+ | командой на той же строке, | ||
+ | примерах: | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | ==== Директивы | ||
Программа на языке ассемблера может содержать директивы: | Программа на языке ассемблера может содержать директивы: | ||
Строка 37: | Строка 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:// |