При выполнении линейной программы микропроцессор выполняет команды последовательно одну за другой, а в счетчике команд PC хранится адрес следующей команды. В реальных программах ВСЕГДА существует необходимость применения команд, изменяющих линейный порядок работы. К ним относят команды вызова подпрограмм, команд безусловного и условного перехода. Адрес ячейки, на которой необходимо перейти микропроцессору, задается в команде перехода. При выполнении команды этот адрес загружается в программный счетчик PC. Такая процедура называется передачей управления.
К командам вызова подпрограмм относятся команды CALL (англ.- вызывать) и RЕТ (англ. return - возвращаться). По команде CALL МП загружает в счетчик команд PC число, записанное как адрес перехода. Одновременно, в регистр стека SP записывается содержимое младшего PC L и старшего РСН байтов счетчика команд. После выполнения подпрограммы МП считывает команду RET, которая является обязательной для любой подпрограммы, извлекает из стека содержимое и загружает эти числа в программный счетчик. Продолжается дальнейшее выполнение программы.
|
|
Команда безусловного перехода имеет вид JМР adr, где JМР - мнемокод команды безусловного перехода (англ. jump-прыжок);
adr- шестнадцатиразрядный адрес ячейки памяти, куда передается управление программой.
Эта команда занимает три байта памяти: первый байт содержит код команды JMP - СЗ, второй байт - младший байт адреса перехода, третий байт - старший байт адреса перехода.
Команды условных переходов осуществляют передачу управления только при выполнении некоторых условий. Если условие не выполняется, то передачи управления не происходит. Проверка условий осуществляется в регистре признаков F после выполнения арифметических и логических операций над числами, находящимися в регистре А. Если осуществлялась команда пересылки, то установка признаков (флагов) в регистре F не выполняется. Расположение разрядов регистра F приведено на рисунок 8.3 общих сведениях УМК.
Мнемокод команд условного перехода составляется по первой букве вида перехода J (JUMP), С (CALL) или R (RETURN) и мнемокода условий перехода по признакам регистра F:
NZ (not zerou ) - ненулевой результат; код 000
Z (zerou) - нулевой результат; код 001
NС (nocarry) - отсутствие переноса; код 010
С (carry) - перенос; код 011
P (раrity old) - нечетный результат; код 100
РЕ (parity even) - четный результат; код 101
P (plus) - положительное число; код 110
M (мinus) - отрицательное число; код III
Например, нужно осуществить переход, если в результате арифметической или логической операции в регистре А получилось четное число. В этом случае, команда условного перехода будет иметь вид:
|
|
JPE adr,
где JРЕ - мнемокод команды условного перехода(один байт);
adr - шестнадцатиразрядный адрес перехода (два байта).
Например, нужно вызвать подпрограмму, если в результате арифметической или логической операции в аккумуляторе (регистре А) получился нулевой результат. В этом случае команда вызова подпрограммы будет иметь вид:
СZadr
где СZ - мнемокод команды (один байт);
adr - шестнадцатиразрядный адрес, где расположена подпрограмма (два байта).
Например, нужно вернуться из подпрограммы, если в аккумуляторе получилось отрицательное число. В этом случае команда будет иметь вид RM, ее размер - один байт. Для того, чтобы перейти от мнемоники и двоичному числу, нужно воспользоваться кодом условия перехода, подставив их в соответствующую команду.
Очень часто при выполнении программ необходимы временные задержки. В микропроцессорном комплекте K580 для этого создана микросхема К580ВИ53 - таймер (англ. time - время). В УМК такой микросхемы нет, поэтому временные задержки выполняются программным путем. Для этого создается циклическая подпрограмма, внутри которой происходит сложение или вычитание чисел. Зная время выполнения каждой операции и величину записанного числа, можно заранее определить время выполнения подпрограммы. Ниже приводится типичная подпрограмма создания временных задержек.
DELAY: LХ1 В, 001F; запись числа, определяющего задержку
LOOP: DСХ В; вычитание на 1 из регистровой пары ВС
MOV А,В; старший байт в аккумулятор
ORA С; сложение старшего и младшего байтов
JNZ LOOP; переход на метку
DСR D; вычитание 1 из регистра D
JNZ DELAY; переход на начало подпрограммы
RET; возврат из подпрограммы
Обычно подпрограмма оформляется в конце основной программы, ее вызов осуществляется командой САLL. После мнемокода этой команды должен стоять адрес ячейки памяти, определяющий начало подпрограммы. Так как при написании программы на языке ассемблера адреса ячеек памяти заранее неизвестны, то начало подпрограммы помечается меткой. В этом случае вызов подпрограммы будет осуществляться командой САLL DELАУ. При записи двухбайтового числа в ячейку памяти вначале записывается младший байт, а затем старший.