Основные элементы программ на языке Турбо Ассемблер
Команда программы на языке Турбо ассемблер (Turbo assembler) имеет следующий формат /13,18,19/:
[Метка:] [Префикс] Операция Операнды; Комментарий
Поля команды отделяются пробелами, а операнды - запятыми. Команда не может иметь более двух операндов, обозначаемых dst и src.
Структура ассемблерной программы существенно зависит от используемых программистом директив управления сегментами. Турбо ассемблер поддерживает два набора управления сегментами.
Первый набор – стандартные (расширенные) сегментные директивы (GROUP, ASSUME, ENDS, SEGMENT) обеспечивает самые полные средства управления сегментами, необходимые в сложных прикладных программах, но более сложен в использовании, и полученные программные модули имеют сложную логическую структуру.
Второй набор – упрощенные сегментные директивы (DOSSEG, .MODEL, .STACK, .DATA, .CODE) обеспечивает ограниченные средства управления сегментами, но сравнительно прост в применении, и полученные программные модули более обозримы и читаемы.
Практика показывает, что для разработки ассемблерных программ малого и среднего размера как для автономного применения, так и для компоновки с программными модулями, разработанных на языках высокого уровня, достаточно возможностей упрощенных сегментных директив. Поэтому ниже будут рассмотрены директивы этого типа и примеры ассемблерных программ на основе этих директив. Применение стандартных сегментных директив подробно рассмотрено в /18,19/.
Директива DOSSEG вызывает группирование сегментов ассемблерной программы в соответствии с соглашениями, принятыми фирмой Microsoft для языков высокого уровня.
Директива .MODEL model, language задает модель памяти, где model представляет имя модели памяти, а language – имя языка программирования (C, Pascal и др.), на котором написаны вызываемые процедуры данного ассемблерного модуля. В программах, написанных целиком на языке Турбо ассемблер, достаточно ограничиться названием модели памяти.
Существуют следующие модели памяти:
tiny – код и данные программы размещаются в одном и том же сегменте, размером 64 Кбайт;
small – код и данные программы размещаются в двух отдельных сегментах размером 64 Кбайт;
medium – код программы может занимать более одного сегмента, а данные этой программы размещаются в одном отдельном сегменте;
compact – код программы занимает один сегмент, а данные могут размещаться в нескольких сегментах;
large и huge – код программы и данные могут превышать по размеру 64 Кбайт и занимать по несколько сегментов.
Ассемблерные программы на практике редко требуют более 64 Кбайт памяти для программного кода или данных, поэтому для большинства приложений применима модель small.
Директива .STACK size определяет размер стека. Например, .STACK 200h
определяет размер стека равным 200h, или 512 байт.
Директива .CODE определяет начало кодового сегмента программы и не имеет операндов. Загружать регистр CS в явном виде никогда не требуется, ибо это производит операционная система при запуске программы. Подобным образом операционная система устанавливает также регистр SS и, как правило, во время работы программы эта установка сохраняется.
Директива .DATA определяет начало сегмента данных. Следует учесть, что при выполнении программы для доступа к ячейкам памяти сегмента данных, определяемого директивой .DATA, необходимо явно загрузить в регистр DS символическое имя @Data. Эта загрузка обычно производится последовательностью из двух команд:
………………..
mov ax,@Data
mov ds,ax
………………..
Таким образом, обобщенная структура (шаблон) типовой ассемблерной программы, использующей упрощенные сегментные директивы, имеет вид:
DOSSEG
.MODEL SMALL
.STACK size
.DATA
.CODE
ProgramStart:
mov ax,@data
mov ds,ax ;Устанавливает DS на сегмент .DATA
mov ah,4ch ;Обращение к DOS для выхода из программы
int 21h
END ProgramStart
Ниже приведен пример ассемблерной программы, использующей упрощенные сегментные директивы.
;==================================================
;Эта программа реверсирует введенную строку и отображает реверсируемую ;и реверсированную строки на экране дисплея.
;==================================================
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
MAX_LENGTH EQU 100
STR_REVERS DB MAX_LENGTH DUP (?)
REVERS_STR DB MAX_LENGTH DUP (?)
.CODE
ProgReverse:
mov ax,@Data ;Установка регистра DS на
mov ds,ax ;сегмент данных
mov ah,3fh ;Функция DOS считывания из ;устройства с логическим номером в bx
mov bx,00 ;Логический номер стандартного
;устройства ввода - клавиатуры
mov cx,MAX_LENGTH ;Считывание до ;максимального числа символов в cx
mov dx,OFFSET STR_REVERS;Адресация области ;памяти буфера для реверсируемой строки
int 21h ;Прием символов
and ax,ax ;Были ли считаны какие-либо символы
jz Last ;Нет, переход на завершение программы
mov cx,ax ;Записать число введенных символов в cx
push cx ;Сохранить в cx длину введенной строки
mov bx,OFFSET STR_REVERS ;Реверсируемая строка
mov si,OFFSET REVERS_STR ;Реверсированная строка
add si,cx ;Указание на конец буфера
dec si ;реверсированной строки
ReverseLoop: mov al,[bx] ;Прием следующего символа и ;запись
mov [si],al ;символов в обратном порядке
inc bx ;Указание на следующий символ в буфере ;реверсируемой строки
dec si ;Указание на предыдущий символ в буфе ;ре реверсированной строки
Loop ReverseLoop ;Перенос следующего символа, если ;символ есть
pop cx ;Считать из cx длину введенной строки
mov ah,40h ;Функция DOS записи в устройство
mov bx,1 ;с логическим номером в bx
mov dx, OFFSET REVERS_STR ;Вывод на экран дисплея
int 21h ;этой строки
Last: mov ah,4ch ;Обращение к функции DOS
Int 21h ;для выхода из программы
END ProgReverse ;Конец программы
В рассмотренной программе для ввода реверсируемой и вывода реверсированной строк использовались служебные функции 3fh и 40h MS – DOS, вызываемые через программное прерывание int 21h /15,18/.
Многочисленные примеры программ на языках Турбо ассемблер и Макро ассемблер рассмотрены в /18,19,20/.
Создание ассемблерной программы, как уже было рассмотрено выше, включает этапы редактирования, ассемблирования, компоновки (линкирования) и отладки. Положим, с помощью редактора подготовлен исходный модуль (файл) программы REVERSE.ASM из последнего примера. Для ассемблирования файла REVERSE.ASM вводится следующая командная строка Турбо ассемблера:
TASM REVERSE
Если не задано другое имя файла, в результате ассемблирования получается объектный файл REVERSE.OBJ. Для выполнения компоновки, если после ассемблирования не было сообщений об ошибках или предупреждений, вводится следующая командная строка: TLINK REVERSE
По завершении компоновки, если не было сообщений об ошибках, получается загрузочный файл REVERSE.EXE программы.
Для отладки ассемблерных программ используются различные инструментальные оболочки и сервисные программы.
Контрольные вопросы и задания
1.Какие особенности архитектуры имеет семейство микропроцессоров i8086/8088?
2.В чем суть конвейерного метода выполнения команд? Для каких типов задач конвейерный метод эффективен, а для каких нет?
3.Для эффективной работы конвейера как должны соотноситься длина конвейера и длина программы?
4.Выведите формулу для определения оптимального числа ступеней конвейера.
5. Для решения каких задач применение суперскалярных процессоров неэффективно?
6.Для решения каких задач разработана сегментная организация памяти?
7.Каким образом происходит преобразование логического адреса в физический адрес?
8. Какие модели памяти применяются при программировании на Турбо Ассемблере?
9.Какая структура программы при программировании на Турбо Ассемблере?
10.Какие методы предсказания условных переходов используются в современных процессорах?
Дата добавления: 2021-12-14; просмотров: 329;