Среда, 18.10.2017, 19:25
БК-0010.01. Повесть о настоящем компьютере
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории каталога
Введение в руководство [2]
Введение [0]
Организация БК-0010 [1]
Раздел 1. Организация БК-0010
Работа с МСД [1]
Раздел 2. Работа с МСД
Системные регистры [1]
Раздел 3. Системные регистры
Системное ПО [1]
Раздел 4. Системное программное обеспечение БК-0010
Прерывания. Приоритет ЦП [1]
Раздел 5. Система прерываний БК-0010. Приоритет процессора
Командные прерывания [1]
Раздел 6. Командные прерывания
ЕМТ БК-0010 [1]
Раздел 7. командные прерывания ЕМТ БК-0010
Коды и ассемблер. Мнемокод. [1]
Раздел 8. Коды и ассемблер. Мнемокод. Формат команды
Способы адресации [1]
Раздел 9. Способы адресации
Команды процессора БК-0010 [1]
Раздел 10. Система команд процессора БК-0010
Псевдокоманды. Метки. Комментарии [1]
Раздел 11. Псевдокоманды ассемблера. Метки. Комментарии
Программирование на ассемблере [1]
Раздел 12. Программирование на ассемблере. Начало. Трансляция программ. Ошибки
Отладка программ [1]
Раздел 13. Отладка программ. Позиционно-независимое программирование. Компановка
Подпрограммы ПЗУ БК-0010 [1]
Раздел 14. Подпрограммы ПЗУ БК-0010
Системная область ОЗУ БК-0010 [1]
Раздел 15. Системная область ОЗУ БК-0010. Некоторые секретные сведения об авторе и МП-клубе
Повышение быстродействия БК-0010 [1]
Раздел 16. Вопросы повышения быстродействия БК-0010
Об использовании ПЗУ [1]
Раздел 17. Полезная подпрограмма. Об использовании ПЗУ
Загадочные регистры [1]
Раздел 18. Загадочные регистры
Штурм системной области [1]
Раздел 19. Продолжаем штурм системной области
Об автозапуске программ [1]
Раздел 20. Об автозапуске программ
Коварные программы [1]
Раздел 21. Коварные программы
Еще о системной области [1]
Раздел 22. О пользе плагиата, или еще о системной области
О псевдокомандах и компановке [1]
Раздел 23. Еще раз о псевдокомандах, метках и компановке
Тук-тук, кто в стеке живет? [1]
Раздел 24. Тук-тук, кто в стеке живет?
Фокал с позиций ассемблера [1]
Раздел 25. Взгляд на фокал с позиций ассемблера
Наш опрос
Оцените мой сайт
Всего ответов: 47
 Каталог статей
Главная » Статьи » Команды процессора БК-0010

Система команд процессора БК-0010

Нужно хорошо уяснить, что система команд процессора БК-0010, и система команд ассемблера микро8 - суть одно и то же.
Почему это так? Да просто потому, что любой ассемблер - ни что иное, как машинно-ориентированный язык. Раз он рассчитан на полное использование ресурсов машины, значит, все команды ЦП должны найти в нем свое выражение. Кратко напомним, что команда состоит из оператора, т.е. указания, что нужно сделать, и операндов, т.е. указаний на числа, с которыми нужно выполнить данную операцию.
Числа могут адресоваться одним из известных уже нам способов. команде может при необходимости предшествовать метка. Операнды могут и отсутствовать, тогда подразумевается, что команда адресуется непосредственно ЦП микро-ЭВМ, и изменяет не числа, а состояние или содержимое внутренних регистров ЦП.

Соответственно, команды бывают 1- 2- и безадресные.
1-адресные команды что-либо делают с 1 числом, 2-адресные - с двумя числами, безадресные подразумевают обращение к ЦП и изменение его состояния.
Это деление чисто условно. Например, команды перехода не имеют операндов (адресов) в явном виде, но они изменяют содержимое регистра R7 (PC). Мы при рассмотрении будем поэтому сразу делить безадресные команды на группы по назначению.

Мы рассмотрим команды ассемблера МИКРО8 с различной степенью детализации, причем наибольшее внимание будем уделять самым употребительным и самым сложным из них. Для освоения всего набора команд нужно обратиться к специальной литературе. Как уже сказано раньше, все команды, имеющие поле операндов, за небольшим исключением, могут работать как со словами, так и с байтами, для чего к мнемокоду оператора добавляется буква B .
Такие команды мы будем помечать буквой (B) в скобках, чтобы показать, что они имеют запись в 2 видах - для работы со словами и с байтами. Следует учесть, что при работе с байтами старшим разрядом считается уже не 15-й, а 07-й, и соответственно все команды выполняются для байта: сдвиг, сложение, вычитание, пересылка и т.д. знаковым разрядом при операциях со знаком тоже считается разряд 07, переполнение также относится к байту, а не к слову, и т.п.

Формат команд мы будем обозначать буквами м,n, где м,n - операнды, например, CLR n; MOV m,n; и т.п.
Если операндом может быть только регистр ЦП, то мы будем обозначать его Rn, считая, что это может быть любой регистр. В остальных случаях будем считать, что адресация операнда может быть любой. Прочие случаи будут отмечаться особо. Метка будет обозначаться словом мет.

Одноадресные команды.
CLR(B) n - очистка (запись нуля) по адресу n.

COM(B) n - логическое дополнение(поразрядное инвертирование) каждый бит слова n инвертируется, независимо от других.

INC(B) n - инкремент n: n=n+1.

DEC(B) n - декремент n: n=n-1.

NEG(B) n - инверсия знака n.
Здесь нужно вспомнить, что знак в БК-0010 представляются в дополнительном коде, т.е. знак слова выражается его старшим разрядом, а именно, если старший разряд равен 0, число считается положительным, если 1 - то отрицательным. Таким образом, если перевести запись числа в дополнительном коде в привычную форму, то 077777=+77777, а 177777=-1. подробнее с этим вопросом можно ознакомиться в специальной литературе, пока же мы можем только привести правило перевода чисел в дополнительный двоичный код:
пусть х - произвольное число; тогда для образования (-х) надо вычесть из х 1, и заменить все единицы нулями, а нули - единицами (в двоичном числе!). проще можно сказать, что если разряд 15 = 1, то число отрицательное; его же абсолютная величина равна разности числа 200000 и этого числа, например, 177777 - отрицательное число, 200000-177777=1, поэтому абс. величина ¦177777¦=1, а т.к. число отрицательное, то оно есть -1. число 100001 - отрицательное; ¦100001¦=200000-100001=77777. отсюда 100001 есть -77777. Иначе можно сказать, что для любого 16-разрядного числа (х), (-х) есть его дополнение до переноса в старшем разряде, поэтому код и назван дополнительным.

TST(B) n - проверка n, с выработкой битов условий в PS.
об этих 4 разрядах PS, или слова состояния процессора, говорилось раньше (см. раздел 1).
напомним, что биты условий формируются не только после выполнения специальных команд проверки или сравнения, но по результату выполнения любой команды.

ASR(B) n - арифметический сдвиг вправо слова n.
все биты слова, кроме знакового, сдвигаются на 1 вправо, младший бит при этом переходит в C/PS, a знаковый дублируется в соседний бит (14-й разряд).

ASL(B) n - арифметический сдвиг влево.
все без исключения биты слова n сдвигаются на 1 влево, знаковый бит переписывается в C/PS, а в младший бит заносится 0.

ROR(B) n - вращение вправо.
все биты слова сдвигаются вправо на 1, мл. бит переходит в C/PS, a C/PS - в старший бит. ROL(B) n - вращение влево. все биты слова сдвигаются влево на 1, ст.бит переходит в C/PS, a C/PS - в младший бит.

SWAB n - младший и старший байты слова n меняются местами.
естественно, что команда работает только с байтами, формы SWA не имеет.

ADC(B) n - к слову прибавляется значение C/PS.

SBC(B) n - из слова вычитается значение C/PS.

SXT n - расширение знака.
всем битам слова n приписывается значение имеющегося на данный момент значения N/PS (значение N/PS может быть установлено раньше, в результате исполнения другой команды).

MFPS n - запись в n слова состояния процессора (ССП).

MTPS n - записать слово n в регистр ССП.

Двухадресные команды.
MOV(B) m,n - пересылка.
значение м переписывается в n, но м при этом не меняется, так что название "пересылка" несколько неточно отражает характер операции.

CMP(B) м,n - сравнение.
сравнение осуществляется по правилу: (м-n)=результат.
результатом являются только биты условий PS, м и n не меняются. например, если м=n, то результатом будет признак нуля в PS, т.е. установится z/PS=1.
если м

ADD m,n - сложение.
в результате n=n+m, m не меняется.

SUB m,n - вычитание.
в результате n=n-m, м не меняется.

BIT(B) m,n - проверка бит.
 производится поразрядное логическое сложение операндов, результат отображается в PS, сами операнды не меняются. применяется в основном для проверки отдельных бит. например, если задать в м интересующий нас бит равным 1, то в случае, если тот же бит n=1, результат операции будет не равен 0, если же бит n=0, to результат 0. логическое сложение иначе называется операцией "логического и".

BIC(B) m,n - очистка бит.
устанавливаются в 0 те биты n, которым соответствуют единичные биты м, м не
меняется. иначе, это очистка бит 2-го операнда по маске 1-го.

BIS(B) m,n - установка бит.
устанавливаются в 1 те биты n, которым соответствуют единичные биты м, м не меняется. иначе, это установка бит 2-го операнда по маске 1-го.

XOR m,n - "исключающее или".
поразрядное "исключающее или" между м и n, результат заносится в n, m не меняется. иначе говоря, при этом в результате на месте несовпадающих бит м и n записаны 1-цы, на месте совпадающих - нули. Это как бы поразрядное вычитание, но без учета того, где уменьшаемое, а где - вычитаемое. образуется не разность, а разница двух чисел.

Команды ветвления программы.
Это - команды условных и безусловных переходов. условные переходы выполняются по сформированным после предыдущей команды битам условий N, C, Z, V ССП (PS).
При описании команд эти условия будут приведены. непременным условием для данной группы команд является передача управления в программе не более, чем на 256д байт от данной точки. Это объясняется тем, что все эти команды занимают 1 слово, в котором только 1 байт используется для задания относительного адреса перехода.
Формат всех этих команд: <ком.перехода> мет, например: BR a; BHIS 123; и т.п., где а, 123 - метки.

BR met - безусловный переход к метке мет.

BNE met - переход, если не 0 (z=0).

BEQ met - переход, если 0 (z=1).

BPL met - переход, если + (n=0).

BMI met - переход, если - (n=1).

BVC met - переход, если нет переполнения (v=0).

BVC met - переход, если переполнение (v=1).

BCC met - переход, если нет переноса (c=0).

BCS met - переход, если перенос (c=1).

BGE met - переход, если больше или равно 0 (n=v).

BLT met - переход, если меньше 0 (n+v).

BGT met - переход, если больше 0 (zv=0;n=v).

BLE met - переход, если меньше или равно 0 (zv=1;n+v).

BHI met - переход, если больше без учета знака (cvz=0).

BLOC met - переход, если меньше или 0 без учета знака (cvz=1).

BHIS met - переход, если больше или 0 без учета знака (с=0).

BLO met - переход, если меньше без учета знака (с=1).

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

Сложнее вопрос, чем отличаются команды условного перехода с учетом знака (BGE, BLT, BGT, BLE) от аналогичных без учета знака (BHI, BLOS, BHIS, BLO).
Вспомним про дополнительный код. Если для команд 1-й группы число 177777 есть -1, и оно меньше, чем число, скажем, 77777, то команды 2-й группы знак не учитывают, а сравнивают 16-разрядные положительные числа. значит, для них число 177777 есть +177777, и оно больше, чем число 77777.
Здесь уместно напомнить, что слова "сравнивают числа" следует понимать так: сами эти команды ничего не сравнивают, а лишь анализируют биты условий, возникшие в результате выполнения предшествующей команды. возникает вопрос, нужны ли все эти команды условных переходов, или можно обойтись их минимальным набором? Применение всех имеющихся команд переходов позволяет экономить память, так как для каждого случая можно обойтись только одной подходящей командой. В то же время, допустимо в большинстве случаев ограничиться только командами BNE и BEQ.
Правда, это приводит к необходимости вначале выполнить лишние операции сложения или вычитания, зато эти команды недвусмысленны, и с ними труднее запутаться, они одинаковы для чисел со знаком и без него. Вспомним по аналогии фокал, где по сути только и есть эти команды условного перехода, правда, еще с учетом знака: переход по +, -, или 0.

