Лабораторная работа №1
Методические указания предназначены для студентов, слушающих курс Машинно-зависимые языки программирования. В качестве среды программирования при этом используется RADAsm. Данная среда позволяет осуществлять ввод программ на ассемблере, их ассемблирование, компоновку и выполнение в консольном и обычном режимах Windows. Для отладки программ к среде подключен 32-разрядный отладчик OlleDBG. Настоящие указания содержат необходимые теоретические сведения, практические рекомендации и задания по выполнению работ в указанной среде программирования.
Masm32 – специализированный пакет программирования на языке ассемблера IA-32. Являясь продуктом фирмы Microsoft, он максимально приспособлен для создания Windows-приложений на ассемблере. Кроме транслятора, компоновщика и необходимых библиотек пакет Masm32 включает сравнительно простой текстовый редактор и некоторые инструменты, предназначенные для облегчения программирования на ассемблере. Однако набор инструментов не содержит 32-х разрядного отладчика и предполагает работу в командном режиме, что не очень удобно.
В лабораторных работах для создания программ будет использоваться специализированная интегрированная среда RADAsm, которая помимо других ассемблеров позволяет использовать Masm32. Точнее будет использоваться специально настроенная среда – «сборка» RADAsm + OlleDBG, где OlleDBG – 32-х разрядный отладчик.
Цель работы
Изучение структуры программы на языке Ассемблер; знакомство со средой программирования RadASM; изучение команд пересылки данных; изучение команд для работы с адресами и указателями; изучение методов адресации; изучение арифметических и логических команд.
Структура программы
Директивы сегментации
Программа на языке Ассемблер состоит из следующих частей – сегментов:
1) сегмент стека, промежуточная область памяти с методом доступа к элементам LIFO («последним пришел – первым вышел»);
2) сегмент данных содержит обрабатываемые, промежуточные данные. Данные описываются следущим образом:
Имя Тип выражение
Тип определяет размер данных: DB – один байт, DW – два байта, DD – четыре байта и так далее. Выражение определяет значение, если стоит «?», то переменная не инициализирована.
var1 db 56 ; переменная var1 имеет значение 56
var2 dw 4376h ; var2 имеет значение 4376h (в десятичной – 17270)
var3 dd 3567302334 ; var3 имеет значение 3567302334
var4 dq ? ; значение переменной var4 не определено
3) сегмент кода содержит исполняемый код.
Использование стандартных директив сегментации
При использовании стандартных директив сегментации каждый сегмент данных необходимо описывать директивами сегментации:
Имя_сегмента SEGMENT Тип_выравнивания Тип_комбинирования Класс Размер Имя_сегмента ENDS
Таблица 1 – Описание стандартных директив сегментации
Атрибут |
Назначение |
Выравнивание |
сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе |
Комбинирование |
сообщает компоновщику, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя |
Класс |
заключенная в кавычки строка, помогающая компоновщику определить нужный порядок следования сегментов при сборке программы из сегментов нескольких модулей |
Размер |
сегменты могут быть 16- или 32-разрядными |
Для того что бы сообдить транслятору какой сегмент к какому сегментному регистру привязан используется директива ASSUME:
ASSUME регистр: Имя_сегмента, регистр: Имя_сегмента, …
Структура программы с использованием директив сегментации будет выглядить следующим образом.
1 Объявление сегмента стека.
2 Объявление сегмента данных.
3 Начало сегмента кода:
– директива SEGMENT;
– директива main (proc) (объявление главное процедуры);
– директива ASSUME (связывание сегментов с сегментными регистрами)
4 Настройка сегмента данных командами
mov ax,Имя_сегмента_данных
mov ds,ax
5 Тело программы
6 Стандартное окончание:
– процедур:
RET;
Имя_процедуры ENDP
– кодового сегмента:
mov ax,4C00h
int 21h
Имя_сегмента ENDS
– программы: END Имя_главной процедуры
Использование упрощенных директив сегментации
Для простых программ, содержащих по одному сегменту для кода, данных и стека, описание упрощено с помощью использования упрощенных директив сегментации и директивы указания модели памяти MODEL.
Таблица 2 – Описание некоторых упрощенных директив сегментации
Для сравнения приведем два листинга с программами на ассемблере. Функционально они одинаковы и выводят на консоль сообщение: «Hello World».
Формат команды
Формат кодирования команд Ассемблера имеет следующий вид