Cтраница 3
Программа работает следующим образом. Старший разряд регистра Е записывается в младший разряд регистра D, а старший разряд регистра D заносится во флажок переноса С. [31]
Флажок Флажок переноса устанавливается, чтобы показать, что имел ме-переноса сто перенос или заем во время выполнения команд сложения, вычитания или сложения чисел удвоенной длины. Команда циклического сдвига может переслать ЕДИНИЧНЫЙ бит во флажок переноса, тем самым устанавливая флажок. Флажок переноса всегда сбрасывается при выполнении команд И / ИЛИ. [32]
Обычно в состав логических команд включают также и подгруппу сдвигов. Определены операции циклического RRC, RLC и расширенного RAR, RAL сдвигов. В операциях участвует только флажок переноса CY, который всегда принимает значение выходного бита. Предварительная установка CY в 0 или 1 совместно с расширенным сдвигом дает возможность организовать отсутствующие в системе команд логические и арифметические сдвиги в обе стороны. [33]
Для однобайтных операндов команда ADD А удваивает значение 8-битового числа в АККУМУЛЯТОРЕ. Аналогичное действие выполняет команда DAD H с 16-битовыми числами в паре регистров HL. В обоих случаях это эквивалентно сдвиганию каждого бита операнда влево на один разряд, а старшего бита - во флажок переноса. [34]
В примере сложение реализуется загрузкой младшего байта второго слагаемого ( содержимого NOS 2) в аккумулятор с последующим прибавлением младшего байта первого слагаемого из регистра С. АЛУ загружает сумму в аккумулятор, а следующая команда передает ее в регистр С. Затем эти действия повторяются для старших байт, но для учета переноса вместо команды ADD используется команда ADC. Если беззнаковая сумма от первой команды ADD превышает 8 бит, устанавливается флажок переноса. Команда ADC складывает старшие байты и значение переноса. [35]
Логические команды с одним операндом являются командами циклического сдвига, которые перемещают данные, находящиеся в АККУМУЛЯТОРЕ, внутри регистра. В частности, каждый бит перемещается влево или вправо на один разряд. Бит, сдвигаемый за пределы крайнего левого или правого разряда, перемещается на освободившееся место с другого конца регистра, а также во флажок переноса. В других вариантах команд циклического сдвига флажок переноса присоединяется к АККУМУЛЯТОРУ во время выполнения команды и рассматривается так, как будто он является частью регистра. [36]
Логические команды с одним операндом являются командами циклического сдвига, которые перемещают данные, находящиеся в АККУМУЛЯТОРЕ, внутри регистра. В частности, каждый бит перемещается влево или вправо на один разряд. Бит, сдвигаемый за пределы крайнего левого или правого разряда, перемещается на освободившееся место с другого конца регистра, а также во флажок переноса. В других вариантах команд циклического сдвига флажок переноса присоединяется к АККУМУЛЯТОРУ во время выполнения команды и рассматривается так, как будто он является частью регистра. [37]
В любом случае АЛУ считает операнды двумя 8-битными положительными числами. Когда операнд трактуется таким образом, он называется целым без знака. Целые, используемые обычным образом с учетом их знаков, называются целыми со знаком. В сложении двойной точности младшие байты подаются в АЛУ и суммируются, как целые без знака. Если сумма оказывается слишком большой, устанавливается флажок переноса. При сложении старших байт нужно прибавить бит переноса. В вычитании двойной точности находится дополнительный код вычитаемого, а затем младшие байты операндов суммируются, как целые без знака. Если величина вычитаемого больше уменьшаемого, устанавливается флажок переноса, означающий заем. Это происходит, если суммирование не дает переноса. Затем вычитаются старшие байты, а заем вычитается из разности. Рассмотренные приемы легко распространить на сложение и вычитание с точностью большей кратности. [38]
В набор команд микропроцессора COSMAC входят два типа команд перехода. Первый из них существует в двух видах - длинном и коротком. В длинной команде перехода размещаются оба байта счетчика команд, что позволяет обращаться к любой ячейке памяти. В короткой команде размещается только младший байт счетчика команд, что ограничивает переход 256 байтами текущей страницы памяти. Оба типа команд перехода могут быть условными и выполняются в зависимости от содержимого аккумулятора, от значений флажка переноса и значений в других определенных регистрах и флажках. [39]
В этом примере предполагается, что множимое и множитель являются 8-битовыми положительными числами. Предполагается, что множитель находится в регистре Н, а множимое - в регистре С. Регистр Е используется в качестве счетчика, а пара регистров HL используется для накапливания частичной суммы произведения по мере ее формирования. Следует отметить, что множитель постепенно сдвигается за пределы регистра Н, освобождая место для частичной суммы произведения по мере ее формирования в паре регистров HL. Команда DAD В используется для сложения множимого, представленного 16-битовым числом, с частичной суммой произведения при условии, что очередной бит множителя, сдвинутый во флажок переноса, не равен нулю. [40]
В примере сложение реализуется загрузкой младшего байта второго слагаемого ( содержимого NOS 2) в аккумулятор с последующим прибавлением младшего байта первого слагаемого из регистра С. АЛУ загружает сумму в аккумулятор, а следующая команда передает ее в регистр С. Затем эти действия повторяются для старших байт, но для учета переноса вместо команды ADD используется команда ADC. Если беззнаковая сумма от первой команды ADD превышает 8 бит, устанавливается флажок переноса. Команда ADC складывает старшие байты и значение переноса. Вычитание выполняется аналогично; флажок переноса устанавливается при возникновении заема. Команда SBB не только дает разность старших байт, но и вычитает из разности значение заема. [41]
В любом случае АЛУ считает операнды двумя 8-битными положительными числами. Когда операнд трактуется таким образом, он называется целым без знака. Целые, используемые обычным образом с учетом их знаков, называются целыми со знаком. В сложении двойной точности младшие байты подаются в АЛУ и суммируются, как целые без знака. Если сумма оказывается слишком большой, устанавливается флажок переноса. При сложении старших байт нужно прибавить бит переноса. В вычитании двойной точности находится дополнительный код вычитаемого, а затем младшие байты операндов суммируются, как целые без знака. Если величина вычитаемого больше уменьшаемого, устанавливается флажок переноса, означающий заем. Это происходит, если суммирование не дает переноса. Затем вычитаются старшие байты, а заем вычитается из разности. Рассмотренные приемы легко распространить на сложение и вычитание с точностью большей кратности. [42]