Государственное Образовательное Учреждение высшего профессионального образования Московский Авиационный Институт Государственный Технический Университет "маи" кафедра 304. конспект
Вид материала | Конспект |
СодержаниеОператоры в инструкциях ЯА. 1) Операторы атрибута 2) Операторы, возвращающие значение Блочная структура программы. Процедуры. Описание процедур Вызов процедур |
- Инновационной образовательной программы, 1090.47kb.
- Самостоятельная работа 2 часа в неделю всего часов, 28.69kb.
- Самостоятельная работа 2 часа в неделю всего часов, 45.89kb.
- Самостоятельная работа 2 часа в неделю всего часов, 73.46kb.
- Самостоятельная работа 2 часа в неделю всего часов, 46.6kb.
- Самостоятельная работа 2 часа в неделю всего часов, 41.37kb.
- Самостоятельная работа 2 часа в неделю всего часов, 41.08kb.
- Самостоятельная работа 2 часа в неделю всего часов, 64.33kb.
- Самостоятельная работа 2 часа в неделю всего часов, 29.72kb.
- Самостоятельная работа 2 часа в неделю всего часов, 33.42kb.
Операторы в инструкциях ЯА.
Операторы позволяют уточнить (модифицировать) команды; считается, что операторы можно разделить на 2 группы:
- операторы атрибута,
- операторы, возвращающие значение, т.е. определяющие его.
1) Операторы атрибута:
PTR – используется совместно с атрибутами типа Byte, Word, Dword для локальной отмены типов (определенных декларациями DB, DW или DD) или с атрибутами Near или Far для отмены значения дистанции по умолчанию.
Например,
Fd DW 322h
…
MOV AH, Byte PTR FD+1; пересылка 2-го Байта
SHORT – модификация атрибута Near в команде JMP
Например,
JMP Short L1
2) Операторы, возвращающие значение:
DUP – оператор повторения начального значения, например:
MASSIV DW 100 DUP(0); создание и обнуление массива размером 100.
LENGTH – возвращает число элементов, определенных оператором DUP.
Например,
Tabl DW 10 DUP(?)
…
MOV DX, LENGTH Tabl ; DX := 000Ah
Если DUP отсутствует, то возвращаемое значение – 0001.
OFFSET – возвращает относительный адрес переменной или метки. Используется обычно в команде mov. Существует аналогичная инструкция LEA op1, op2. Где op1 – регистр для слова (2Б), op2 – идентификатор или другое описание адреса ООП.
LEA BX,Q ; BX := адрес Q
LEA SI,[BX+2] ; SI := [BX] + 2
mov DX,Q ; DX := содержимое ячейки Q
SEG – возвращает адрес сегмента, в котором располагается данная переменная или метка; используется обычно в программах, состоящих из нескольких отдельно ассемблированных сегментов.
Например,
MOV DX, seg FLDW ; DX := адрес сегмента данных
TYPE – возвращает число байтов, соответствующее определению имени в декларациях:
Определение | Возвращаемое значение |
DB | 1 |
DW | 2 |
DD | 4 |
DQ | 8 |
DT | 10 |
STRUC | Число Байтов, определенных в STRUC |
NEAR {метка} | FFFFh |
FAR {метка} | FFFEh |
Например, для Tabl, описанной выше, можно записать
MOV AX, Type Tabl; AX := 0002h
SIZE – возвращает произведение длины LENGTH и типа TYPE (подсчитывает число байтов, потраченных на запись) и полезен при ссылках на переменную с оператором DUP.
Для использованного выше примера можно записать
MOV BX, Size Tabl ; BX := 0014h
Блочная структура программы. Процедуры.
Часто в больших программах используются подпрограммы для реализации вспомогательных алгоритмов. В ЯА подпрограммы оформляются в виде процедур.
Описание процедур
{имя проц.} PROC {параметр}
{тело проц.}
[RET]
{имя проц.} ENDP
где {имя проц.} – должно повторяться дважды и используется для обращения к процедуре;
{параметр} может принимать одно из двух значений -
К близкой (внутренней) процедуре можно обращаться только из того сегмента команд, где она описана. К дальней (внешней) процедуре можно обращаться из любых сегментов команд программы, в том числе и из того, где она описана.
Имена и метки, описанные в процедуре, не локализуются внутри нее, поэтому должны быть уникальными в программе.
Хотя в АЯ можно описать одну процедуру внутри другой, никакой выгоды это не дает и обычно не используется.
Вызов процедур
На ЯА все переходы между основной программой и процедурой нужно организовывать самим. Если из процедуры возможен возврат в DOS, то ее можно вызвать командой перехода на имя процедуры
JMP {имя проц.}
Если нужен возврат в вызывающую программу, то проще всего использовать команду обращения
CALL {имя проц.}
Тогда в теле процедуры должна быть команда возврата
RET
Есть другая возможность: запомнить адрес возврата с использованием стека и организовать возврат командами переходов.
При вызове процедуры следует учитывать параметры, передаваемые процедуре, и ее расположение относительно точки вызова, т.е. тип перехода в команде CALL определяется автоматически, например (для процедуры p).
P
CALL P
Если это – близкий вызов (NEAR), то производятся следующие действия:
Stack := AB, IP := offset P
где АВ – адрес возврата, т.е. эффективный адрес команды, следующей за вызовом;
Дальний вызов (FAR) обеспечивает действия:
Stack := CS, Stack := AB, CS := seg P, IP := offset P
Если описание процедуры находится в сегменте ниже команды вызова, то следует указать атрибут перехода оператором PTR. Например,
CALL FAR PTR P; дальний вызов P