{L/S}CALL src - Длинный/короткий {Long/Short} вызов подпрограммы
Описание:
Выполняет вызов подпрограммы, расположенной по адресу, определяемому по содержимому источника scr. Команда CALL использует 8- битный src для осуществления относительного короткого вызова (IP +127/-128 слов). Команда CALL, использующая в качестве источника 16- битный src осуществляет абсолютный длинный вызов подпрограммы по 16- битному адресу. Для хранения старшего байта 16- битного непосредственного адреса команда использует регистр PFX[0]. Использование дополнительного префикса 'L' (т.е. LCALL) приведет к длинному вызову подпрограммы с использованием регистра PFX[0]. Использование дополнительного префикса 'S' (т.е. SCALL) вызовет формирование относительного короткого вызова, но будет отмечено ассемблером, если получатель за пределами диапазона. Определенный внутренний регистр src (не имеет значения - 8- битный или 16- битный) всегда осуществляет абсолютный вызов CALL по 16- битному адресу, таким образом, префиксы 'L' и 'S' не будут использоваться. Значение префиксного регистра PFX[n] используется для формирования старшего байта адреса в случае, когда в качестве scr выступает 8- битный регистр.
Затрагиваемые флаги состояния: нет
Выполнение команды:
@++SP < IP + 1 PUSH (загрузка в стек)
IP < src Absolute CALL (абсолютный вызов)
IP < IP + src Relative CALL (относительный вызов)
Код команды:
Пример(ы):
CALL label1 ; относительный вызов по метке label1 (адрес должн быть в пределах
; IP +127/ -128)
CALL label1 ; абсолютный вызов по метке label1 = 0120h
; MOVE PFX[0], #01h
; CALL #20h.
CALL DP[0] ; DP[0] содержит 16- битный адрес подпрограммы
CALL M0[0] ; принимается, что M0[0] - 8- битный регистр
; абсолютный вызов по адресу addr16
; старший байт addr16=00h (PFX[0])
; младший байт addr16=M0[0]
MOVE PFX[0], #22h ;
CALL M0[0] ; принимается, что M0[0] - 8- битный регистр
; Старший байт addr16=22h (PFX[0])
; младший байт addr16=M0[0]
LCALL label1 ; label=0120h и относительно команды
; абсолютный вызов инициализируется использованием префикса 'L'
; MOVE PFX[0], #01h
; CALL #20h
SCALL label1 ; относительное смещение для метки label1 рассчитывается и используется
; если label1 не относительное, то ассемблер сформирует ошибку
SCALL #10h ; относительное смещение #10h используется напрямую командой CALL
|