Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
assembler_v0.1.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
43 Кб
Скачать
☆

18. Организация безусловного перехода

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

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

Данная команда модифицирует или EIP или (EIP, CS). Адрес перехода представляет собой метку, в которой находится указатель перехода. Различия команды jmp определяются дальностью перехода и способом задания адреса перехода.

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

  1. Прямой короткий переход. Применяется, когда расстояние от команды jmp до адреса перехода не превышает интервал (-128; 127)

jmp short ptr m1

  1. Прямой внутрисегментный переход. Длина jmp составляет 3 байта, адрес операнда расширяется до 2 байтов. Переход осуществляется в пределах 64к относительно следующей за jmp команды

jmp m1

  1. Косвенный внутрисегментный переход. В команде указывается не сам адрес перехода, а место, где он находится

lea bx, m1

jmp bx

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

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

Seg_1 segment

.

.

.

jmp far ptt m2

m1 label far

Seg_1 ends

Seg_2 segment

.

.

.

m2 label far

jmp far m1

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

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

19. Процедуры. Диапазон действия процедур

Процедура – основная единица для композиции задачи. Для описания команд в виде процедуры в TASM используются директивы proc и endp.

Синтаксис:

Имя_процедуры proc [[[модификатор языка]язык] [расстояние]

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

[return список_элементов]

Команды_директивы] тело_процедуры]

[имя процедуры] endp; конец_процедуры

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

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

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

  3. В другом модуле (можно создать библиотеку dll)

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

model small

.stack 100h

.data

.code

my_proc proc near

….

ret

my_proc endp

start:

...

end start

Размещение процедуры в конце программы предполагает, что последовательность команд (между proc и endp) находится следом за командой, возвращающей управление ОС.

.code

…

Mov ax, 4c00h

Int 21h

My_proc proc

…

Ret

My_proc endp

End start

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

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

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

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

Команда call передает управление по адресу символическим именем «Имя_процедуры». В стеке сохраняется адрес возврата. Модификатор определяет организацию в близких или дальних переходах.

Ret [число] – считывает адрес возврата из стека и загружает его в регистр CS и IP, тем самым возвращая управление на команду, следующую за командой call. Число – необязательный параметр, обозначает количество элементов, удаляемых из стека при возврате из процедуры.

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