Иллюстрированный самоучитель по Turbo Pascal

Система команд

Команды передачи управления

Мнемоника Формат Комментарий
Безусловные переходы
CALL CALL имя Войти в процедуру
RET RET [количество параметров] Вернуться из процедуры
JUMP JUMP имя Перейти
Условные переходы
JA/JNBE JA близкая_метка Перейти, если выше (после сравнения беззнаковых операндов)
JAE/JNB JAE близкая_метка Перейти, если выше или равно
JB/JBAE/JC JB близкая_метка Перейти, если ниже
JBE/JNA JBE близкая_метка Перейти, если ниже или равно
JCXZ JCXZ близкая_метка Перейти, если СХ=0
JE/JZ JE близкая_метка Перейти, если равно
JG/JNLE JG близкая_метка Перейти, если больше (после сравнения знаковых операндов)
JGE/JNL LGE близкая_метка Перейти, если больше или равно
JL/JNGE JL близкая_метка Перейти, если меньше
JLE/JNG JLE близкая_метка Перейти, если меньше или равно
JNC JNC близкая_метка Перейти, если нет переноса
JNE/JNZ JNE близкая_метка Перейти, если не равно
JNO JNO близкая_метка Перейти, если нет переполнения
JNP/ JPO JNP близкая_метка Перейти, если нечетный
JO JO близкая_метка Перейти, если перенос
JP/JPE JP близкая_метка Перейти, если четный
JS JS близкая_метка Перейти, если отрицательный
Команды управления циклами
LOOP LOOP близкая_метка Повторить цикл
LOOPE/LOOPZ LOOPE близкая_метка Повторять, пока равны
LOOPNE/LOOPNZ LOOPNE близкая_метка Повторять, пока не равны

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

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

Procedure MyProc; Far;
…….
asm
call FAR MyProc {Вызов дальней процедуры}
…….
end;

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

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.