2. Этапы создания программы на языке Ассемблер. Вывод строки на экран
2. Этапы создания программы на языке Ассемблер. Вывод строки на экран
Цель работы: получение знаний об основных правилах записи и структуре программ на языке Ассемблер для ПЭВМ типа IBM PC; приобретение практических навыков по составлению простейших программ на языке Ассемблер.
Теоретическая часть
Этапы создания программы
Разработка программы на Ассемблере включает несколько шагов:
- подготовку исходного кода программы,
- ассемблирование программы (получение объектного кода),
- компоновку программы (получение исполняемого файла программы),
- отладку программы.
Текст программы записывается в один или несколько файлов. Имена файлов и их расширения могут быть произвольными, однако принято использовать для файлов, содержащих основную программу, расширение .asm, а для вспомогательных файлов, содержащих описание констант, новых типов, библиотеки функций, – расширение .inc.
Подготовленный текст программы необходимо преобразовать в машинные команды, которые могут быть выполнены микропроцессором. Это можно осуществить с помощью программ, называемых ассемблерами. После ассемблирования получают объектные модули с расширением .obj. Ассемблирование можно выполнить с помощью компиляторов masm фирмы Microsoft или tasm фирмы Borland.
Процесс подготовки программы включает и процесс компоновки (редактирования связей). Работа компоновщика заключается в том, чтобы в каждом модуле определить и связать ссылки на неопределённые имена и обеспечить переместимость программы. Когда программа включает несколько модулей, компоновщик объединяет их в один файл. В итоге будет получен выполняемый файл с расширением .exe или .com. Для этих целей можно использовать программу–компоновщик link фирмы Microsoft или tlink фирмы Borland.
Например, пусть файлы с исходными кодами называются prog1.asm и myLib.inc. В этом случае ассемблирование и компоновку можно выполнить следующими командами:
Таблица команд ассемблирования и компоновки
Microsoft | Borland | |
Этап ассемблирования | masm prog1.asm masm myLib.inc |
tasm prog1.asm tasm myLib.inc |
Этап компоновки | link prog1.obj link myLib.obj |
tlink prog1.obj tlink myLib.obj |
Общая схема программы на языке Ассемблер
Строка в программе на Ассемблере может состоять из 4–х полей:
[метка:] команда [поле операндов] [;комментарий]
Метка используется для указания относительного адреса команды и служит для присвоения символического имени первому байту области памяти, в котором будет записан машинный эквивалент команды. Метки могут содержать:
- буквы от A до Z, причем Ассемблер не делает разницы между строчными и прописными буквами;
- цифры от 0 до 9;
- спец.символы – '?', '.'(только первый символ), '@'(коммерческое эт), '$', '_'.
Первым символом в метке должна быть буква или специальный символ. Максимальная длина метки – 31 символ.
Поле команды содержит её имя. Операнды определяют данные, регистры, символические имена (относительные адреса).
Например, команда mov ax, 4 заносит в регистр ax значение 4.
В поле операндов, если оно присутствует, могут быть один или два операнда. Между собой операнды отделяются запятой. В командах с двумя операндами первый - это приемник (destination), а второй – источник (source).
Комментарий начинается с символа ';'. Все символы справа от символа ';' до конца строки воспринимаются Ассемблером как комментарий.
Так как строчные и прописные символы в Ассемблере не различаются, то записи вида mov ah, 9 и MOV AH, 9 воспринимаются Ассемблером одинаково.
Ниже представлены примеры оформления программ для компиляторов masm и tasm.
;Шаблон оформления программы в “стиле” masm .model small ; директива описания модели памяти ; программа имеет модель памяти ; типа small – один сегмент кода и один сегмент данных .stack 100 ; начало сегмента стека .data ; начало сегмента данных ... ; определение данных .code ; начало сегмента кода ... ; здесь можно включить текст подпрограмм и ; данные, которые необходимо расположить ; в сегменте кода .startup ; точка начала выполнения программы ... ; текст программы end ; директива окончания текста программы |
;Шаблон оформления программы в “стиле” tasm sstack SEGMENT para stack "stack" ;определение сегмента стека DB 100 dup (?) ;область стека, не менее 32 слов sstack ENDS ;конец сегмента стека sdata SEGMENT para data ;определение сегмента данных ... ;здесь помещаются директивы ;определения данных sdata ENDS ;конец сегмента данных scode SEGMENT para "code" ;определение сегмента кода ASSUME CS:scode, DS:sdata ;указывает Ассемблеру, что сегмент scode будет ;адресоваться с помощью сегментного регистра CS, ;а сегмент sdata – с помощью сегментного регистра DS. здесь можно ;включить текст подпрограмм и данные, которые необходимо расположить в ;сегменте кода start: ;точка входа в программу здесь ... ;помещается текст программы scode ENDS ;конец сегмента кода END start ;директива окончания текста ;программы |
Директивы определения сегмента делят исходную программу на сегменты. В программе на языке Ассемблер возможны четыре вида сегментов:
- сегмент данных – используется для хранения переменных и констант;
- сегмент стека – используется для хранения временных данных и адресов возврата из подпрограмм;
- сегмент команд – в нем располагается код программы, в нем также могут располагаться подпрограммы и данные;
- дополнительный сегмент данных.
По крайней мере, один сегмент – сегмент команд должен присутствовать в каждой программе.
Сегментный регистр ds должен содержать адрес сегмента, в котором описаны данные. Занести адрес в регистр можно, например, следующим образом:
mov ax, @data ; для masm mov ds, ax или mov ax, sdata ; для tasm mov ds, ax |
Задание
1. Изучить структуру программы на Ассемблере и основные требования к ней.
2. Разработать программу вывода строки “Hello World” на экран в стилях masm и tasm:
- с использованием директивы db определить в сегменте данных строку ‘Hello World’,10,13,’$’ (Hi db ‘Hello World’,10,13,’$’),
- инициализировать регистр ds адресом сегмента данных,
- с помощью функции 9 прерывания 21h вывести эту строку на экран
mov ah, 9 ;номер функции всегда помещается в регистр ah mov dx, offset Hi ;регистр dx содержит начальный адрес ;выводимой строки int 21h ;вызов прерывания |
- завершить программу функцией 4Ch прерывания 21h
mov ah, 4Ch int 21h |
3. С помощью текстового редактора набрать программу и записать ее на диск. Оттранслировать программу и получить объектный файл, листинг программы и исполняемый файл. Например, если исходный файл называется myLab1.asm, то с помощью команд
tasm myLab1.asm, ,
tlink myLab1.obj
получаются файлы myLab1.obj, myLab1.exe и myLab1.lst.
Изучить полученный листинг программы.
Оставить комментарий