Ассемблер методичка. Программа представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
Скачать 253 Kb.
|
1.4.Указание размера операндаЧисла в памяти ЭВМ хранятся в двоичном виде в следующем формате: самый младший байт, следующий за ним байт, …, старший байт. Восьмибитовая константа может быть представлена как одним байтом, так и двумя. Если в команде одним из операндов присутствует регистр, то размер данных в памяти и констант определяется по размеру регистра. Но в командах, проводящих арифметические операции с памятью и константой, необходимо явно указать, сколько байт занимает значение в памяти. Делается это с помощью конструкций BYTE PTR, WORD PTR и DWORD PTR. Первая устанавливает размер операнда, равный 1 байту, вторая – 2 байта, а третья – 4 байтам. Пример: WORD PTR ES:[DI] – указывает процессору, что следует использовать при выполнении операции двухбайтовое число, расположенное по адресу ES:DI. Если операнд в памяти задан меткой в сегменте данных, размер операнда уже известен ассемблеру, и его можно не указывать. 2.СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА2.1.Основные понятия языка ассемблераАссемблер – это машинно-ориентированный язык низкого уровня. Программа-ассемблер заменяет мнемонические обозначения команд и операндов соответственно на коды команд и адреса операндов. Этот процесс называют ассембли-рованием кода. Ассемблерная программа состоит из операторов и директив. Операторы – это инструкции, исполняемые процес-сором (например, MOV, ADD и т. д.). Директивы, как правило, служат для указания режимов работы ассемблера (например, директива .MODEL, см. ниже), для разбиения потока операторов на сегменты и процедуры, определения данных (также см. ниже), указания размера операнда (BYTE PTR, WORD PTR) и выполнения некоторых других операций. Отдельные операторы или данные могут быть снабжены меткой, указывающей адрес команды либо операнда. Метка должна начинаться с латинской буквы либо символов _, @, $ и может содержать в себе латинские буквы, символы _, @, $ и цифры. В качестве метки нельзя использовать названия команд и директив. Оператор ассемблера имеет вид: [Метка:] Код_операции [Операнды] [; Комментарий] В квадратных скобках находятся необязательные поля. Приведем несколько примеров: Metka1 MOV AX, ES:[DI] PUSH AX ; Запись AX в стек. CLC ; Сброс флага переноса Программа обычно начинается с директивы .MODEL SMALL которая сообщает ассемблеру, что используются сегменты размером не более 64 килобайт. Как уже было указано, программа состоит из трех сегментов: кода, данных и стека. Сегменты определяются с помощью директив SEGMENT и ENDS следующим образом: Имя SEGMENT Тип Операторы … Имя ENDS где Имя – метка сегмента; Тип – ‘code’ – сегмент кода; ‘data’ – сегмент данных; STACK ‘stack’ – сегмент стека. Написание сегментов будет рассмотрено ниже. Заканчивается программа директивой END. Она имеет вид: END метка, где метка – адрес оператора программы, который должен быть выполнен первым при старте программы. 2.2.Написание сегмента данныхСегмент данных предназначен для хранения данных программы таких, как глобальные переменные. Место под переменные отводится директивами определения данных. Рассмотрим некоторые из них: DB – резервирование одного байта; DW – резервирование одного слова из двух байт. DD – резервирование двойного слова из 4 байт. Эти директивы имеют 3 формы:
Вместо константы в этих директивах можно указать символ ?, обозначающий то, что место под переменную или массив выделяется, но значение будет не определено. Пример сегмента данных: Dseg SEGMENT ‘data’ X DB 15 ; Переменная с начальным ;значением 15 Y DW ? ; Переменная с неопределенным ;значением Mas DB 40 DUP(0) ; Массив из 40 элементов с ;нулевым значением Mas2 DW 15,24,45,-17,0,14,1 ; Массив из 7 элементов с ;заданными значениями Dseg ENDS |