Автор: Пользователь скрыл имя, 10 Марта 2013 в 15:44, курс лекций
Один из основных принципов машины фон Неймана — то, что и программы, и данные хранятся в одной и той же памяти. Сохраняемая в памяти программа представляет собой некоторые коды, которые могут рассматриваться как данные. Возможно, с точки зрения программиста программа — активный компонент, она выполняет некоторые действия. Но с точки зрения процессора команды программы — это данные, которые процессор читает и интерпретирует. С другой стороны программа — это данные с точки зрения обслуживающих программ, например, с точки зрения компилятора, который на входе получает одни данные — программу на языке высокого уровня (ЯВУ), а на выходе выдает другие данные — программу в машинных кодах.
Функциональные клавиши Скэн-коды
Alt/A — Alt/Z 1E — 2C
F1 — F10 3B — 44
Home 47
Стрелка вверх 48
PgUp 49
Стрелка влево 4B
Стрелка вправо 4D
End 4F
Стрелка вниз 50
PgDu 51
Ins 52
Del 53
Приведем пример
программы для установки
MOV AH,00 ;Выполнить ввод с клавиатуры
INT 16H ; CMP AL,00 ;Функциональная клавиша?
JNE EXIT1 ; нет — выйти
CMP AH,47H ;Скэн-код для клавиши Home?
JNE EXIT2 ; нет — выйти
MOV AH,02 ;
MOV BH,00 ;Установить курсор
MOV DX,00 ; по координатам 0,0
INT 10H ;Вызвать BIOS
Функциональные клавиши F1—F10 генерируют скэн-коды от шест.3B до шест.44. Следующий пример выполняет проверку на функциональную клавишу F10:
CMP AH,44H ;Клавиша F10?
JE EXIT1 ; Да!
По адресу EXIT1
программа может выполнить
4
Цвет и графика
Текстовой режим
Текстовой режим предназначен для обычных вычислений с выводом букв и цифр на экран. Данный режим одинаков для черно-белых (BW) и для цветных мониторов за исключением того, что цветные мониторы не поддерживают атрибут подчеркивания. Текстовой режим обеспечивает работу с полным набором ASCII кодов (256 символов), как для черно-белых (BW), так и для цветных мониторов. Каждый символ на экране может отображаться в одном из 16 цветов на одном из восьми цветов фона. Бордюр экрана может иметь также один из 16 цветов.
Цвета
Тремя основными цветами являются красный, зеленый и синий. Комбинируя основные цвета друг с другом, можно получить восемь цветов, включая черный и белый. Используя два уровня яркости для каждого цвета, получим всего 16 цветов:
I R G B
Черный 0 0 0 0
Серый 1 0 0 0
Синий 0 0 0 1
Ярко-синий 1 0 0 1
Зеленый 0 0 1 0
Ярко-зеленый 1 0 1 0
Голубой 0 0 1 1
Ярко-голубой 1 0 1 1
Красный 0 1 0 0
Ярко-красный 1 1 0 0
Сиреневый 0 1 0 1
Ярко-сиреневый 1 1 0 1
Коричневый 0 1 1 0
Желтый 1 1 1 0
Белый 0 1 1 0
Ярко-белый 1 1 1 1
Таким образом любые символы могут быть отображены на экране в oдном из 16 цветов. Фон любого символа может иметь один из первых восьми цветов.
В случае, если фон и текст имеют один и тот же цвет, то текст получается невидимым.
Используя байт атрибута, можно получить также мигающие символы.
Байт-атрибут
Текстовой режим допускает использование байта атрибута. Цвет на экране сохраняется до тех пор, пока другая команда не изменит его.
Для установки цвета можно использовать в команде INT 10H функции AH=06, AH=07 и AH=09. Например, для вывода пяти мигающих звездочек светло-зеленым цветом на сиреневом фоне возможна следующая программа:
MOV AH,09 ;Функция вывода на экран
MOV AL,'*' ;Выводимый символ
MOV BH,00 ;Страница 0
MOV BL,0DAH ;Атрибут цвета
MOV CX,05 ;Число повторений
INT 10H ;Вызвать BIOS
Графический режим
Для генерации
цветных изображений в
1. Низкое разрешение.
2. Среднее разрешение.
3. Высокое разрешение.
Лекция 8.
Требования языка
4
Комментарии в программах на Ассемблере
Использование комментариев в программе улучшает ее ясность, oсобенно там, где назначение набора команд непонятно. Комментаpий всегда начинаются на любой строке исходного модуля с символа точка с запятой (;) и Ассемблер полагает в этом случае, что все символы, находящиеся справа от ; являются комментарием. Комментарий может содержать любые печатные символы, включая пробел. Комментарий может занимать всю строку или следовать за командой на той же строке, как это показано в двух следующих примерах:
;Эта строка полностью
ADD AX,BX ;Комментарий на одной строке с командой
Комментарии появляются только в листингах ассемблирования исходного модуля и не приводят к генерации машинных кодов, поэтому можно включать любое количество комментариев, не оказывая влияния на эффективность выполнения программы.
4
Формат кодирования
Основной формат кодирования команд Ассемблера имеет следующий вид:
[метка] команда [операнд(ы)]
Метка (если имеется), команда и операнд (если имеется) pазделяются по крайней мере одним пробелом или символом табуляции. Максимальная длина строки — 132 символа, однако, большинство предпочитают работать со строками в 80 символов (соответственно ширине экрана). Примеры кодирования:
COUNT DB 1 ;Имя, команда, один операнд
MOV AX,0 ;Команда, два операнда
Метки
Метка в языке Ассемблера может содержать следующие символы:
Буквы: от A до Z и от a до z
Цифры: от 0 до 9
Спецсимволы: знак вопроса (?) точка (.) (только первый символ) знак «коммерческое эт» (@) подчеркивание (-) доллар ($)
Первым символом в метке должна быть буква или спецсимвол. Ассемблер не делает различия между заглавными и строчными буквами. Максимальная длина метки — 31 символ.
Примеры меток:
COUNT
PAGE25
$E10
Рекомендуется использовать описательные и смысловые метки. Имена регистров, например, AX, DI или AL являются зарезервированными и используются только для указания соответствующих регистров. Например, в команде
ADD AX,BX
Ассемблер «знает», что AX и BX относится к регистрам. Однако, в команде
MOV REGSAVE,AX
Ассемблер воспримет имя REGSAVE только в том случае, если оно будет определено в сегменте данных.
Команда
Мнемоническая команда указывает Ассемблеру какое действие должен выполнить данный оператор. В сегменте данных команда (или директива) определяет поле, рабочую oбласть или константу.
В сегменте кода команда определяет действие, например, пересылка (MOV) или сложение (ADD).
Операнд
В случае, если команда
специфицирует выполняемое
COUNTER DB 0 ;Определить байт (DB) с нулевым значением
Команда может иметь один или два операнда, или вообще быть без операндов. Рассмотрим следующие три примера:
Нет операндов
RET ;Вернуться
Один операнд
INC CX ;Увеличить CX
Два операнда
ADD AX,12 ;Прибавить 12 к AX
Метка, команда и операнд не обязательно должны начинаться с какой-либо определенной позиции в строке. Однако, рекомендуется записывать их в колонку для большей yдобочитаемости программы. Для этого, например, редактор DOS EDLIN обеспечивает табуляцию через каждые восемь позиций.
4
Директивы
Ассемблер имеет ряд операторов, которые позволяют упpавлять процессом ассемблирования и формирования листинга.
Эти операторы называются псевдокомандами или директивами.
Они действуют только в процессе ассемблирования программы и не генерируют машинных кодов.
Директивы управления листингом: PAGE и TITLE
Ассемблер содержит ряд директив, управляющих форматом печати (или листинга). Обе директивы PAGE и TITLE можно использовать в любой программе.
Директива PAGE
В начале программы можно указать количество строк, распечатываемых на одной странице, и максимальное количество символов на одной строке. Для этой цели cлужит директива PAGE. Следующей директивой устанавливается 60 строк на страницу и 132 символа в строке:
PAGE 60,132
Количество строк на странице может быть в пределах от 10 до 255, а символов в строке — от 60 до 132. По умолчанию в Ассемблере установлено:
PAGE 66,80
Предположим, что счетчик строк установлен на 60. В этом случае Ассемблер, распечатав 60 строк, выполняет прогон листа на начало следующей страницы и увеличивает номер страницы на eдиницу. Кроме того можно заставить Ассемблер сделать прогон листа на конкретной строке, например, в конце сегмента. Для этого необходимо записать директиву PAGE без операндов. Ассемблер автоматически делает прогон листа при обработке диpективы PAGE.
Директива TITLE
Для того, чтобы вверху каждой страницы листинга печатался заголовок (титул) программы, используется диpектива TITLE в следующем формате:
TITLE текст
Рекомендуется в качестве текста использовать имя программы, под которым она находится в каталоге на диске. Например, если программа называется ASMSORT, то можно использовать это имя и описательный комментарий общей длиной до 60 символов:
TITLE ASMSORT — Ассемблерная программа сортировки имен
В Ассемблере также имеется директива подзаголовка SUBTTL, которая может оказаться полезной для очень больших программ, содержащих много подпрограмм.
Директива SEGMENT
Любые ассемблерные программы содержат по крайней мере один сегмент — сегмент кода. В некоторых программах используется сегмент для стековой памяти и сегмент данных для определения данных. Асcемблерная директива для описания сегмента SEGMENT имеет следующий формат:
Имя Директива Операнд имя SEGMENT [параметры]
...
...
имя ENDS
Имя сегмента должно обязательно присутствовать, быть уникальным и соответствовать соглашениям для имен в Ассемблере. Директива ENDS обозначает конец сегмента. Обе директивы SEGMENT и ENDS должны иметь одинаковые имена. Директива SEGMENT может содержать три типа параметров, определяющих выравнивание, объединение и класс.
Выравнивание
Данный параметр определяет границу начала сегмента. Обычным значением является PARA, по которому сегмент устанавливается на границу параграфа. В этом случае начальный адрес делится на 16 без остатка, то есть, имеет шест. адрес nnn0. В случае отсутствия этого операнда Ассемблер принимает по умолчанию PARA.
Объединение
Этот элемент определяет объединяется ли данный сегмент с другими сегментами в процессе компоновки после ассемблирования. Возможны следующие типы объединений: STACK, COMMON, PUBLIC, AT выражение и MEMORY.
Сегмент стека определяется следующим образом:
имя SEGMENT PARA STACK
Когда отдельно ассемблированные программы должны объединяться компоновщиком, то можно использовать типы: PUBLIC, COMMON и MEMORY. В случае, если программа не должна объединяться с другими программами, то данная опция может быть опущена.
Класс
Данный элемент,
заключенный в апострофы, используется
для группирования
имя SEGMENT PARA STACK 'Stack'
Директива PROC
Сегмент кода содержит выполняемые команды программы. Кроме того этот сегмент также включает в себя одну или несколько процедур, определенных директивой PROC. Сегмент, содержащий только одну процедуру имеет следующий вид:
имя-сегмента SEGMENT PARA
имя-процедуры PROC
FAR
Сегмент кода с одной процедурой
имя-процедуры ENDP
имя-сегмента ENDS
RET
Имя процедуры должно обязательно присутствовать, быть уникальным и удовлетворять соглашениям по именам в Ассемблере. Операнд FAR указывает загрузчику DOS, что начало данной процедуры является точкой входа для выполнения программы.
Директива ENDP определяет конец процедуры и имеет имя, аналогичное имени в директиве PROC. Команда RET завершает выполнение программы и в данном случае возвращает управление в DOS.
Сегмент может содержать несколько процедур.
Директива ASSUME
Процессор использует регистр SS для адресации стека, регистр DS для адресации сегмента данных и регистр CS для адресации cегмента кода.
Ассемблеру необходимо сообщить назначение каждого сегмента. Для этой цели служит директива ASSUME, кодируемая в сегменте кода следующим образом:
Директива Операнд ASSUME SS:имя_стека,DS:имя_с_данных,
CS:имя_с_кода
Например, SS:имя_стека указывает, что Ассемблер должен ассоциировать имя сегмента стека с регистром SS. Операнды могут записываться в любой последовательности. Регистр ES также может присутствовать в числе операндов. В случае, если программа не использует регистр ES, то его можно опустить или указать ES:NOTHING.
Директива END
Директива ENDS завершает сегмент, а директива ENDP завершает процедуру. Директива END в свою очередь полностью завершает всю программу:
Директива Операнд END [имя_процедуры]
Операнд может быть опущен, если программа не предназначена для выполнения, например, если ассемблируются только определения данных, или эта программа должна быть скомпонована с другим (главным) модулем. Для обычной программы с одним модулем oперанд содержит имя, указанное в директиве PROC, которое было oбозначено как FAR.
4
Память и регистры
Рассмотрим особенности использования в командах имен, имен в квадратных скобках и чисел. В следующих примерах положим, что WORDA определяет слово в памяти:
MOV AX,BX ;Переслать содержимое BX в регистр AX
MOV AX,WORDA ;Переслать содержимое WORDA в регистр AX
MOV AX,[BX] ;Переслать содержимое памяти по адресу ; в регистре BX в регистр AX
MOV AX,25 ;Переслать значение 25 в регистр AX MOV AX,[25] ;Переслать содержимое по смещению 25
Новым здесь является использование квадратных скобок, что потребуется далее.
4
Инициализация программы
Существует два основных типа загрузочных программ: EXE и COM.
Рассмотрим требования к EXE-программам. DOS имеет четыре требования для инициализации ассемблерной EXE-программы: