Практическая
работа №2.
Тема: Программирование арифметических и логических команд
(часть 1).
Цель: Практическое
освоение составления простейших программ на языке Ассемблера и работы с
программами TASM и TLINK.
Теоретическая
часть
Несмотря
на то, что современные языки программирования высокого уровня обеспечивают не
только удобное, но и эффективное системное программирование, в тех случаях,
когда особенно важно получить оптимальный объектный код, необходимо
использовать Ассемблер.
Исходный
модуль программы на Ассемблере представляет собой последовательность строк,
имеющих следующий формат:
[метка]
команда [операнд(ы)] [комментарий]
После
метки ставится двоеточие, команда и операнд разделяются по крайней мере одним
пробелом ; если операндов несколько, то они разделяются запятыми; перед
комментарием ставится точка с запятой. В квадратные скобки заключены
необязательные компоненты.
Ассемблер
имеет ряд операторов, которые позволяют управлять процессом ассемблирования и
формирования листинга. Эти операторы называются псевдокомандами или
директивами. Они действуют только в процессе ассемблирования программы и не
генерируют машинных кодов.
Любые
ассемблерные программы содержат по крайней мере один сегмент-сегмент кода. В
некоторых программах используются сегмент для стековой памяти и сегмент данных
для определения данных. Сегмент описывается директивой SEGMENT следующим
образом:
имя
SEGMENT [параметры]
имя
ENDS
Сегмент
кода содержит одну или несколько процедур, определяемых директивой PROC:
имя
сегмента SEGMENT имя процедуры PROC
RET
имя процедуры ENDP имя сегмента ENDS
Пример
простой исходной программы на Ассемблере представлен ниже:
TITLE
PROG1 ПРИМЕР РЕГИСТРОВЫХ ОПЕРАЦИЙ;
STACKSG
SEGMENT PARA STACK 'Stack'
DB
12 DUP(?) STACKSG ENDS
CODESG
SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING
PUSH
DS; cохранение DS в стеке. (1)
SUB
AX,AX ; формирование нуля в АХ. (2)
PUSH
AX ; cохранение АХ в стеке. (3)
MOV
AX,0123H; передача константы в регистр. (4)
ADD
AX,0025H; сложение регистра с константой. (5)
MOV
BX,AX; передача из регистра в регистр. (6)
ADD
BX,AX; сложение содержимого регистров. (7)
MOV
CX,BX; передача из регистра в регистр. (8)
SUB
CX,AX; вычитание содержимого регистров (9)
SUB
AX,AX; формирование нуля в АХ. (10)
NOP;
нет операции (задержка). (11)
RET;
возврат из процедуры. (12)
BEGIN
ENDP;КОНЕЦ ПРОЦЕДУРЫ.
CODESG
ENDS;КОНЕЦ СЕГМЕНТА.
END
BEGIN;КОНЕЦ ПРОГРАММЫ.
В
приведенном примере директива ASSUME сообщает Ассемблеру соответствие между
сегментными регистрами и именами сегментов.
Исходный
текст программы на Ассемблере создается с использованием любого доступного
текстового редактора и сохраняется на магнитном диске под именем *.ASM или *.
TXT. Компилятор Турбо Ассемблер является программой в виде загрузочного файла
TASM.EXE, работающей в режиме командной строки. Он вызывается командой
TASM
имя, где имя является именем исходного файла . Предполагается, что TASM и
исходный файл сохраняются в одном каталоге. При вызове компилятора могут
задаваться режимы его работы. Например, запись в командной строке:
TASM/ZI
PROG1 PROG1 PROG1
приводит
к созданию из исходного файла PROG1.ASM объектного модуля PROG1.OBJ и файла
листинга PROG1.LST. Параметр /ZI приводит к внесению в файл листинга полных
сведений о номерах строк и именах исходного модуля.
С
целью создания исполнительной программы необходимо произвести компоновку
объектных модулей с библиотечными модулями. Компоновщик является программой с
именем TLINK.EXE. Он может быть вызван командой
TLINK
имя объектного модуля
После
компоновки создается загрузочный файл PROG1.EXE, а также файл карты сборки
PROG1.МАР.
Компоновка
в режиме TLINK /t приводит к созданию исполняемого *.СОМ файла, а компоновка в
режиме TLINK /v включает в файл исполняемой программы информацию, необходимую
для ее инициализации и отладки.
Практическая
часть
1.
Изучить методические указания.
2.
Используя текстовый редактор, создайте исходный модуль программы HELLO.ASM:
Data
SEGMENT
Greet
DB 'Привет, Маша!',13,10,'$' Data
ENDS
Stack
SEGMENT Stack
DB
100H DUP(?) ;стек размером 256 байтов.
Stack
ENDS
ASSUME
CS:Code, DS:Data, SS:Stack
Code
SEGMENT Start:
загрузка
номера сегмента (1) в регистр DS. (2) загрузка в DX адреса симв. строки. (3)
задание функции вывода строки. (4) вывод строки. (5) завершение программы
через (6) систем ную функцию возврата (7) в диспетчер MS DOS. (8)
|
MOV
AX,DATA
MOV
DS,AX
MOV
DX,OFFSET Greet
MOV
AH,9
INT
21H
MOV
AL,0
MOV
AH,4CH
INT
21H
Code
ENDS
END
Start; адрес начала программы.
3.
Используя компилятор Турбо Ассемблер, создайте файлы HELLO.OBJ и HELLO.LST. Выведите на экран текст HELLO.LST и проанализируйте его.
4.
Используя компоновщик TLINK, создайте файлы HELLO.EXE и HELLO.MAP.
5.
Выведите на экран файл HELLO.MAP и ознакомьтесь с ним.
6.
Убедитесь в работоспособности программы HELLO.
7.
Проанализировать приведенную ниже программу HELLO.ASM и вставить в нее
фрагмент, реализующий вывод на экран Вашей фамилии, имени, отчества с помощью
символьной переменной STUDENT
8.
Подготовить ответы на контрольные вопросы.
Контрольные
вопросы
1.
Какова цель сегментации памяти?
2.
Что такое базовый адрес сегмента?
3.
Какие значения может принимать базовый адрес сегмента?
4.
Каков максимальный размер сегмента и почему?
5.
Какие типы сегментов использует ассемблерная программа?
6.
Какими директивами описывается сегмент?
7.
Каково назначение директивы ASSUME?
8.
Каково назначение директив TITLE и PAGE?
9.
Что такое процедура и какими директивами она определяется?
10.
Что такое ассемблирование и компоновка программы?
11.
Каково содержание файлов с расширениями *.ASM, *.LST, *.OBJ, *.MAP, *.EXE?
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.