Конспект лекций по курсу язык ассемблера ibm icon

Конспект лекций по курсу язык ассемблера ibm


1 чел. помогло.
Смотрите также:
Конспект лекций удк 651. 5 Ббк 60. 844 Конспект лекций по курсу «Делопроизводство»...
Конспект лекций удк 651. 5 Ббк 60. 844 Конспект лекций по курсу «Делопроизводство»...
Опорный конспект лекций по макроэкономике Автор: Фридман А. А...
Конспект лекций по курсу «Организация производства»...
Конспект лекций по курсу «Русский язык и культура речи»...
Конспект лекций по курсу “Начертательная геометрия и инженерная графика” Кемерово 2002...
Горобец е. Г., Карлина о. А., Нарушевич а. Г., Нечепуренко м. Ю...
Горобец е. Г., Карлина о. А., Нарушевич а. Г., Нечепуренко м. Ю...
Конспект лекций часть 1 2008 перечень ссылок основная: М...
Конспект лекций по курсу «бизнес-планирование в условиях рынка»...
Конспект лекций по курсу “ Общая химическая технология” для студентов специальности 090200 всех...
Конспект лекций по курсу «теория чисел» Методическая разработка...



Загрузка...
страницы: 1   ...   4   5   6   7   8   9   10   11   12
вернуться в начало
скачать
^

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



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

Расположение процедур в сегменте





  1. Внутренние процедуры находятся в одном сегменте с вызывающей программой.

При этом возможны 3 варианта расположения:

а) Все процедуры размещены раньше основной (вызывающей) программы, которая может быть также оформлена в виде процедуры.

Например:

Text SEGMENT ‘code’

ASSUME CS: text, DS: data, SS: stack

A1 PROC



RET

A1 ENDP

Main PROC

MOV AX, data

MOV DS, AX



CALL A1



MOV AX, C400h

INT 21h

Main ENDP

Text ENDS

Data SEGMENT



Data ENDS

Stack SEGMENT ‘stack’



Stack ENDS

END Main


б) все процедуры – ниже точки вызова.

в) процедуры – внутри основной процедуры, возможно даже, что процедура внутри другой процедуры (хотя никакой выгоды это не даёт)


Например,



Main PROC



CALL A1



MOV AX, C400h

INT 21h

A1 PROC



RET

A1 ENDP

Main ENDP

Text ENDS


2) ^ Внешние процедурырасполагаются в других сегментах или в других файлах.

Например, текст основной программы находится в файле P.asm

Text SEGMENT public ‘code’

; объединение модулей последовательно

; в общий сегмент

ASSUME CS: text, DS: data, SS: stack

EXTRN stop: proc; объявление внешнего имени

Main PROC



CALL Stop



Main ENDP

Text ENDS

Data SEGMENT



Data ENDS

Stack SEGMENT ‘stack’



Stack ENDS

END Main

Исходный текст процедуры находится в файле P1.asm

Text SEGMENT public ‘code’

ASSUME CS: text

PUBLIC stop; объявление имени доступным извне

Stop proc



ret

stop ENDP

text ENDS

END ; конец файла без точки входа


Объединение этих файлов происходит на шаге компоновки, т.е. требуется раздельная трансляция. Например, для MASM

MASM/ZI PR

MASM/ZI P1

где ZI – опция, позволяющая поместить в объектный файл полную информацию о номерах строк и символах исходного модуля (ИМ).

После образования PR.obj и P1.obj их нужно скомпоновать в единый загрузочный файл

LINK/C0 PR P1, COMPOZ

где С0 – опция, передающая в загрузочный файл символьную информацию, позволяющую отладчику CV выводить на экран полный текст ИМ, включая метки и комментарии.

Модуль COMPOZ.exe готов к исполнению.

Можно подключить процедуру из библиотеки. Для этого перед сегментами ИМ помещается директива

INCLUDE {имя файла библиотеки}

Например, для подключения файла IO.asm следует записать

INCLUDE IO.asm

S SEGMENT ‘stack’



S ENDS

D SEGMENT ‘data’



D ENDS

C SEGMENT ‘code’

ASSUME CS:C, SS:S, DS:D

Begin: …



C ENDS

END Begin





оставить комментарий
страница10/12
Дата02.10.2011
Размер0,99 Mb.
ТипКонспект, Образовательные материалы
Добавить документ в свой блог или на сайт

страницы: 1   ...   4   5   6   7   8   9   10   11   12
отлично
  1
Ваша оценка:
Разместите кнопку на своём сайте или блоге:
rudocs.exdat.com

Загрузка...
База данных защищена авторским правом ©exdat 2000-2017
При копировании материала укажите ссылку
обратиться к администрации
Анализ
Справочники
Сценарии
Рефераты
Курсовые работы
Авторефераты
Программы
Методички
Документы
Понятия

опубликовать
Загрузка...
Документы

Рейтинг@Mail.ru
наверх