Структура программы на языке ассемблера

— операндной — определяющей объекты обработки, «с чем делать».

Машинная команда микропроцессора, записанная на языке ассемблера, представляет собой одну строку, имеющую следующий синтаксический вид:

метка команда/директива операнд(ы) ;комментарии

При этом обязательным полем в строке является команда или директива.

Метка, команда/директива и операнды (если имеются) разделяются, по крайней мере, одним символом пробела или табуляции.

Если команду или директиву необходимо продолжить на следующей строке, то используется символ обратный слеш: .

По умолчанию язык ассемблера не различает заглавные и строчные буквы в написании команд или директив.

Примеры строк кода:

Count db 1 ; Имя, директива, один операнд

mov eax,0 ; Команда, два операнда

Метка в языке ассемблера может содержать следующие символы:

— все буквы латинского алфавита;

— цифры от 0 до 9;

В качестве первого символа метки может использоваться точка, но некоторые компиляторы не рекомендуют применять этот знак. В качестве меток нельзя использовать зарезервированные имена Ассемблера (директивы, операторы, имена команд).

Урок 17. Язык ассемблера. Основы

Первым символом в метке должна быть буква или спецсимвол (но не цифра). Максимальная длина метки – 31 символ. Все метки, которые записываются в строке, не содержащей директиву ассемблера, должны заканчиваться двоеточием : .

Команда указывает транслятору, какое действие должен выполнить микропроцессор. В сегменте данных команда (или директива) определяет поле, рабочую область или константу. В сегменте кода команда определяет действие, например, пересылка (mov) или сложение (add).

Директивы — операторы, позволяющие управлять процессом ассемблирования и формирования листинга. Они действуют только в процессе ассемблирования программы и, в отличие от команд, не генерируют машинных кодов.

Операнд – объект, над которым выполняется машинная команда или оператор языка программирования.

Команда может иметь один-два операнда, или вообще не иметь операндов. Число операндов неявно задается кодом команды.

Нет операндов: ret ; Вернуться

Один операнд: inc ecx ; Увеличить ecx

Два операнда: add eax,12 ; Прибавить 12 к eax

Метка, команда (директива) и операнд не обязательно должны начинаться с какой-либо определенной позиции в строке. Однако рекомендуется записывать их в колонку для большего удобства чтения программы.

В качестве операндов могут выступать

— цепочки символов, заключенных в одинарные или двойные кавычки;

— целые числа в двоичной, восьмеричной, десятичной или шестнадцатеричной системе счисления.

Идентификаторы – последовательности допустимых символов, использующиеся для обозначения таких объектов программы, как коды операций, имена переменных и названия меток.

Правила записи идентификаторов:

— Идентификатор может состоять из одного или нескольких символов.

— Идентификатор не может начинаться символом цифры.

ЯЗЫК АССЕМБЛЕРА за 3 МИНУТЫ

— Длина идентификатора может быть до 255 символов.

— Транслятор воспринимает первые 32 символа идентификатора, а остальные игнорирует.

Комментарии отделяются от исполняемой строки символом ; . При этом все, что записано после символа точка с запятой и до конца строки, является комментарием. Использование комментариев в программе улучшает ее ясность, особенно там, где назначение набора команд непонятно. Комментарий может содержать любые печатные символы, включая пробел. Комментарий может занимать всю строку или следовать за командой на той же строке.

Структура программы на ассемблере

Программа, написанная на ассемблере MASM, может состоять из нескольких частей, называемых модулями, в каждом из которых могут быть определены один или несколько сегментов данных, стека и кода. Любая законченная программа на ассемблере должна включать один главный, или основной, модуль, с которого начинается ее выполнение.

Модуль может содержать программные сегменты, сегменты данных и стека, объявленные при помощи соответствующих директив. Кроме того, перед объявлением сегментов нужно указать модель памяти при помощи директивы .MODEL.

.MODEL FLAT, STDCALL

В данной программе представлена всего одна команда микропроцессора. Эта команда RET. Она обеспечивает правильное окончание работы программы. В общем случае эта команда используется для выхода из процедуры.

Читайте также:
Адаптивная или адаптированная программа как правильно

Остальная часть программы относится к работе транслятора.

.686P — разрешены команды защищенного режима Pentium 6 (Pentium II).

Данная директива выбирает поддерживаемый набор команд ассемблера, указывая модель процессора. Буква P, указанная в конце директивы, сообщает транслятору о работе процессора в защищенном режиме.

.MODEL FLAT, — плоская модель памяти. Эта модель памяти используется в операционной системе Windows. STDCALL – используемое соглашение о вызовах процедур.

.DATA — блок программы, содержащий данные. В MS-DOS это называлось сегментом. В Windows для прикладной программы сегменты отсутствуют, точнее, есть один большой плоский сегмент. Такие блоки здесь называются секциями.

Секции можно задать различные свойства. Например, запретить запись в нее, или сделать секцию доступной для других программ, используя стандартные директивы сегментации.

Данная программа не использует стек, поэтому секция .STACK отсутствует.

