Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпорки_2.docx
Скачиваний:
9
Добавлен:
09.02.2015
Размер:
874.63 Кб
Скачать

Вопрос №32

Безусловные переходы.

Синтаксис команды безусловного перехода без сохранения информации о точке возврата:

jmp [модификатор] адрес_перехода.

Команды перехода модифицируют регистр указателя команды EIP/IP и, возможно, сегментный регистр кода CS.

Здесь адрес_перехода представляет метку или адрес области памяти, в которой находится указатель перехода.

Существует несколько вариантов записи команды imp. Их различие определяется дальность перехода и способом задания адреса перехода (текущий или другой сегмент):

  1. внутрисегментный переход или близкий

  2. межсегментный или дальний

Можно выделить три варианта внутрисегментного использования команды JMP:

  1. Прямой короткий внутрисегментный переход.

применяется, когда расстояние от команды JMP до адреса перехода не превышает -128 или +127 байт.

  1. Прямой внутрисегментный переход.

отличается от прямого короткого внутри сегментного перехода тем, что длина машинной команды JMP в этом случае составляет три байта.

Увеличение длины связано с тем, что поле адреса перехода в машинной команде JMP расширяется до двух байтов, а это, в свою очередь, позволяет

производить переходы в пределах 64 Кбайт относительно следующей за JMP команды:

  1. Косвенный внутрисегментный переход

в команде указывается не сам адрес перехода, а место, где он ≪лежит≫.

Межсегментные переходы

  1. прямой межсегментный переход

  1. косвенный межсегментный переход

в качестве операнда имеет адрес области памяти, в которой содержатся смещение и сегментная часть целевого адреса перехода. Адрес перехода указан косвенно в регистре

Вопрос №33

Процедуры.

В ассемблере есть несколько средств, чтобы решить проблемы дублирования.

1. процедуры

2. макроподстановки

3. генерация и обработка программных прерываний

Процедуру можно определить как оформленную совокупность команд, которая будучи однократно описана при необходимости может быть вызвана в любом месте программы.

Proc.endp

Заголовок процедуры:

Имя процедуры Proc[расстояние]

[ARGсписок аргументов]

[RETURN– список элементов]

Тело процедуры:

…………………..

Команды

Директивы ассемблера

Конец процедуры

…………………..

[имя процедуры] ENDP

Имя процедуры является обязательным. Атрибут расстояния может применять значения nearилиfarи характеризует возможность обращения к процедуре из другого сегмента кода. Очень важен вопрос размещения процедуры в программе:

    1. в начале программы до первой исполняется команда

    2. в конце программы после команды, возвращающей управление операционной системе

    3. в другом модуле (библиотеке)

Размещение в начале сегмента. Последовательность команд, ограниченных парой procиendsбудет размещаться до метки, обозначающей команду с которой начинается программа.

Model small

.stack 100h

.data

.code

my.proc PROC near

………………………

Ret

my_proc ENDS

start:

………………………

………………………

Endstart

Размещение процедуры в конце программы предполагает, что последовательность команд между PROCиENDSнаходящихся за командой, возвращающей управление ОС:

Model small

.stack100h

.data

.code

Start:

……………

……………

movax4c00h

int21h; возврат управления ОС

my.proc PROC

……………

Ret

my. Proc ENDP

end start.

Вариант расположения процедуры в отдельных сегментах кода предполагает, что часто используемые процедуры выносятся в отдельный файл, который должен быть оформлен как обычный исходный файл и оттранслирован для получения объектного кода.

При вызове процедуры важен контекст программы. Под контекстом понимается информация о состоянии программы в точке вызова процедуры. Для работы с контекстом используют программы CALLиRET.

CALLосуществляет вызов процедуры

CALL[модификатор] имя процедуры

CALLпередает управление по адресу – имя процедуры. При этом в стеке сохраняется адрес возврата, т.е. адрес команды, следующей заCALL. Модификатор определяет организацию ближних и дальних переходов.

Межсегментный вызов far– процедура находится в другом сегменте кода.

Процедура не может быть одновременно ближнего и дальнего типа.

RET[число] считывает адрес возврата из стека и загружает его в регистрCSиIP/EIP, тем самым возвращая управление на команду, следующую заCALL.

[число] – обозначает количество элементов, удаляемых из стека при возврате процедуры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]