- •Типы данных ассемблера
- •2. Обозначение чисел и директивы определения данных
- •Системы счисления. Правила перевода
- •8. Принципы работы со стеком
- •9. Виды операндов
- •17. Команды передачи управления
- •18. Организация безусловного перехода
- •19. Процедуры. Диапазон действия процедур
- •21. Команды сравнения
- •20. Условные переходы
18. Организация безусловного перехода
Безусловный переход без сохранения информации о точке возврата организовывается командой jmp.
jmp [модификатор] адрес_перехода
Данная команда модифицирует или EIP или (EIP, CS). Адрес перехода представляет собой метку, в которой находится указатель перехода. Различия команды jmp определяются дальностью перехода и способом задания адреса перехода.
Варианты внутрисегментного использования команды jmp:
Прямой короткий переход. Применяется, когда расстояние от команды jmp до адреса перехода не превышает интервал (-128; 127)
jmp short ptr m1
Прямой внутрисегментный переход. Длина jmp составляет 3 байта, адрес операнда расширяется до 2 байтов. Переход осуществляется в пределах 64к относительно следующей за jmp команды
jmp m1
Косвенный внутрисегментный переход. В команде указывается не сам адрес перехода, а место, где он находится
lea bx, m1
jmp bx
Межсегментные переходы:
Прямой межсегментный переход:
Seg_1 segment
.
.
.
jmp far ptt m2
m1 label far
Seg_1 ends
Seg_2 segment
.
.
.
m2 label far
jmp far m1
Косвенный межсегментный переход
Косвенный регистровый межсегментный переход
19. Процедуры. Диапазон действия процедур
Процедура – основная единица для композиции задачи. Для описания команд в виде процедуры в TASM используются директивы proc и endp.
Синтаксис:
Имя_процедуры proc [[[модификатор языка]язык] [расстояние]
[arg список_аргументов]
[return список_элементов]
Команды_директивы] тело_процедуры]
[имя процедуры] endp; конец_процедуры
Имя процедуры является обязвтельным, атрибут «расстояние» может принимать значения near или far и характеризует возможность обращения к процедуре из другого сегмента кода. Важный вопрос размещения процедуры в программе:
В начале программы (до первой исполняемой команды)
В конце программы (после команды, возвращающей управление в ОС)
В другом модуле (можно создать библиотеку 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. Число – необязательный параметр, обозначает количество элементов, удаляемых из стека при возврате из процедуры.