Вопрос о применении только этих команд или иной конкретной команды условного перехода решается конкретно для каждого случая, но ряд авторов настоятельно рекомендует преимущественное применение команд BNE и BEQ, все же остальные команды условного перехода следует применять лишь там, где это действительно необходимо.

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

Прочие команды управления программой.
JMP n - безусловный переход.
адрес может быть задан любым способом.
в отличие от команды BR met, это может быть абсолютный адрес, метка, относительный адрес, и т.д., расстояние же, на которое передается управление, ничем не ограничено в пределах адресного пространства ЭВМ.
Но зато эта команда, как и некоторые последующие, занимает 2 слова, в то время, как все предыдущие команды переходов - одно.

JSR Rn, - переход к подпрограмме.
Остановимся на этой команде подробнее. С подпрограммами вы уже встречались в фокале, и знаете, что они применяются, если нужно одну и ту же последовательность действий выполнять в разных точках программы неоднократно. Эту последовательность и оформляют в виде подпрограммы (п/п).
Вход в п/п явно указан в команде: это . способ адресации любой: метка, абсолютный адрес, и т.п.
Но, когда п/п выполнена, необходимо вернуться в ту точку программы, откуда мы к ней обратились. Значит, этот адрес нужно где-то хранить. этим местом хранения служит один из регистров Rn.
Например, если написать:
JSR R1,@#163270,
то управление будет передано п/п, начало которой находится в ПЗУ по адресу 163270. Адрес возврата, т.е. адрес следующей команды основной программы запоминается при этом в R1. естественно, что R1 п/п "не должна трогать", иначе возврат станет невозможен.
Ясно, что если из 1-й п/п обратиться во 2-ю, из нее - в 3-ю, и т.д., то нам очень скоро не хватит регистров для запоминания адресов возврата.

Как быть? ассемблер предусматривает команду вида: JSR R7,. при этом вовсе не имеется в виду, что адрес возврата хранится в R7 (не забудьте, что в МИКРО8 R7 обозначается PC!). Нет, при этом адрес возврата хранится в стеке. Стек весьма велик, и в такой форме можно многократно обращаться из одной п/п в другую.

Зачем же тогда форма JSR Rn,?
Она дает преимущество в скорости, и не трогает стек, а это иногда очень важно. Но вот п/п выполнена. как обозначить ее конец? для этого служит следующая команда.

RTS Rn - возврат из п/п.
По этой команде ЦП извлекает из Rn (это должен быть тот же регистр, что в команде JSR Rn,!) адрес возврата, и передает по нему управление. если в конце фрагмента, на который передано управление командой JSR, нет команды RTS, то по сути команда JSR сыграет роль команды JMP, т.к. возможность возврата управления будет утрачена. если, напротив, встретится RTS без предшествующей JSR, результат обычно непредсказуем, т.к. управление будет передано по произвольному адресу, содержащемуся на данный момент в стеке или регистре.

хотя оба эти варианта могут быть весьма эффектно использованы программистом в своих целях, делать это не следует по той простой причине, что такую программу никто, кроме автора, никогда не поймет.

MARK n - дополнительная инструкция передачи управления п/п, с передачей параметров через стек.
применяется очень редко, а поэтому мы ее подробно не рассматриваем. аналог MARK из расширенного набора команд мини-ЭВМ СМ-4.

