МЕХАНИЗМ ВЫПОЛНЕНИЯ
МАШИННЫЙ ФОРМАТ
МЕХАНИЗМ ВЫПОЛНЕНИЯ
CALL ИмяПРоц
Особенности компиляции переходов вперед по коду
МАШИННЫЙ ФОРМАТ
МЕХАНИЗМ ВЫПОЛНЕНИЯ
JMP метка
Команда безусловного перехода JMP
КОМАНДЫ БЕЗУСЛОВНОЙ ПЕРЕДАЧИ УПРАВЛЕНИЯ
q команда безусловного перехода JMP;
q вызовапроцедуры CALL и возврата
из процедуры RET;
q вызова программных прерываний INT
и возврата из программных прерываний
IRET.
1. АдресПерехода = IP + дистанция;
2. IP = АдресПерехода; { Замена IP}
Следующей будет команда со смещением АдресПерехода в сегменте кода.
; короткий переход ; 2 байта
EB <БАЙТ>
…
; обычный переход ; 3 байта
E8 <СЛОВО>
…
; межсегментный переход ; 5 байт
EA <ДВОЙНОЕ_СЛОВО>
. . .
0005 EB 05 90 jmp @21
0008 @3:
0008 B4 4C mov ah, 4ch
000A CD 21 int 21h
000C @21:
000C 0400*(00) db 1024 dup(0)
040C E9 FBF9 jmp @3
. . .
Вот переход вперед. Но метка @21 еще не встречалась. Я не знаю, будет ли команда длиной 2 или 3 байта. Занимаю 3 байта. Предполагаю следующую команду на точке
А вот и метка @21. Сколько байт от нее до ? Всего 4, это < 127, значит переход будет ближним, EB 04
Оставшийся лишний байт забиваем кодом 90h (команда NOP) и корректируем дистанцию: 04 + 1 = 05. ОКОНЧАТЕЛЬНО: EB 05 90, это две команды - JMP на 05 байт впереди NOP.
КОМАНДА ВЫЗОВА ПРОЦЕДУРЫ CALL
1. Скопировать в стек IP
2. АдресПроцедуры = IP + дистанция;
3. IP = АдресПроцедуры; { Замена IP}
Следующей будет выполняться первая команда вызываемой процедуры
; обычный вызов ; 3 байта
код <СЛОВО>
…
Знаковое слово – это ДИСТАНЦИЯ ПЕРЕХОДА.
Адресация целевой метки - ОТНОСИТЕЛЬНАЯ
; межсегментный вызов ; 5 байт
код <ДВОЙНОЕ_СЛОВО>
Двойноеое слово – это CS:IP входа в процедуру.
Адресация процедуры – АБСОЛЮТНАЯ!
КОМАНДА ВОЗВРАТА ИЗ ПРОЦЕДУРЫ RET
Заменить текущее IP словом, взятым с «вершины» стека;
Следующей будет выполняться команда вызывающей программы, ЗАПИСАННАЯ СРАЗУ ПОСЛЕ команды CALL.
На ПСЕВДОКОДЕ :
1. IP := (SS : SP)^;{ Присвоить IP значение, которое находится по адресу SS : SP}
2. SP := SP + 2;{ «очистить» ячейку стека}
ОБЩАЯ СХЕМА ОБРАБОТКИ ПРЕРЫВАНИЯ
Передача управления на обработчик делается по АБСОЛЮТНОМУ адресу!
Команда вызова программного прерывания INT
INT номер_прерывания