Двоичная арифметика

Двоичная арифметика

 

  1. Представление положительных целых чисел в двоичном коде.
  2. Представление целых чисел со знаком в двоичном коде. Прямой, дополнительный код. Модифицированный дополнительный код, для чего применяется.

 

Дополнительный код  наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ.

Дополнительный код отрицательного числа можно получить инвертированием модуля двоичного числа (первое дополнение) и прибавлением к инверсии единицы (второе дополнение), либо вычитанием числа из нуля.

Дополнительный код двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1.

модифицированных кодов состоит в том, что к знаковому разряду добавляется ещё один разряд: 
"+" ставится в соответствие 00  
"–" ставится в соответствие 11  
Тогда, по определению модифицированным дополнительным кодом числа называется 
Возникающий в знаковых разрядах перенос теряется. В целом же модифицированный код не отличается от простого дополнительного. Аналогично, по определению, обратным кодом является:  
Как и в случае простого обратного кода, возникающая единица переноса в знаковых разрядах по цепи циклического переноса добавляется в младший разряд цифровой части числа.

3.      Представление вещественных чисел с фиксированной точкой в двоичном коде

      4.      Представление вещественных чисел  с плавающей точкой в двоичном  коде

 

 

Типовые узлы ЭВМ

  1. Инвертор (элемент НЕ), дизъюнктор (элемент ИЛИ), конъюнктор (элемент И). Их принцип работы, таблицы истинности.

 

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

Дизъю́нкция, логи́ческое сложе́ние, логи́ческое ИЛИ, включа́ющее ИЛИ; иногда просто ИЛИ —логическая операция, по своему применению максимально приближённая к союзу «или» в смысле «или то, или это, или оба сразу»

Конъю́нкция  логическая операция, по своему применению максимально приближенная к союзу «и». Синонимы: логи́ческое «И», логи́ческое умноже́ние, иногда просто «И»

 

  1. Элемент И-НЕ, элемент ИЛИ-НЕ, исключающее ИЛИ (сложение по модулю 2). Их принцип работы, таблицы истинности, схемы.

             Элемент «И-НЕ» (NAND)

Элемент И-НЕ работает точно так же как «И», только выходной сигнал полностью противоположен. Там где у элемента «И» на выходе должен быть «0», у элемента «И-НЕ» - единица. И наоборот.

Элемент «ИЛИ-НЕ» (NOR)

Та же история – элемент «ИЛИ» с инвертором на выходе.

 

 

 

 

 

 

Элемент «Исключающее ИЛИ» (XOR)

Операция, которую он выполняет, часто называют «сложение по модулю 2». На самом деле, на этих элементах строятся цифровые сумматоры.Смотрим таблицу истинности. Когда на выходе единицы? Правильно: когда на входах разные сигналы. На одном – 1, на другом – 0. Вот такой он хитрый.

  1. Одноразрядный двоичный сумматор, сумматор с переносом. Их принцип работы, таблицы истинности, схемы, применение

 

Сумматор является основным узлом арифметико-логического устройства ЭВМ и служит для суммирования чисел посредством поразрядного сложения.

Сумматор выполняет сложение многозначных двоичных чисел.  Он представляет собой последовательное соединение одноразрядных двоичных сумматоров, каждый из которых осуществляет сложение в одном разряде. При этом если сумма двух цифр в данном разряде больше или равна  основанию  используемой системы счисления, то возникает перенос (Pj,j=1,…, n-1 на схеме) старшего разряда в соседний сумматор.

Одноразрядный сумматор должен иметь два выхода: для суммы и для переносимого значения. У него может быть два (на схеме правый справа сумматор) или три (для складываемых значений и значения переноса) входа.

Одноразрядный  двоичный сумматор на два входа и два выхода называется одноразрядным полусумматором.

 

  1. Дешифраторы с одним, двумя и тремя входами. Принцип работы, таблицы истинности, схемы, применение.

 

дешифратор – это устройство, преобразующее цифровой сигнал, в какой либо кодировке в другую, не закодированную форму

Дешифратор – логическая комбинационная схема, которая имеет n информационных входов и 2n выходов. Каждой комбинации логических уровней на входах будет соответствовать активный уровень на одном из 2n выходов. 

 

  1. Коммутаторы с одним, двумя и тремя адресными входами. Принцип работы, таблицы истинности, схемы, применение.

 

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

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

     

 

  1. Триггер. Принцип работы, таблица истинности, схема, применение.

       Триггеры являются основными элементами цифровой техники, их широко используют в качестве запоминающих ячеек автоматических и вычислительных устройств. Название «триггер» произошло от английского слова «trigger», означающего «защелка» или «спусковой крючок».Триггер имеет два устойчивых состояния, в каждом из которых он может находится до тех пор, пока под воздействием внешнего сигнала не будет переведен в другое устойчивое состояние.Триггер – устройство, которое может запоминать сигналы 0 и 1, демонстрировать их, а в случае необходимости и забывать. Механическим аналогом триггера является обычный выключателя или тумблер, который может находиться только в двух положениях – включенном и выключенном.

