CALL FAR - вызов подпрограммы, находящейся в другом сегменте.
Операнды аналогичны соответствующим командам перехода, все команды вызова безусловны.
- команды возврата:
RET NEAR - близкий выход из подпрограммы,
RET FAR - дальний выход из подпрограммы.
Команды JMP просто изменяют текущее содержимое счетчика команд (если переход дальний, то и содержимое сегментного регистра СP) на новое, указанное в операнде.
Близкий вызов CALL сохраняет текущее значение регистра IP в стеке и записывает в IP новое, указанное в команде, значение. Дальний вызов CALL FAR, задает новые значения сегмента и смещения для дальнейшего выполнения программы и сохраняет в стеке как регистр IP, так и регистр CS. Близкий непосредственный вызов – это относительный переход, использующий двухбайтовое поле смещения.
Все остальные команды вызова - абсолютные переходы. Непосредственный вызов CALL FAR требует четырехбайтовое поле операнда для указания новых значений для регистров С5 и IP. Косвенные близкие вызовы типа загружают однословный операнд в регистр IP. Дальние вызовы загружают двойное слово из памяти в пару регистров CS:IP; первое слово загружается в регистр IP, а второе - в регистр CS. Если команда указывает регистр в качестве операнда косвенного далекого вызова, результат непредсказуем; микропроцессор 8086 берет новое значение регистра CS неизвестно откуда. Ни в коем случае нельзя использовать эту модификацию команды.
Командам CALL соответствуют команды возврата RET. Все возвраты - косвенные переходы, поскольку они извлекают адрес перехода из вершины стека. Близкий возврат извлекает из стека одно слово и помещает его в регистр IP, а далекий возврат извлекает два слова, помещая слово из меньшего адреса в регистр IP, а слово из большего адреса в регистр CS.
Программы могут модифицировать возвраты как ближнего, так и дальнего типа, указывая параметр счетчика байтов. Команда возврата прибавляет его значение к указателю стека после извлечения из него адреса (адресов) возврата. Такая команда позволяет программе удалять параметры из стека без использования специальных команд POP; тем самым подчеркивается, что стек - носитель передаваемых подпрограмме параметров.
Пример команды:
RET FAR 2
ЗАДАНИЕ №3
cseg |
segment |
|
org |
100h |
|
start |
||
metka: |
||
mov |
cx |
65535 |
mov |
ah |
,9 |
mov |
dx |
, offset string |
int |
21h; |
|
loop metka |
||
string db "hi" |
||
|
|
|
mov |
ah |
,10h; |
int |
16h |
ЗАДАНИЕ №4
.586 |
|
|
|
|
|
|
|
|
|
|
.model flat, stdcall |
|
|||||||||
.stack 4096 |
|
|
||||||||
.data |
|
|
||||||||
.code |
|
|
||||||||
proc_1 proc |
; |
начало процедуры |
||||||||
|
|
|
|
|
|
|
|
|
||
push |
ebp |
|
|
|
|
|
; |
пролог: сохранение EBP |
||
mov |
ebp |
, |
esp |
|
|
; |
пролог: инициализация EBP |
|||
mov |
eax |
, [ |
ebp |
+8] |
; |
доступ к аргументу 4 |
||||
|
|
|
|
|
|
|
|
|
|
|
mov ebx, [ebp+12] ; доступ к аргументу 3 mov ecx, [ebp+16] ; доступ к аргументу 2
pop |
ebp |
|
; эпилог: восстановление EBP |
ret 12 |
|
||
proc_1 endp |
|
||
main proc |
|
||
push 2 |
|
||
push 3 |
|
||
push 4 |
|
||
call proc_1 |
|
||
ret |
|
||
main endp |
|
||
end main |
|
Вывод: Получено освоение принципов работы с битовой информацией и форматом представления данных. Приобретение навыков организации подпрограмм и безусловных переходов.