SOB Rn,met - инструкция для работы с циклами, также из расширенного набора СМ-4. применяется, наоборот, очень широко.
Занимая одно слово, может организовать цикл из заданного числа повторов, охватывающий заданное число адресов, не превышающее 64д байт. До команды SOB число повторов цикла заносится в любой из свободных регистров Rn.
Меткой met отмечается начало цикла, а в конце помещается команда SOB Rn,met.
При каждом исполнении данной команды из Rn вычитается 1, и результат проверяется на равенство 0; если не 0 - переход к мет. Очевидно поэтому, что команда может передавать управление только "назад", т.е. met должна предшествовать SOB, но не наоборот.
Содержимое Rn может быть в цикле изменено по условию с помощью нескольких дополнительных команд (если это нужно), с целью досрочного выхода из цикла (для этого следует сделать Rn=1). но обычно цикл не должен "трогать" выделенный Rn.

Наиболее часто данная команда применяется для создания временных задержек. с одним регистром, если его исходное значение равно 0, а цикл пустой, задержка для БК-0010 равна примерно 440 мс. приведем фрагмент программной задержки:

          CLR R5
met: SOB R5, met

 в 1-й строке очищается регистр R5, выделенный для этого случая, а во 2-й организован пустой цикл, длительность его 440 мс.
Очевидно, что если мы, например, будем в цикле каждый раз добавлять к Rn 1, цикл станет бесконечным.  Можно значительно увеличить предельное время задержки, если, например, использовать вложенные циклы. Они применимы и для других целей, как и в фокале. число вложений ограничено числом регистров ЦП БК-0010.
Можно увеличить длительность задержки и иным способом, например, выполнять в цикле какую-либо последовательность "пустых" операций, например,
MOV R5,R5;
NOP,
и т.п.

Команды прерывания программы.

ЕМТ n, TRAP n - командные прерывания для системных программ и программ пользователя. эти две команды очень подробно были рассмотрены раньше.

BPT, IOT - эти команды предназначены для специальных целей, и используются преимущественно операционными системами.
BPT - прерывание для целей отладки по T-разряду.
IOT - прерывание для вызова процедур ввода-вывода.

RTT - возврат из прерывания.
применяется для специальных целей.

RTI - возврат из прерывания.
должна обязательно стоять в конце программы обработки прерывания по вектору или командного прерывания. назначение рассмотрено выше.

Команды управления машиной.

HALT - останов.
производит действие, аналогичное нажатию клавиши стоп , т.е. прерывание программы по вектору 4.

WAIT - ожидание.
По данной команде происходит прекращение всех действий ЦП до поступления запроса на прерывание от внешних устройств или до нажатия клавиши СТОП.

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

NOP - пустая операция.
может быть вставлена в готовую программу, если необходимо исключить какую-либо команду: тогда ее заменяют на nop. при этом надо помнить, что если команда состояла из 2 или 3 слов, то для ее замены необходимо также 2 или 3 команды nop, каждая из которых занимает 1 слово.

Команды изменения признаков.
Иногда (весьма редко) требуется изменить биты признаков Z, N, V, C ССП. Для этого служат специальные команды.

CLN - очистка n.

CLZ - очистка z.

CLV - очистка v.

CLC - очистка с.

CCC - очистка всех 4 бит признаков.

SEN - установка n=1.

SEZ - установка z=1.

SEV - установка v=1.

SEC - установка с=1.

SCC - установка всех 4 бит признаков n=z=v=c=1.

На этом рассмотрение системы команд БК-0010 (и совпадающих с ними команд ассемблера микро8) можно считать оконченным. Следует иметь в виду, что в данном руководстве дается только самое общее представление о системе команд. Изучение специальной литературы, а более всего - опыт работы с ассемблером, позволят читателю усовершенствоваться в этом вопросе. Далее будут рассмотрены дополнительные команды ассемблера, а также отдельные приемы программирования на ассемблере микро8.

Категория: Команды процессора БК-0010 | Автор: ЗАЛЬЦМАН Ю.А., МП-КЛУБ, г.АЛМА-АТА
Просмотров: 853 | Рейтинг: 0.0/0 |

Всего комментариев: 0
Имя *:
Email *:
Код *:
Используются технологии uCoz
Форма входа

Поиск
Друзья сайта
Статистика