Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Ассемблеру.docx
Скачиваний:
12
Добавлен:
09.11.2018
Размер:
125.1 Кб
Скачать
    1. Команды передачи управления

Мнемоника

Формат

Комментарий

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

CALL

CALL имя

Войти в процедуру -

RET

RET [количество параметров]

Вернуться из процедуры

JUMP

JUMP имя

Перейти ____-««

Команды безусловных переходов CALL, RET, JMP могут использовать дальнюю или ближнюю модель памяти, в то время как команды условных переходов – только малую (в пределах -128...+127 байтов). При дальней модели памяти (устанавливается опцией Options/Compiler/Force far calls среды Турбо Паскаля или директивой компилятора {F+}) осуществляется как внутрисегментная, так и межсегментная передача управления, при ближней - только внутрисегментная.

Инструкция CALL работает следующим образом. Вначале адрес следующей за СALL инструкции (адрес возврата) помещается в стек, затем в регистр IP (или в пару СS:IP) помещается адрес точки входа в процедуру, таким образом сразу за командой CALL будет исполняться уже первая команда процедуры. Оба адреса (точки входа и возврата) будут 16-битовыми смещениями для внутрисегментного вызова или 32-битовыми полными адресами - для межсегментного. Все процедуры (функции) Паскаля, оттранслированные в режиме {F+} или содержащие зарезервированное слово FAR в заголовке, должны вызываться как дальние. Для этого за инструкцией CALL следует указать модель памяти:

Procedure MyProc; Far;

{Вызов дальней процедуры}

asm

call FAR MyProc

end;

Таким же способом должны вызываться все библиотечные подпрограммы (т.е. объявленные в интерфейсных частях модулей). При дальнем вызове в стек сначала заталкивается содержимое сегмента кода CS, а уже затем - смешение возврата.

При выходе из дальней процедуры команда RET извлекает из стека оба 16-разрядных слова и помешает первое в IP, а второе в CS, а при выходе из ближней извлекает из стека только смещение и помещает его в IP.

Команды условных переходов способны передавать управление на метку, расположенную в пределах ближайших плюс-минус 128 байт от самой команды. Если нужно передать управление на метку, расположенную дальше в том же сегменте, или на метку в другом сегменте, сразу за командой условной передачи располагают безусловную команду JMP или CALL, например:

сmp ах, 0

jne @NotZero

jmp IsZero

..................

{Проверяем АХ}

(АХ=0 ?}

{Да - переходим на дальнюю метку}

{Нет - продолжаем работу}

Команды перехода

                  • Изменяют значение регистра IP

                  • Не меняют флаги

                      1. Условные

                      1. Безусловные