Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
DATA SEGMENT
PAIR DB 13
DATA ENDS
CODE SEGMENT
START: MOV AX, DATA
MOV DS, AX
MOV AX, [WORD PTR PAIR]; см. п. 3.2.6.
CODE ENDS
DATA SEGMENT
DB 4CH
DATA ENDS
CODE SEGMENT
INT 21H
CODE ENDS
STACK_SEGMENT STACK
DB 100H DUP (?)
STACK_ENDS
END START
После выполнения данной ассемблерной программы в регистре АL окажется число 13 и по завершении программы произойдет передача управления системному отладчику
(используется системное прерывание DOS – 21h, с содержимым регистра AH = 4Ch).
3.2.5.4 Директивы внешних ссылок PUBLIC, EXTRN
Использование этих директив позволяет осуществлять передачу между модулями программы меток констант, переменных и команд. Эта связь осуществляется таким образом, что в модуле, экспортирующем метку, используется директива PUBLIC, а в модуле, импортирующем метку - директива EXTRN.
Директива PUBLIC имеет вид:
PUBLIC symbol, symbol..... symbol,
где symbol является экспортируемой меткой.
Директива EXTRN имеет вид:
EXTRN define, define,... define.
где каждый define представляется одной из форм:
symbol: type,
где symbol – импортируемая метка,
type – тип импортируемой метки, который может быть:
ABS – имя константы;
BYTE – имя байтовой переменной;
WORD – имя переменной типа WORD (2 байта);
DWORD – имя переменной типа DWORD (4 байта);
QWORD – имя переменной типа QWORD (8 байт);
NEAR – имя близкой процедуры или команды;
FAR – имя далёкой процедуры или команды;
3.2.5.5. Описание процедур
Процедура является частью программы, реализующей отдельный фрагмент алгоритма. Она сконструирована так, чтобы могла вызываться из различных мест программы и после ее выполнения могло бы произойти возвращение в место ее вызова.
Вызов процедуры происходит с помощью команды CALL. Ее выполнение имеет тот же результат, что и выполнение команды JMP, с той лишь разницей, что происходит дополнительная пересылка в стек места возврата из процедуры, т.е. ближнего или дальнего адреса того байта памяти, который стоит после команды CALL. Ближний адрес состоит только из смещения в данном сегменте, дальний - из базового адреса сегмента и смещения. В случае дальнего адреса сначала заносится в стек базовый адрес сегмента, а затем смещение.
Возврат из вызванной процедуры по ближнему адресу происходит с помощью команды retn, а по дальнему с помощью команды retf.
Описание процедуры имеет вид:
name PROC type
..........
name ENDP,
где name – имя процедуры;
type – тип процедуры: NEAR – близкая, FAR – далекая.
3.2.5.6 Упрощенные директивы
Для упрощения записи программ используются специальные директивы .MODEL,.CODE,.DATA,.STACK и др.
Использование директивы .MODEL предваряет введение других упрощенных директив.
Эта директива для программ, написанных на ТУРБО АССЕМБЛЕРЕ, имеет вид:
.MODEL model,
где model – тип модели памяти.
Модели памяти могут быть: TINY, SMALL, MEDIUM, COMPACT, LARGE.
Модель | Назначение модели |
TINY | Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата.COM |
SMALL | Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Используется для большинства программ на ассемблере. |
MEDIUM | Код занимает несколько сегментов по одному на каждый объединенный программный модуль. Все ссылки на передачу управления – типа FAR. Данные объединены в одну группу, все ссылки на них типа NEAR. |
COMPACT | Код в одном сегменте, ссылки на данные – типа FAR. |
LARGE | Код в нескольких сегментах, по одному на каждый объединенный программный модуль. |
Использование директивы.MODEL позволяет заменить сегментные директивы:
_DATA SEGMENT WORD PUBLIC ‘DATA’
(текст сегмента);
_DATA ENDS
упрощенной директивой
.DATA
(текст сегмента);
_TEXT SEGMENT WORD PUBLIC ‘CODE’
(текст сегмента);
_TEXT ENDS
на упрощенную директиву
. CODE
(текст сегмента);
_STACK SEGMENT PARA STACK ‘STACK’
(текст сегмента);
_STACK ENDS
на упрощенную
. STACK
(текст сегмента).
В целях упрощения ссылки на имена сегментов вводятся следующие неявные определения:
@DATA – имя сегмента, определяемого директивой.DATA;
@CODE - имя сегмента, определяемого директивой.CODE;
@FileName – имя компилируемого файла;
@CurSeg – имя текущего компилируемого целого сегмента;
??DATA – дата компиляции;
??Time – время компиляции.
Кроме того, предполагается действие директивы GROUP, имеющей вид:
DGROUP GROUP _DATA, _STACK и
директивы ASSUME, где регистр CS связан с именем, определенным директивой.CODE, а DS и SS связан с группой DGROUP.
Пример программы с упрощенными директивами:
. MODEL SMOLL
. DATA
FIX DB 13
. CODE
START: MOV AX, @DATA
MOV DS, AX
MOV AL, [FIX]
MOV AH, 4CH
INT 21H
. STACK 100H
END START
Равнозначная программа с расширенными директивами:
DGROUP GROUP _DATA, _STACK
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP
_DATA SEGMENT WORD PUBLIC ‘DATA’
FIX DB 13
_DATA ENDS
_TEXT SEGMENT WORD PUBLIC ‘CODE’
START: MOV AX, _DATA
MOV DS, AX
MOV AL, [FIX]
MOV AH, 4CH
INT 21H
_TEXT ENDS
_STACK SEGMENT PARA STACK ‘STACK’
DB 100H DUP (?)
_STACK ENDS
END START
3.2.5.7 Директивы управления трансляцией
Директива END имеет формат:
END label.
где label – метка точки входа в программу (первого исполняемого оператора).
Директива END обозначает конец программного модуля. Если программа содержит более одного модуля, то точку входа может определить только одна из них. Этот модуль называется основным. Если пользователь забыл указать точку входа, то правильная инициализация его программы может оказаться невозможной.
3.2.6 Операторы языка ассемблера
Существует пять видов операторов (табл.8): арифметические, логические, отношения, а также операторы, возвращающие значения, и операторы присвоения атрибута.
Таблица 7
Операторы языка ассемблера
Дата публикования: 2015-11-01; Прочитано: 1409 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!