Простейший триггер состоит из двух элементов «И – НЕ»; входы и выходы которых соединены кольцом: выход первого соединен со входом второго  и выход второго соединен со входом первого. При этом получается устройство с двумя устойчивыми состояниями. Один вход обозначается буквой S (от английского слова «SET»), а другой – буквой R(от английского слова «Reset» - переустановка или «сброс»).

При подаче на оба входа триггера логического нуля (S=R=0) на обоих входах триггера должна установиться логическая единица. Это запрещенное состояние триггера; оно не используется.При S=0 и R=1 на выходе Q устанавливается логическая единица, в этом случае говорят, что триггер установлен в состояние 1.При S=1 и R=0 происходит сброс сигнала на выходе Q  - на нем устанавливается логический ноль. Говорят, что триггер установлен в состояние 0.При S=1 и R=1 триггер находится в состоянии покоя  - это режим хранения , т.е. на выходах Q  и Q остаются прежние значения сигнала.

 

Язык Ассемблер

 

  1. Регистры и их назначение: общего назначения, индексные, сегментные. Флаги и их назначение.

 

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

AX — аккумулятор. Использовался  для хранения операндов в командах  умножения и деления, ввода-вывода, в некоторых командах обработки  строк и других операциях;

BX — регистр базы. Используется  для хранения адреса или части  адреса операнда, находящегося в  памяти;

CX — счётчик. Содержит количество  повторений строковых операций, циклов и сдвигов;

DX — регистр данных. Используется  для косвенной адресации портов ввода-вывода, а также как «расширитель» аккумулятора в операциях удвоенной разрядности;

SI — регистр адреса источника. Используется в строковых операциях, а также в качестве индексного  регистра при обращении к операндам  в памяти;

DI — регистр адреса приёмника. Используется в строковых операциях, а также в качестве индексного регистра при обращении к операндам в памяти;

BP — указатель кадра стека. Используется  для адресации операндов, расположенных  в стеке;

SP — указатель стека. Используется при выполнении операций со стеком, но не для явной адресации операндов в стеке.

Первые четыре регистра могут делиться на две однобайтовых части каждый: AH, BH, CH и DH для старших байтов и AL, BL, CL и DL для младших байтов.

 

Индексные регистры

К регистрам общего назначения иногда относят и индексные регистры процессора 80386 — ESI, EDI и ЕВР (или SI, DI и ВР для 16-разрядных действий). Обычно эти регистры используются для адресации памяти: обращения к массивам, индексирования и т.д. Отсюда их имена: индекс источника (Source Index), индекс приемника (Destination Index), указатель базы (Base Pointer).Но хранить в них только адреса совсем необязательно: регистры ESI, EDI и ЕВР могут содержать произвольные данные. Эти регистры программно доступны, то есть их содержание может быть изменено программистом. Другие регистры лучше «руками нетрогать».У регистров ESI, EDI и ЕВР существуют только в 16-разрядная и 32-разрядная версии.

 

 

 

Сегментные регистры

Эту группу регистров можно отнести к регистрам состояния. Регистры из этой группы используются при вычислении реального адреса (адреса, который будет передан на шину адреса). Процесс вычисления реального адреса зависит от режима процессора (реальный или защищенный) и будет рассмотрен в следующих главах. Сегментные регистры только 16-разрядные, такие же, как в 80286.Названия этих регистров соответствуют выполняемым функциям: CS (Code Segment, сегмент кода) вместе с EIP (IP) определяют адрес памяти, откуда нужно прочитать следующую инструкцию; аналогично регистр SS (Stack Segment, сегмент стека) в паре с ESP (SS:SP) указывают на вершину стека. Сегментные регистры DS, ES, FS, и GS (Data, Extra, F и G сегменты) используются для адресации данных в памяти.

 

  1. Команда MOV, её формат, действие. Способы адресации. Команды CBW, CWD, их форматы, действие.

 

            Эта команда используется для копирования значения из одного места в другое. Это  может быть регистр, ячейка памяти или непосредственное значение (только как исходное значение). Синтаксис команды:  
 
mov приемник, источник 

 

 Команды CBW/CWDE и CWD/CDQ осуществляют преобразование хранящегося в аккумуляторе байта (AL), слова (АХ) или двойного слова (ЕАХ) соответственно в одинарное, двойное или четверное слово (16,32 или 64 разряда) путем расширения знакового разряда. При выполнении команд CBW, CWDE расширенный операнд остается в аккумуляторе: AL в АХ или АХ в ЕАХ. При выполнении команд CWD, CDQ расширение АХ, ЕАХ производится в регистры DX или EDX, куда заносится старшая половина (расширенный знак) результата. Команды CBW, CWD реализуются, когда процессор работает в режимах реальных адресов или виртуального 8086 (обработка 16-разрядных слов). Команды CWDE, CDQ выполняются в защищенном режиме (обработка 32-разрядных слов). Эти операции обычно производятся перед выполнением команды IDIV для образования из 8-, 16- или 32-разрядных операндов делимого удвоенной разрядности.

 

  1. Арифметические команды ADD, SUB, ADC, SBB, NEG, MUL, IMUL, DIV, IDIV. Их форматы, действие.

           

add приемник,источник      

Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.

sub операнд_1,операнд_2 

выполнить вычитание операнд_1=операнд_2-операнд_1Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.

adc приемник,источник

Команда adc используется при сложении длинных двоичных чисел. Ее можно использовать как самостоятельно, так и совместно с командой add. При совместном использовании команды adc с командой add сложение младших байтов/слов/двойных слов осуществляется командой add, а уже старшие байты/слова/двойные слова складываются командой adc, учитывающей переносы из младших разрядов в старшие. Таким образом, команда adc значительно расширяет диапазон значений складываемых чисел. В приложении 7 приведен пример программы сложения двоичных чисел произвольной размерности.

sbb операнд_1,операнд_2

  • выполнить сложение операнд_2=операнд_2+(cf);
  • выполнить вычитание операнд_1=операнд_1-операнд_2;     
  • Команда sbb используется для выполнения вычитания старших частей значений многобайтных операндов с учетом возможного предыдущего заема при вычитании младших частей значений этих операндов.

     neg источник

  • выполнить вычитание (0 – источник) и поместить результат на место источника;
  • если источник=0, то его значение не меняется.
  • Команда используется для формирования двоичного дополнения операнда в памяти или регистре. Операция двоичного дополнения предполагает инвертирование всех разрядов операнда с последующим сложением операнда с двоичной единицей. Если операнд отрицательный, то операция neg над ним означает получение его модуля.

mul множитель_1 

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

  • если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;
  • если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;
  • если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax.

Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:

  • при умножении байтов результат помещается в ax;
  • при умножении слов результат помещается в пару dx:ax;
  • при умножении двойных слов результат помещается в пару edx:eax.
  • Команда mul выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано, а другого задается операндом в команде. Контролировать размер результата удобно используя флаги cf и of.

mul множитель_1   
imul множ_1,множ_2   
imul рез-т,множ_1,множ_2


Назначение: операция умножения двух целочисленных двоичных значений со знаком. Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

  • если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;
  • если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;
  • если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

  • при умножении байтов результат помещается в ax;
  • при умножении слов результат помещается в пару dx:ax;
  • при умножении двойных слов результат помещается в пару edx:eax.

Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:

  • в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;
  • в команде с тремя операндами первый операнд определяет местоположение результата, второй операнд — местоположение первого сомножителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово.

Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:

  • для однооперандной формы команды imul регистры ax/dx/edx являются знаковыми расширениями регистров al/ax/eax;
  • для двухоперандной формы команды imul для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;
  • то же для трехоперандной команды умножения.

div делитель

Назначение: выполнение операции деления двух двоичных беззнаковых значений. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:

  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.
  • Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

idiv делитель

Назначение: операция деления двух двоичных значений со знаком. Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:

  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx;

Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя. Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

  1. Команды условного и безусловного перехода, их форматы и действие. Организация «длинных» условных переходов.

 

 

 Безусловный переход — это переход, который выполняется всегда. Безусловный переход осуществляется с помощью команды JMP. У этой команды один операнд, который может быть непосредственным адресом (меткой), регистром или ячейкой памяти, содержащей адрес. Существуют также «дальние» переходы — между сегментами, однако здесь мы их рассматривать не будем.

 

Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора (кроме одной команды, которая проверяет CX на равенство нулю). Как вы помните, состояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде.

 

  1. Команды организации циклов, их форматы и действие.

 

Для огранизации циклов используется комманда Loop

<метка>

           <тело  цикла>

           LOOP <метка>   

Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла. Помните о двух важных моментах:

  • для предотвращения выполнения цикла при нулевом ecx/cx используйте команду jecxz/jcxz. Если этого не сделать, то при изначально нулевомecx/cx цикл повторится 4 294 967 295/65 536 раз;
  • смещение метки, являющейся операндом loop, не должно выходить из диапазона -128...+127 байт. Это смещение, как и в командах условного перехода, является относительным от значения счетчика адреса следующей за loop команды.
  1. Стек, принцип его работы, команды работы со стеком, их форматы и действие.

 

Стек  структура данных, представляющая собой список элементов, организованных по принципу  «последним пришёл — первым вышел».

Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

Возможны три операции со стеком: добавление элемента (иначе проталкивание, push), удаление элемента (pop) и чтение головного элемента(peek).

При проталкивании (push) указывается новый элемент, указывающий на элемент бывший до этого головой. Новый элемент теперь становится головным.

При удалении элемента убирается первый, а головным становится тот, на который был указатель у этого объекта (следующий элемент).

 

void push( STACK *ps, int x ) // Добавление в  стек нового элемента

{

    if ( ps->size == STACKSIZE ) // Не переполнен  ли стек?

    {

        fputs( "Error: stack overflow\n", stderr );

        abort();

    }

    else

    {

        ps->items[ps->size++] = x;

    }

}

 

int pop( STACK *ps ) // Удаление из стека

{

    if ( ps->size == 0 ) // Не опустел  ли стек?

    {

        fputs( "Error: stack underflow\n", stderr );

        abort();

    }

    else

    {

        return ps->items[--ps->size];

    }

}


Двоичная арифметика