Государственное Образовательное Учреждение высшего профессионального образования Московский Авиационный Институт Государственный Технический Университет "маи" кафедра 304. конспект

Вид материалаКонспект

Содержание


Операторы в инструкциях ЯА.
1) Операторы атрибута
2) Операторы, возвращающие значение
Блочная структура программы. Процедуры.
Описание процедур
Вызов процедур
Подобный материал:
1   ...   7   8   9   10   11   12   13   14   15

Операторы в инструкциях ЯА.



Операторы позволяют уточнить (модифицировать) команды; считается, что операторы можно разделить на 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