Команда вызова подпрограмм CALL передаёт управление с автоматическим сохранением адреса возврата. В поле операнда этой команды находится метка первой команды вызываемой подпрограммы. После того как подпрограмма закончит свои действия, завершающая её команда RET возврата передаст управление по запомненному адресу возврата. Адреса возврата хранятся в стеке. Вызовы подпрограмм могут быть внутрисегментными и межсегментными. В первом случае вызываемая подпрограмма находится в текущем кодовом сегменте(тип NEAR), во втором - в произвольном(тип FAR). В соответствии с этим в стеке запоминается содержимое либо только IP, либо IP и CS.Примеры записи операторов вызовов подпрограмм:
СALL Subr
CALL AX
CALL [BX][SI].
Команды управления циклами
Для организации программных циклов применяются следующие команды управления итерациями:
· LOOP<метка>
· LOOPE/LOOPZ<метка>
· LOOPNE/LOOPNZ<метка>
В этих командах предусматривается использование регистра CX в качестве счётчика цикла. Когда выполняется команда LOOP(повторить цикл), производится декремент регистра CX, и, если содержимое регистра CX<>0 - производится переход к началу цикла, в противном случае цикл завершается и выполняется следующая по порядку команда.
|
|
Мнемоники LOOPE и LOOPZ определяют одну и ту же машинную команду, которая производит декремент регистра CX, а затем передаёт управление в начало цикла, если (CX<>0) и флаг Z=1. В противном случае будет выполняться следующая по порядку команда. Команда LOOPNE и LOOPNZ
аналогична предыдущей команде, но здесь условие продолжения цикла имеет вид:
Name cikl
Assume cs:cod, ds:data
Data segment
Aa db 9h,8h,3h,6h,5h,2h,3h,7h,1h,5h
Data ends
Cod segment
Start proc far
Push ds
Mov ax,0
Push ax
Mov ax, data
Mov ds,ax
lea bx,aa;адрес просматриваемой последовательности в BX
mov ah, 0eh;номер функции прерывания для вывода символа на экран
mov cx,10;счётчик числа просматриваемых чисел
l1: mov al,[bx];очередное число в AL
cmp al,5;сравнение текущего числа из памяти с числом 5
jbe l2;если ниже или равно - переход, в противном случае
add al,30h;формируется ASCII код выводимого числа
int 10h;программное прерывание, обеспечивающее вывод на экран числа
mov al,20h;вывод на экран
int 10h;пробела
l2: inc bx;смещение указателя на следующий байт в памяти
loop l1;переход, если счётчик CX не равен нулю
ret
Start endp
Cod ends