Другой способ безусловного перехода (программирование перехода на динамический адрес)


Введение

Безусловный переход

Команды безусловного перехода меняют порядок выполнения команд в программе. Т.е. результатом выполнения команды безусловного перехода будет выполнение не следующей по порядку размещения в программе, а указанной команды – команды адрес которой указан командой безусловного перехода.

Примером команды безусловного перехода является команда JMP #Adr

 

Где: #Adr – адрес перехода задаваемый непосредственным способом адресации [3.4.6]

 

3.7.2 Алгоритм JMP #Adr

Алгоритм на языке ЯОМО на этот раз - запишем в упрощённой форме, не используя блок схему:

RC <– [PC]
Дешифрация
PC ß #Adr
Проверка INT

Алгоритм очень прост:

Микрооперации 1, 2: стандартные. Описаны [3.6.2]

Микрооперация 3: единственная уникальная микрооперация команды. Адрес перехода из единственного поля атрибута команды копируется в программный счётчик PC. Этим – и обеспечивается "переход" – выполнение в следующем командном цикле команды размещённой по адресу #Adr.

Микрооперация 4: стандартная. Смотрите - [3.6.2]. Заметим что другая стандартная микрооперация завершения – увеличение PC на величину Lk - не выполняется. Оно и понятно: ведь следующая исполняемая команда после JMP #Adr не следующая по порядку размещения в программе, а команда по адресу Lk , её адрес – уже в программном счётчике.

 

Замечу: Вам нужно научится не "запоминать" - а понимать - почему те или иные микрооперации присутствуют в командах, тогда и алгоритмы команд – покажутся вам очень "лёгкими", и вы без труда сможете воспроизводить алгоритм выполнения любой команды.

 

 

3.7.3 Недостаток команды JMP #Adr

1) Заметим – адрес перехода в команде JMP #Adr задан непосредственным методом адресации. Непосредственный метод адресации – пригоден только для констант. Это означает: изменить по ходу программы адрес перехода – невозможно. Адрес на который будет осуществлять переход команда JMP #Adr определяется не по ходу выполнения, а на этапе трансляции программы, про это говорят "определяется статически". Про такой переход говорят "статический переход".

 

2) Иногда в программах требуется другой тип перехода - так называемый "переход на динамический адрес" или ещё говорят "динамический переход". Переход на динамический адрес – это переход на адрес который вычисляется уже по ходу выполнения программы ( говорят –"на этапе выполнения") Если для программирования таких переходов непригодна команда JMP #Adr – приходится использовать другой способ.

 

1) Заметим – переход в подпрограмме вызовет не только команда JMP, но и любая другая команда – что изменит значение программного счётчика РС. Например - команда пересылки MOV PC mem. Команда занесёт в программный счётчик слово считанное из ячейки памяти mem и вызовет тем самым переход. Воспользуемся этой командой для программирования динамического перехода.

В нашей программе:

А) Сначала вычислим адрес перехода, и поместим его в ячейки памяти по адресу mem. ( mem – любой адрес памяти не занятый другими данными)

В) Командой MOV PC mem выполним переход на адрес прописанный в ячейке mem.

 

2) Следует только учесть, что команда MOV – не является "специальной" командой перехода, и как большинство команд, в ходе выполнения предпоследней из микроопераций - увеличит PC на величину длинны команды MOV. Смотрите [3.6.2] Поэтому переход получится "немного не туда" - вместо перехода на адрес хранящийся в ячейке mem, произойдёт переход на адрес, на L k - больший. Чтобы этого не произошло – поступаем просто: вычисляя адрес перехода, уменьшим его на величину L k команды MOV (так называемая "коррекция адреса"), вот переход как раз и получится – на нужный адрес перехода.