.CODE — блок программы, содержащей код.

START — метка. В ассемблере метки играют большую роль, что не скажешь о современных языках высокого уровня.

END START — конец программы и сообщение компилятору, что начинать выполнение программы надо с метки START.

Каждая программа должна содержать директиву END, отмечающую конец исходного кода программы. Все строки, которые следуют за директивой END, игнорируются. Если вы опустите директиву END, то генерируется ошибка.

Метка, указанная после директивы END, сообщает транслятору имя главного модуля, с которого начинается выполнение программы. Если программа содержит один модуль, метку после директивы END можно не указывать.

Операционная система Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность – любая процедура может быть запущена как самостоятельная задача.

Программирование в Windows основывается на использовании функций API (Application Program Interface, т.е. интерфейс программного приложения). Их количество достигает двух тысяч. Программа для Windows в значительной степени состоит из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы будет происходить посредством таких функций.

Операционная система Windows использует плоскую модель памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например EBX. Следовательно, мы фактически не ограничены в объеме данных, кода или стека (объеме локальных переменных). Выделение в тексте программы сегмента кода и сегмента данных является теперь простой формальностью, улучшающей читаемость программы.

Вызов функций API. В файле помощи любая функция API представлена в виде (например):

int MessageBox (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

Данная функция выводит на экран окно с сообщением и кнопкой (или кнопками) выхода. Смысл параметров:

hWnd -дескриптор окна, в котором будет появляться окно-сообщение,

lpText — текст, который будет появляться в окне,

lpCaption — текст в заголовке окна,

uType — тип окна, в частности можно определить количество кнопок выхода.

Теперь о типах параметров. Практически все параметры API-функций в действительности 32-битные целые числа:

HWND — 32-битное целое,

LPCTSTR — 32-битный указатель на строку,

UINT — 32-битное целое. К имени функций часто добавляется суффикс «А» для перехода к более новым версиям функций.

При этом все аргументы функции передаются в нее через стек (команда PUSH). Направление передачи аргументов: СЛЕВА НАПРАВО— СНИЗУ ВВЕРХ. В соответствии с этим, первым будет помещаться в стек аргумент uType.

Таким образом, вызов указанной функции будет выглядеть так:

Результат выполнения любой API функции — это, как правило, целое число, которое возвращается в регистре EAX.

Читайте также:
Программа что запоминает пароли

.MODEL FLAT, STDCALL

MessageBoxA PROTO :DWORD, :DWORD, :DWORD,

Источник: studopedia.net

Структура программы на языке Ассемблер

Программа на языке ассемблера представляет собой текст разбитый на строки. Каждая строка либо соответствует машинной команде, либо является директивой ассемблера или макрокомандой. Команды и директивы можно набирать как большими, так и малыми латинскими буквами. Русские буквы можно использовать только в комментариях.

команды или директивы

команды или директивы

end

Директива end < метка входа в программу>отмечает конец текста программы и указывает ассемблеру, где завершить трансляцию. Поэтому директива end должна присутствовать в каждой программе.

< метка точки входа >указывает инструкцию, с которой должно начинаться выполнение программы.

Каждая программа содержит сегменты данных и команд, но минимально должна содержать сегмент команд.

Строка программы, в общем случае, состоит из четырех полей:

Поле метки Поле операции Поле операндов Поле комментария
M1: Add AX, BX ; сложение

Имена данных, процедур, сегментов или метки команд могут состоять не более чем из 31 латинских букв и цифр, причем первым символом должна быть обязательно буква. Большие и маленькие буквы не различаются.

Директивы ассемблера

Директивой называется команда транслятору для выполнения определённых данной директивой действий, сама директива в текст транслированной программы не включается.

1. Директива задания исходных данных:

· — имя массива данных, по которому к ним можно обратиться из команды;

· d (define)– определяет начало массива данных;

· — размер констант, входящих в массив:

b байт,
w Слово (два байта),
d двойное слово,
q учетверённое слово,
t десять байтов;

· — числовой или символьный элемент массива дан­ных.

В ассемблере используется несколько типов констант:

десятичные – последовательность цифр от 0 до 9;

шестнадцатеричные – последовательность шестнадцатеричных цифр от 0 до 9 и от А или а до F или f завершающаяся буквой H или h, первой должна быть десятичная цифра или 0;

восьмеричные – последовательность цифр от 0 до 7, завершающаяся буквами Q или q;

двоичные – последовательность цифр от 0 до 1, завершающаяся буквой B или b;

символьные – символ или группа символов, заключённые в кавычки;

знак? – используется для резервирования места для данных.

data1 db 123, 0a2h, 75q, 110011b, ‘a’, ‘пример’.

Для заполнения больших массивов используется директива dup (duplicate):

— задаёт количество размещаемых в памяти данных, определяемых образцом;

— любая допустимая группа констант.

data2 db 23 dup(1, 2, ‘x’)

выделяет в памяти 23 · 3=69 байтов и заносит в них образец 1, 2, ‘x’, 1, 2, ‘x’, ….

2. Директива использования сегментных регистров по умолчанию:

Как отмечалось выше, для задания адреса в памяти требуется два регистра, один из них всегда сегментный, поэтому в команде при обращении к памяти приходится набирать имя сегментного регистра, часто одного и того же. Директива assume позволяет избежать этого. Транслятор сопоставляет имя массива данных и автоматически подставляет сегментный регистр, заданный для сегмента, в котором расположен данный массив. Слово nothing показывает, что данный сегментный регистр не адресуется по умолчанию. Директива assume может использоваться в программе при каждом изменении сегмента для данного сегментного регистра, но обязательно в начале сегмента, где она задаёт по умолчанию сегментный регистр для сегмента кодов.

assume cs:code, ds:data1, es:nothing

Здесь code и data1 – имена сегментов кодов и данных, соответственно.

Режимы адресации

1. Регистровая прямая — операнд находится в регистре.

< регистр >- АХ, ВХ, СХ, DX, SI, DI, BP, SP, AL, BL, СL, DL, AH, BH, CH, DH.

mov АХ,SI; переслать содержимое регистра SI в регистр АХ.

2. Непосредственная -непосредственный операнд (константа) присутствует в команде.

Читайте также:
Где в компьютере найти программу запуска

mov AX, 093Ah; занести константу 093Ah в регистр АХ.

3. Прямая — исполнительный адрес операнда присутствует в команде.

mov AX, WW; переслать в АХ слово памяти с именем WW

mov BX, WW+2; переслать в ВХ слово памяти отстоящее от переменной с именем WW на 2 байта.

4. Регистровая косвенная — регистр содержит адрес операнда.

mov [ BX ], CL; переслать содержимое регистра CL по адресу, находящемуся в регистре ВХ.

5. Регистровая относительная — адрес операнда вычисляется как сумма содержимого регистра и смещения.

< регистр >- SI или DI индексная адресация, ВХ или ВР — базовая адресация.

mov АХ, WW[SI]; переслать в АХ слово из памяти, адрес которого вычисляется как сумма содержимого регистра SI и смещения WW.

6. Индексно — базовая — адрес операнда вычисляется как сумма содержимых базового и индексного регистров и смещения.

mov [BX+ SI+ 2], CL; переслать содержимое регистра CL по адресу, вы­числяемому как сумма содержимого регистров ВХ, SI и константы 2.

Источник: cyberpedia.su

Структура программы на языке ассемблера

Программа на языке ассемблера представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких сегментов. Каждый сегмент содержит совокупность предложений языка, каждый из которых занимает отдельную строку кода программы.

Предложения на языке ассемблера бывают 4 типов:

1. Команды или инструкции, представляющие собой символьные аналоги машинных команд. В процессе трансляции эти инструкции преобразуются в соответствующие команды и системы команд микропроцессора.

2. Макрокоманды — оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.

3. Директивы — указания транслятору на выполнение отдельных действий. В директивах нет аналогов в машинном представлении.

4. Строки комментариев — любые последовательности символов, транслятором полностью игнорируются.

Синтаксис языка ассемблера

Для того, что бы транслятор мог предложения языка, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание языка, наподобие грамматики.

Общий формат команд на языке ассемблера.

Имя метки — идентификатор, значение которого является адрес 1 байта, предложенного текста программы, кот. он обозначает.

КОП — код операции, мнемоническое обозначение машинной команды или макрокоманды.

Операнды — части команды (макрокоманды) обозначающие объекты над которыми производится действие.

Допустимые символы для написания текста программ:

· все латинские буквы (заглавные и строчные являются эквивалентными);

· разделители и знаки операций.

Предложения языка ассемблера формируется из лексем, представляющих собой синтаксически не разделимые последовательности допустимых символов языка, имеющие смысл для транслятора.

2. Цепочки символов — это последовательность символов, заключенные в одинарные или двоичные кавычки.

3. Целые числа — в одной из следующих систем исчисления: 2-ой, 10-ой, 16-ой.

Отожествление чисел производится по следующим правилам:

а) 10-е числа не требуют указания каких-либо дополнительных символов (25, 16);

б) 2-е числа требуют, чтобы после них стояла буква b (10011010b)

в) 16-е числа имеют больше условий при записи: во-первых — они состоят как из цифр, так и из символов латинского алфавита; во-вторых — у транслятора могут возникнуть сложности с распознаванием 16-ого числа, так как число может начинаться как с цифры, так и с символа. Для этого 16-е число обязательно заканчивается латинской буквой h (019ch).

Каждое предложение на языке ассемблера содержит описание объекта, над которым или с помощью которого выполняются некоторые действия, эти объекты называются операндами.

Операнды- это объекты (значение, регистры, ячейки памяти), на которые действуют инструкции или директивы или это объекты, которые уточняют действие инструкций и ли директив.

Операнды могут комбинироваться с арифметически — логическими, побитовыми операторами для расчета некоторого значения или определения ячейки памяти, на которую будет воздействовать команда.

Источник: studbooks.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru