![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
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
Операторы языка ассемблера
Операции | Функция |
Арифметические | Формат: значение1+ значение2 Складывает значение1 и значение2 Формат: значение1- значение2 Вычитает значение2 из значение1 |
+ | |
- | |
* | Формат: значение1 х значение2 Умножает значение1 на значени2 |
/ | Формат: значение1 / значение2 Делит нацело значение1 на значение2 и возвращает частное |
MOD | Формат: значение1 mod значение2 Делит нацело значение1 на значение2 и возвращает остаток. |
SHL | Формат: значение SHL выражение Сдвигает значение влево на число битов, равное значению выражения. |
SHR | Формат: значение SHR выражение Сдвигает значение вправо на число битов, равное значению выражение. |
Логические | Формат: значение1 AND значение2 Выполняет логическую операцию & над операндами значение1 и значение2. |
AND | |
OR | Формат: значение1 OR значение2 Выполняет логическую операцию или над операндами значение1 и значение2. |
XOR | Формат: значение1 XOR значение2 Выполняет логическую операцию, исключающее или над операндами значение1 и значение2. |
NOT | Формат: NOT значение1 Обращает каждый бит в операнде значение1, иначе говоря, осуществляет дополнение до единицы. |
Отношения | Формат: операнд1 EQ операнд2. Истинно, если значения операндов совпадают. |
EQ | |
NE | Формат: операнд1 NE операнд2 Истинно, если значения операндов не совпадают |
LT | Формат: операнд1 LT операнд2 Истинно, если операнд1 меньше операнда2. |
GT | Формат: операнд1 GT операнд2 Истинно, если операнд1 больше операнда2. |
LE | Формат: операнд1 LE операнд2 Истинно, если операнд1 меньше операнда2 или равен ему. |
GE | Формат: операнд1 GE операнд2 Истинно, если операнд1 больше операнда2 или равен ему. |
Возвращающие значения | Формат: $ Возвращает значение счетчика текущей ячейки. |
$ | |
SEG | Формат: SEG переменная или SEG метка. Возвращает сегментный адрес переменной или метки. |
OFFSET | Формат: OFFSET переменная или OFFSET метка. Возвращает смещение адреса переменной или метки. |
LENGTH | Формат: LENGTH переменная. Возвращает длину в единицах определения переменной (в байтах или словах), при определении которой был использован оператор DUP |
TYPE | Формат: TYPE переменная или TYPE метка. Для переменной TYPE возвращает 1- если она имеет тип BYTE, 2- если имеет тип WORD, 4- если двойное слово; 1, если метка имеет атрибут NEAR или 2 (атрибут FAR). |
SIZE | Формат: SIZE переменная Возвращает размер переменной в байтах т.е. произведение результатов выполнения операций LENGTH и TYPE.. |
Присваивание атрибута | Формат: тип PTR выражение. Изменяет атрибут типа переменной (BYTE или WORD) или атрибут метки перехода (NEAR или FAR) адресного операнда. Здесь тип – новый атрибут, а выражение – идентификатор, чей атрибут должен быть изменен. |
PTR | |
DS: ES: SS: CS: | Формат: сегм. рег: адресное выражение или сегм. рег.: метка или сегм. рег.: переменные. Изменяет атрибут сегмента метки, переменной или адресного выражения. |
SHORT | Формат: JMP SHORT метка. Изменяет атрибут NEAR метки оператора перехода JMP и указывает, что переход осуществляется на расстоянии не более +127 байт или –128 байт от следующей команды. |
THIS | Формат: THIS атрибут или THIS выражение. Создаёт адресный операнд либо с атрибутом дистанции (NEAR или FAR), либо с атрибутом типа (BYTE или WORD) со смещением, равным текущему значению адреса, и атрибутом текущего сегмента. |
HIGH | Формат: HIGH значение или HIGH выражение. Возвращает старший байт 16-битового числового значения или адресного выражения. |
LOW | Формат: LOW значение или LOW выражение. Возвращает младший байт 16-битового числового значения или адресного выражения. |
Дата публикования: 2015-11-01; Прочитано: 1432 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!