Скачиваний:
54
Добавлен:
21.02.2014
Размер:
628.74 Кб
Скачать

7.4.Команды передачи управления (в том числе и операций с подпрограммами)

Выполнение команд передачи управления и работы с подпрограммами в МК 1816 имеет свои особенности и зависит от распределения программ и данных по блокам и страницам памяти, особенно в случае использования внешней памяти.

При использовании внешней памяти программ в МК 1816 команда безусловного перехода JMP позволяет осуществить переход к любой ячейке памяти в пределах блока 0 (адресное пространство 0 ÷ 204710). Переход к блоку памяти 1 (адресное пространство 2048 ÷ 409510) возможен только после предварительного выполнения команды выбора блока памяти 1 ("SEL MB1"). Граница блоков памяти 2К может быть пересечена в любом направлении только по команде перехода или вызова подпрограмм вслед за командой выбора блока памяти. Переключение блока памяти не происходит, пока не выполнится переход. До тех пор, пока не будет выбран другой блок памяти, все переходы осуществляются только в пределах выбранного блока памяти. В том случае, если требуемая подпрограмма располагается в другом блоке памяти, доступ к ней осуществляется тандемом команд: выбор блока памяти и вызов подпрограммы. После выполнения подпрограммы управление передается в исходный, блок памяти в том случае, если в подпрограмме имеется команда выбора исходного блока памяти. В том случае, если в подпрограмме нет команды выбора исходного блока памяти, после выполнения подпрограммы возврат в исходный блок будет все же выполнен правильно, однако любая очередная команда перехода в исходном блоке (в основной программе) вновь передаст управление в другой блок. Необходимо обратить внимание на указанные особенности как на возможный источник ошибок программирования.

Команда передачи управления по косвенному адресу JMPP позволяет выполнять переход к одному из множества адресов в зависимости от содержимого аккумулятора. Аккумулятор адресует ячейку памяти программ, в которой содержится адрес перехода, Эта команда может быть эффективно использована для передачи управления одной из нескольких процедур в зависимости от кода символа (например, для создания таблиц адресов функций), вводимого в аккумулятор (например, с клавиатуры). Для необслуживаемых МК-систем эта команда упрощает реализацию механизма множественных ветвлений по программе в зависимости от результата предыдущих вычислений.

Группа команд условных переходов оперирует со следующими признаками:

Т0 - сигнал на входе Т0;

T1 - сигнал на входе Т1;

ЗПР* - сигнал запроса прерывания;

Z - нулевое содержимое аккумулятора;

Вn - единичное значение любого бита n = { 0÷7 } аккумулятора;

С - признак переноса;

F0, F1 - признаки, специфицируемые разработчиком.

Кодирование команд JMP и CALL в зависимости от номера текущей страницы памяти программ (размер страницы 256 байт) представлено в таблице:

Страница

JMP

CALL

 

Страница

JMP

CALL

0

04

14

 

4

84

94

1

24

34

 

5

А4

В4

2

44

54

 

6

С4

D4

3

64

74

 

7

Е4

F4

Команды условных переходов позволяют осуществлять передачу управления в пределах текущей страницы (256 байт). Анализируемые признаки, за исключением С, Вn и F0, не фиксируются в специальных триггерах, а представляются мгновенными сигналами в АЛУ (признак Z) или на соответствующих выводах МК. Для организации программных циклов используется команда DJNZ (декремент регистра и переход, если не нуль), которая позволяет использовать любой из восьми рабочих регистров в качестве счетчика и осуществить переход в пределах текущей страницы памяти программ.

JMP a - Безусловный переход в пределах блока памяти

"a8-a101'0100   a0-a7", "!4"

(PC8-10) <- a8-10;

(PC0-7) <- a0-7; (PC11) <- DBF

Команда выполняется за два машинных цикла. Адрес перехода a0÷10 передается в счетчик команд (PC, биты 0 ÷ 10). Значение бита 11 счетчика команд определяется последней выполненной командой выбора блока памяти ("SEL MB0" или "SEL MB1").

JMPP @A - Косвенный переход в пределах страницы памяти

"1011'0011", "B3"

(PC0-7) <- ((A))

Команда выполняется за два машинных цикла. Номер страницы не изменяется, а в счетчик команд PC, в биты 0 ÷ 7, загружается содержимое ячейки памяти, адресуемой аккумулятором.

DJNZ a - Декремент регистра и переход, если не нуль

"1110'1rrr" a7--a0", "E*"

(Rr) <- (Rr) - 1; если (Rr) не = 0, то (PC0÷7) <- a,

иначе (РС) <- (РС) + 2

Команда выполняется за два машинных цикла. Декрементируется рабочий регистр, и в случае его обнуления выполняется очередная команда. Переход возможен только в пределах текущей страницы. В том случае, если команда DJNZ расположена в ячейке с адресом 255 текущей страницы, переход должен осуществляться по адресу следующей страницы памяти программ.

Пример: требуется инкрементировать содержимое ячеек 10 ÷ 18 внутренней оперативной памяти.

INCTABL:

MOV

R0,#10

; загрузить в R0 десятичное число 10

 

MOV

R3,#9

; загрузить в счетчик циклов число 9

LOOP:

INC

@R0

; инкремент ячейки памяти

 

INC

R0

; инкремент адреса в R0

 

DJNZ

R3,LOOP

; декремент счетчика циклов и возврат, если не нуль

DONE:

NOP

 

; очередная команда программы

JC a - Переход по признаку переноса

"1111'0110 a0--a7", "F6"

Если C = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JNC a - Переход при отсутствии переноса

"1110'0110 a0÷a7", "F6"

Если C = 0, то (PC0-7) <- a, иначе (PC) <- (PC) + 2

JZ a - Переход при нулевом результате

"1100'0110 a0÷a7", "c6"

Если А = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JNZ a - Переход при ненулевом результате

"1001'0110 a0÷a7", "96"

Если А =/= 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JT0 a - Переход по сигналу 1 на входе Т0

"0011'0110 a0÷a7", "36"

Если T0 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JNT0 a - Переход по сигналу 0 на входе Т0

"0010'0110 a0÷a7", "26"

Если T0 = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JT1 a - Переход по сигналу 1 на входе Т1

"0101'0110 a0÷a7", "56"

Если T1 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JNT1 a - Переход по сигналу 0 на входе Т1

"0100'0110 a0÷a7", "46"

Если T1 = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JF0 a - Переход, если признак F0 равен 1

"1011'0110 a0÷a7", "B6"

Если T0 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JF1 a - Переход, если признак F1 равен 1

"0111'0110 a0÷a7", "76"

Если F1 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JTF a - Переход, если признак TF равен 1

"0001'0110 a0÷a7", "16"

Если TF = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JNI a - Переход, если сигнал на входе запроса

прерывания ЗПР* = 0

"1000'0110 a0÷a7", "86"

Если ЗПР* = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2

JBb a - Переход, если заданный бит аккумулятора равен 1

b0÷b21'0010   a0--a7

Если Bb = 1, то (PC) <- (PC) + 2.

Управление передается по указанному адресу, если заданный бит аккумулятора имеет значение 1.

Шестнадцатеричные коды восьми возможных команд JBb в зависимости от номера тестируемого бита аккумулятора выглядит следующим образом.

JB7

JB6

JB5

JB4

JB3

JB2

JB1

JBO

F2

D2

В2

92

72

52

32

12

CALL a - Вызов подпрограммы

"a8÷a101'0100" "a0 - a7", "14"

((SP)) <-- (PC), (PSW4÷7)

(SP) <-- (SP) + 1

(PC8-10) <-- a8÷a10; (PC11) <-- DBF

При вызове подпрограммы содержимое счетчика команд и биты 4 ÷ 7 ССП загружаются в стек. Управление передается по адресу a10 ÷ a0. Бит 11 счетчика команд определяется последней командой выбора блока памяти (SEL MB).

RET - Возврат без восстановления ССП

"1000'0011", "83"

(SP) <-- (SP) - 1

(PC) <-- ((SP))

Команда выполняется за два машинных цикла. Декрементируется указатель стека (биты 0 ÷ 2 ССП), и в счетчик команд загружается адрес возврата в основную программу.

RETR - Возврат с восстановлением ССП

"1001'0011", "93"

(SP) <-- (SP) - 1

(PC) <-- ((SP)), (PSW4÷7) <-- ((SP))

Эта команда должна использоваться для возврата из подпрограммы обслуживания прерывания и не может быть использована внутри подпрограммы, так как она сигнализирует МК об окончании процедуры прерывания.

Соседние файлы в папке МП К1816ВЕ4