Учебное пособие по ОЭВМ (775573), страница 2
Текст из файла (страница 2)
Двоичное представление op1 сдвигается вправо на op2 разрядов. Освобождающиеся разряды заполняются 0.
ASL (арифметический сдвиг влево) op1 ASL op2
Двоичное представление op1 сдвигается влево на op2 разрядов. Освобождающиеся разряды заполняются 0.
ASR (арифметический сдвиг вправо) op1 ASR op2
Двоичное представление op1 сдвигается вправо на op2 разрядов. Знаковый разряд (старший разряд) дублируется.
ROL (циклический сдвиг влево) op1 ROL op2
Двоичное представление op1 циклически сдвигается влево на op2 разрядов. Освобождающиеся разряды заполняются выдвигаемыми разрядами.
ROR (циклический сдвиг вправо) op1 ROR op2
Двоичное представление op1 циклически сдвигается вправо на op2 разрядов. Освобождающиеся разряды заполняются выдвигаемыми разрядами.
8. Приоритеты и порядок выполнения операций
Для каждой группы операций в нижеследующей таблице приоритетов операций приоритеты одинаковы. Операции с большим значением приоритета выполняются в первую очередь. Чем выше приоритет группы операций, тем выше она расположена в таблице.
Таблица 1. Приоритеты операций
9 NOT COM
8 * / %
7 + -
6 SHL SHR ROR ROL ASR ASL
5 > >= < <=
4 = <>
3 AND
2 XOR
1 OR
Все операции с одинаковыми приоритетом выполняются справа налево. Можно группировать операции с помощью скобок. Операции в скобках будут выполняться в первую очередь.
9. Арифметические преобразования в выражениях
1. Если операнды в выражениях имеют различный размер (размер операнда зависит от типа, о типах см. ниже), то все результаты операций приводятся к большему размеру.
2. При выполнении присваивания значение выражения преобразуется к размеру переменной, которой оно присваивается.
3. Уменьшение размера значения производится путем отбрасывания старших битов и никаких диагностических сообщений при этом не выводится.
10. Типы языка MCL
Тип - простая переменная:
Простые переменные предназначены для использования в программе там, где не обязательно явное указание размера переменной - управляющие переменные циклов, счетчики и т.п. Описание простой переменной производится с помощью оператора VAR и синтаксис его определяется следующим правилом:
VAR , ... ;
Например:
VAR i,j,simple_var; - описаны три простых переменных.
Простые переменные имеют предопределенный размер 16 битов и интерпретируются как целые без знака. Кроме получения значения простой переменной, возможно получение значения определенного разряда или группы разрядов.
Например:
j - значение переменной j;
j[3..3] - значение 3-го разряда переменной j;
i[0..7] - значение восьми младших разрядов переменной j.
Тип - регистр:
Регистры используются там, где необходимо точно определить размер переменной. Регистры могут иметь произвольный размер в пределах от 1 до 32 разрядов. Описание регистра производится с помощью оператора REG. Синтаксис описания регистров определяется следующим правилом:
REG [ ] , ... ;
Например:
reg ra[8], rb[8], f_zero[1], mul_res[32];
- описаны два восьмиразрядных регистра ra и rb, одноразрядный регистр f_zero и тридцатидвухразрядный регистр mul_res. Константа описывает размерность регистра.
Использование регистров полностью идентично использованию простых переменных. Так же возможно как получение значения всего регистра, так и получение значения его части.
Например:
ra - значение регистра ra; rb[7..7] - значение старшего бита регистра rb;
mul_reg[16..31] - значение старшей половины регистра mul_reg.
Тип - структура:
Структуры могут быть использованы для упрощения доступа к отдельным полям переменных. Они позволяют присваивать группам битов имена. В остальном структуры сохраняют все свойства регистров. Описание структур производится с помощью оператора STRUCT. Синтаксис описания структур определяется следующим правилом:
STRUCT [ ] [],.. ;
Например:
STRUCT rk[32] kop[16], r1[4], m1[4], r2[4], m2[4];
в этом примере описана 32-х разрядная структура rk с полями kop-[0..15], r1[16..19], m1[20..23], r2[24..27], m2[28..31]. Обратите внимание, что выделение полей в структуре производится начиная с младшего бита (т.е. от младших битов к старшим). Использование структур аналогично использованию регистров, но добавляется еще один метод доступа к значению группы бит - с помощью имени поля,
например:
rk - значение структуры rk;
rk[0..15] - значение младшей половины структуры rk;
rk.kop - то же самое, что и в предыдущем примере, но с использованием имени поля.
Тип - память:
Память представляет собой одномерный массив регистров. Ячейки памяти могут, как и регистры, иметь произвольный размер в пределах 1..32 разряда. Максимальный размер памяти 1024 (1K) ячеек. Индексация ячеек производится от 0. Описание памяти производится с помощью оператора MEM. Синтаксис описания памяти определяется следующим правилом:
[] ],...;
Где первая константа определяет количество ячеек в памяти, а вторая - разрядность ячейки.
Например:
MEM mb[32][8] - описана память mb с числом ячеек 32 и с разрядностью ячейки - 8 бит;
MEM ml[1024][32] - описана память ml с числом ячеек 1024 и с разрядностью ячейки 32 бита;
Для доступа к ячейке памяти необходимо после имени памяти задать индекс этой ячейки. Также возможен доступ и к группам битов отдельной ячейки.
Например:
mb[5] - обращение к 6-й ячейке памяти mb (помните, что индексация ячеек начинается с 0);
ml[9,5..5] - обращение к 6-му разряду 10-й ячейки памяти ml;
ml[100,0..15]- обращение к младшей половине 101-й ячейки памяти ml.
11. Переменные языка MCL
Все переменные должны быть обязательно описаны перед ссылкой на них (неявное определение переменных не поддерживается). Максимальное число переменных, которые могут использоваться в программе одновременно составляет 100. Использование большего числа переменных приведет к ошибке. Как уже было отмечено выше, максимальная разрядность регистра или структуры - 32 разряда, а максимальное число ячеек памяти 1024.
12. Операторы языка MCL
Оператор - формат:
один оператор может занимать одну или более строк. Два или большее количество операторов могут находится на одной строке. Каждый оператор должен завершаться точкой с запятой.
Оператор - метка:
метка может стоять перед любым оператором, чтобы на этот оператор можно было перейти с помощью оператора GOTO или GOSUB. Метка состоит из идентификатора за которым стоит двоеточие. Один оператор может иметь несколько меток.
Оператор - присваивание: :=
оператор присваивания имеет следующий формат:
:= ;
Значение выражения вычисляется и присваивается переменной. В качестве переменной может использоваться любая допустимая ссылка на переменную.
Например:
ra:=15+rb/2; ml[1,2..4]:=0b111; mb[3]:=0;
rk.r1:=(ra[0..3]+rb[0..3]) ROL 2;
Оператор - безусловный переход: GOТО
оператор безусловного перехода имеет формат:
GOTO ;
Управление безусловно передается на оператор перед которым
стоит метка .
Оператор - вызов подпрограммы: GOSUB
оператор вызова подпрограммы имеет формат:
GOSUB ;
Управление передается на оператор перед которым стоит метка . Когда будет выполнен оператор RETURN, управление будет возвращено оператору следующему за GOSUB.
Например:
GOSUB SUBR;──────────────────┐ -Вызов ПП
WRITELN "MAIN PROG";<────────┼─┐ -Возврат из ПП
... │ │
... │ │
SUBR:<───────────────────────┘ │
WRITELN "SUBROUTIN"; │
RETURN;────────────────────────┘
Допускается вложение вызовов подпрограмм. Максимальный уровень вложенности - 16.
Оператор - возврат из подпрограммы: RETURN
оператор возврата из подпрограммы имеет формат:
RETURN;
Управление передается на оператор следующий за оператором GOSUB (см. пример выше).
Оператор - условный оператор: IF THEN
условный оператор имеет формат:
IF THEN ;
Сначала вычисляется значение и, если оно не равно 0, то выполняется оператор следующий за THEN. В противном случае выполняется следующий оператор. В качестве можно использовать любое (не обязательно логическое) выражение.
Например:
I:=1;
IF I THEN WRITELN "i<>0";
J:=0; IF I PRINT "I>J"; LBL2: END; Результатом выполнения этой программы будет: I<>0 I>J Оператор - оператор цикла: FOR TO NEXT оператор цикла имеет формат: FOR :=TO; { } NEXT; Переменной с именем присваивается значение , после чего выполняются все операторы до оператора NEXT. После этого к переменной прибавляется 1 и ее значение сравнивается с значением выражения . Если значение переменной больше значения выражения, то выполнение цикла прекращается и управление передается следующему за NEXT оператору, в противном случае опять выполняются все операторы до оператора NEXT и т.д. Допускается использование вложенных циклов. Максимальный уровень вложенности не должен превышать 16. Замечание: после выхода из цикла управляющая переменная имеет значение выражение2>+1 Цикл всегда выполняется хотя бы один раз (даже если больше ) Не рекомендуется для выхода из цикла использовать оператор GOTO, безусловный переход из тела цикла возможен только на конец программы. Например: FOR I:=0 TO 1023; ML[I]:=0; NEXT; Оператор - пауза: PAUSE оператор пауза имеет следующий формат: PAUSE; Этот оператор приостанавливает выполнение программы и выводит на терминал сообщение: "Приостановлено. Нажмите клавишу ENTER..." После нажатия клавиши ENTER выполнение программы возобновляется с оператора, следующего за оператором PAUSE. Оператор - вывод: WRITE WRITELN формат операторов вывода определяется следующими правилами: оператор предназначен для вывода информации на терминал, выводимую информацию можно разделить на две части: пояснительный текст (строки в кавычках) и значения выражений. Допускается три формата вывода значения выражений: - двоичный (спецификатор формата $B), - десятичный (спецификатор формата $D), - шестнадцатеричный (спецификатор формата $H). Указание спецификатора формата и длины поля вывода обязательно! Следующая за спецификатором формата константа определяет размер поля вывода для значения выражения. При выводе значений в двоичной и шестнадцатеричной СС если размер поля больше, чем размер реально выводимого числа, то число дополняется слева нолями. При выводе значений в десятичной СС число дополняется слева пробелами. Если выводимое число больше по размеру, чем выделенное поле, то оно усекается слева. Например: I:=0HFFFF; {I:=65535} WRITE $B32 I {На выходе> 00000000000000001111111111111111} WRITE $B16 I {На выходе> 1111111111111111} WRITE $B8 I {На выходу> 11111111} WRITE $D7 I {На выходе> 65535} WRITE $D5 I {На выходе> 65535} WRITE $D1 I {На выходе> 5} WRITE $H6 I {На выходе> 00FFFF} WRITE $H4 I {На выходе> FFFF} WRITE $H2 I {На выходе> FF} Оператор WRITELN отличается от оператора WRITE тем, что он добавляет к выводимой информации символ перевода на новую строку. Оператор – ввод: READ оператор предназначен для ввода значений любых переменных с терминала. Значения могут вводится в виде констант в любой СС. Вводимые значения автоматически преобразуются к требуемому размеру. Например: READ "A=",A; READ "RK.KOP=",RK.KOP,"RA.LSB=",RA[0..7]; READ "M[I]=",M[I]; Замечание: при вводе числа в десятичной СС допускается указание знака числа. После ввода, число будет автоматически преобразовано в дополнительный код. Оператор - конец программы: END Оператор служит для завершения выполнения программы. Имеет следующий формат: END; В общем случае этот оператор не обязателен (выполнение программы автоматически завершится после выполнения последнего оператора в тексте), но, тем не менее, желательно в любом случае использовать оператор END. Система представляет в распоряжение пользователя три предопределенные переменные-флага: ZF - флаг ноля; NF - флаг отрицательного значения; CF - флаг переноса. Можно сказать, что эти переменные описаны неявным образом как REG ZF[1],NF[1],CF[1]. Операции языка MCL могут изменить значение каждого из флагов. Рассмотрим назначение каждого флага более подробно. Флаг ноля: ZF. Если результат операции равен нолю, то этот флаг устанавливается в 1, в противном случае - 0. Все без исключения операции изменяют значение этого флага. Флаг отрицательного значения: NF. Если старший (знаковый) бит результата операции равен единице, то этот флаг устанавливается в 1, в противном случае - в 0. При определении значения этого флага учитывается длина операндов выполняемой операции. Все без исключения операции изменяют значение этого флага. Флаг переноса: CF. Этот флаг устанавливается в 1, если при выполнении операции сложения или вычитания возникает перенос из старшего разряда результата. В противном случае этот флаг устанавливается в 0. При определении значения этого флага учитывается длина операндов выполняемой операции. Логические операции (, =, <>, >=, <=, AND, OR, XOR, NOT) безусловно устанавливают этот флаг в 0. Операции сдвига помещают в этот флаг значение последнего "выдвигаемого" разряда. Замечание: следует четко понимать, что значение флагов изменяют именно операции, а оператор присваивания никакого влияния на флаги не оказывает. Т.e при выполнении оператора RA:=RB; значения флагов изменены не будут (поскольку не выполнялась ни одна операция), а при выполнении оператора M[I+1]:=0; значения флагов могут быть изменены, так как при вычислении индекса выполняется операция +. При написании программ на языке MCL рекомендуется следующая структура построения программы: {Описание переменных} VAR ... REG ... MEM ... STRUCT ... {Тело главной программы} ... END {Конец главной программы} SUB1: {Подпрограмма 1} ... RETURN { Конец подпрограммы 1} ... {Определение других подпрограмм} SUBN: {Подпрограмма N} ... RETURN {Конец подпрограммы N} То есть, сначала описываются все переменные. После описания переменных располагаются операторы основной программы, которые завершаются оператором END. А затем идут операторы используемых подпрограмм. Безусловно, такая структура построения программ не является догмой, но она является наиболее простой для восприятия, и способствует большей ясности программы. В случае обнаружения шибки, интерпретация программы прекращается и выдается сообщение вида: ! ERROR ! в строке номер: Ниже приведен полный список сообщений об ошибках, распознаваемых интерпретатором языка MCL. При необходимости даются дополнительные пояснения. Синтаксическая ошибка - неизвестный символ. При интерпретации программы встретился неизвестный интерпретатору символ. Слишком длинное имя. Превышена максимальная длина идентификатора (16 символов). Слишком длинное число. Превышена максимальная длина числа (32 символа). Нет закрывающей кавычки в строке. В строке вывода оператора WRITE(LN) не найдена закрывающая кавычка. Строка вывода не может содержать символ перевода каретки. Не найден конец комментария. Не найден символ '}', ограничивающий комментарий. Слишком много меток. В программе используется слишком много меток. Максимальное число меток, которое может быть использовано в программе - 100. Повторное определение меток. В программе используются метки с одинаковыми именами. Все метки должны иметь уникальные имена. Неопределенная метка. В программе используется ссылка на неопределенную метку. Слишком много вложенных циклов. В программе используется слишком глубокое вложение циклов. Максимальный уровень вложенности циклов - 16. Слишком много вложенных вызовов ПП. В программе используется слишком глубокое вложение вызовов подпрограмм. Максимальный уровень вложенности вызовов подпрограмм - 16. Команда NEXT без команды FOR. Команда RETURN без команды GOSUB. Слишком много переменных. В программе используется слишком много переменных. Максимальное число переменных в программе - 100. Повторное определение переменной. Попытка описать переменную, имя которой совпадает с именем уже описанной переменной. Все переменные должны иметь уникальные имена. Неопределенная переменная. В программе используются обращения к неописанным переменным. Неверный размер памяти. Про описании переменной типа "память" используется слишком большое значение числа ячеек. Максимально допустимое значение числа ячеек - 1024. Неверная разрядность регистра. При описании переменной типа регистр, структура или память используется слишком большое значение разрядности регистра. Максимально допустимое значение разрядности регистра - 32. Неверный размер полей структуры. При описании переменной типа структура суммарный размер полей структуры больше размера самой переменной. Слишком большой индекс. При обращении к переменной типа "память" значение индекса ячейки памяти превышает количество ячеек указанное при описании переменной. Неверное использование индекса или имени поля. Попытка использовать индекс или имя поля при обращении к простой переменной или регистру. Неопределенное имя поля. При обращении к переменной типа структура используется неопределенное имя поля. Диапазон превышает размеры переменной. При обращении к диапазону переменной указанный размер диапазона превышает размер переменной. Некорректное выражение. Слишком сложное выражение. Слишком много операндов в выражении. Непарная скобка. Неверный тип управляющей переменной цикла. Управляющая переменная цикла не может быть переменной типа "память". Неверный спецификатор формата. Допустимы значения B,D,H. Неверная длина поля в спецификаторе формата. Допустимы значения 1..32. Требуется "THEN". Требуется имя переменной памяти. Требуется имя простой переменной (типа VAR,REG или STRUCT). Требуется ".." или "," или "]". Требуется "..". Требуется ":=". Требуется "TO". Требуется "," или ";". Требуется "[". Требуется "]". Требуются идентификатор или команда. Требуется ":" или ":=". Требуется ";". Требуется идентификатор. Требуется константа. Требуется индекс. Аннотация. Приведен цикл лабораторных работ по изучению принципов функционирования арифметико-логических устройств. Особое внимание уделено представлению чисел с фиксированной запятой в прямом, обратном и дополнительном коде, способам определения переполнения, моделированию функционирования арифметико-логического устройства при выполнении операций сложения/вычитания, умножения и деления чисел с фиксированной запятой, рассмотрены примеры выполнения указанных арифметических операций. Работы рассчитаны на самостоятельное выполнение студентами задания. В конце каждой работы приводится перечень вариантов заданий. Учебное пособие предназначено для студентов, обучающихся по специальностям, связанным с разработкой и применением вычислительных систем. Цель работы___________________________________________________________________________ 23 Функционирование АЛУ при выполнении операции сложения/вычитания___________________ 23 Моделирование функционирования АЛУ при выполнении операции сложения с использованием обратного кода__________________________________________________ 23 Моделирование функционирования АЛУ при выполнении операции сложения с использованием дополнительного кода____________________________________________ 24 Алгоритм алгебраического сложения/вычитания двоичных чисел___________________________25 Пример выполнения операции сложения__________________________________________________28 Контрольные вопросы__________________________________________________________________ 32 Содержание отчета______________________________________________________________________32 Задание к лабораторной работе___________________________________________________________32 изучение работы арифметико-логического устройства при выполнении операции сложения/вычитания двоичных чисел с фиксированной запятой при использовании модифицированного кода для определения переполнения разрядной сетки. Операция сложения/вычитания выполняется в арифметико-логическом устройстве (АЛУ). Операция сложения/вычитания двоичных чисел с фиксированной запятой может быть выполнена с использованием прямого, обратного и дополнительного кода для представления слагаемых. Операция вычитания в ЭВМ заменяется операцией сложения при использовании обратного и дополнительного кода. Отрицательные числа представляются в обратном и дополнительном кодах. Чтобы получить обратный код отрицательного двоичного числа, необходимо значащие разряды проинвертировать, а в знаковый разряд поставить 1. При выполнении алгебраического суммирования с использованием обратного кода положительные числа представляются в прямом коде, отрицательные числа – в обратном и производится суммирование кодов чисел, включая знаковые разряды. При возникновении 1 переноса из знакового разряда она подсуммируется к младшему разряду результата. Если знаковый разряд результата равен 0, то результат положительный и представлен в прямом коде. Если знаковый разряд результата равен 1, то результат отрицателен и представлен в обратном коде. Рассмотрим на примере выполнение алгебраического суммирования чисел с фиксированнной точкой с использованием обратного кода. В качестве слагаемых возьмем 5-разрядные числа (4 информационных разряда и 1 разряд – знаковый): А=510, В=410. В двоичной системе счисления прямой код числа: Апр=00101, Впр=00100, и обратный код числа: Аобр=11010, Вобр=11011. Пример 1. Рассмотрим операцию алгебраического сложения: С=А+(-В). В двоичной системе счисления положительные числа представляется в прямом коде, а отрицательные – в обратном. Следовательно, Апр=00101 и Вобр=11011. Производим операцию сложения: Зн. Инф. разр. 0 0101 1 1011 1 0 0000 1 единица переноса подсуммируется к младшему разряду 0 0001 В знаковом разряде результата 0, следовательно, результат положительный и представлен в прямом коде. Пример 2. Рассмотрим операцию алгебраического сложения: С=(-А)+В. В двоичной системе счисления положительные числа представляется в прямом коде, а отрицательные – в обратном. Следовательно, Аобр=11010 и Впр=00100. Производим операцию сложения: Зн. Инф. разр. 1 1010 0 0100 1 1110 В знаковом разряде результата 1, следовательно, результат отрицательный и представлен в обратном коде. Прямой код результата Спр=10001(2)=-1(10). Чтобы получить дополнительный код отрицательного двоичного числа, необходимо значащие разряды проинвертировать, к младшему разряду прибавить 1 и в знаковый разряд поставить 1. При выполнении алгебраического суммирования с использованием дополнительного кода положительные числа представляются в прямом коде, отрицательные числа – в дополнительном и производится суммирование кодов чисел, включая знаковые разряды. При возникновении 1 переноса из знакового разряда она отбрасывается. Если знаковый разряд результата равен 0, то результат положительный и представлен в прямом коде. Если знаковый разряд результата равен 1, то резулльтат отрицателен и представлен в дополнительном коде. Рассмотрим на примере выполнение алгебраического суммирования чисел с фиксированнной точкой с использованием дополнительного кода. В качестве слагаемых возьмем 5-разрядные числа (4 информационных разряда и 1 разряд – знаковый): А=510, В=410. В двоичной системе счисления прямой код числа: Апр=00101, Впр=00100, и дополнительный код числа: Адоп=11011, Вдоп=11100. Пример 3. Рассмотрим операцию алгебраического сложения: С=А+(-В). В двоичной системе счисления положительные числа представляется в прямом коде, а отрицательные – в дополнительном. Следовательно, Апр=00101 и Вдоп=11100. Производим операцию сложения: Зн. Инф. разр. 0 0101 1 1100 0 0001 единица переноса отбрасывается В знаковом разряде результата 0, следовательно, результат положительный и представлен в прямом коде. Пример 4. Рассмотрим операцию алгебраического сложения: С=(-А)+В. В двоичной системе счисления положительные числа представляется в прямом коде, а отрицательные – в дополнительном. Следовательно, Адоп=11011 и Впр=00100. Производим операцию сложения: Зн. Инф. разр. 1 1011 0 0100 1 1111 В знаковом разряде результата 1, следовательно, результат отрицательный и представлен в дополнительном коде. Прямой код результата Спр=10001(2)=-1(10). В ЭВМ отрицательные числа с фиксированной точкой в памяти хранятся либо в обратном, либо в дополнительном коде. В настоящее время наиболее часто используется дополнительный код, поэтому в лабораторной работе рассматривается алгоритм алгебраического сложения/вычитания двоичных чисел с фиксированной запятой при использовании дополнительного кода для представления слагаемых. с фиксированной запятой при использовании дополнительного кода для представления слагаемых. Алгоритм алгебраического сложения/вычитания двоичных чисел с фиксированной запятой при использовании дополнительного кода для представления слагаемых. Выполнение операции вычитания сводится к выполнению операции сложения с отрицательным вторым слагаемым, поэтому рассмотрим алгоритм выполнение операции сложения. Если слагаемое положительно, то прямой код слагаемого совпадает с дополнительным кодом. Поэтому при выполнении операции сложения положительные слагаемые представляются в прямом коде, а отрицательные – в дополнительном. Производится сложение двоичных кодов, включая разряды знаков. Для отслеживания переполнения существует 2 основных метода: по наличию и отсутствию переноса; использование модифицированного кодирования. В первом случае, если возникает перенос из знакового разряда суммы при отсутствии переноса в этот разряд или перенос в знаковый разряд при отсутствии переноса из разряда знака, то имеется переполнение разрядной сетки. Если нет переносов из знакового разряда и в знаковый разряд суммы или есть оба переноса, то переполнения нет. При этом, если знаковый разряд суммы равен 0, то сумма положительна, если 1, то сумма отрицательна и представлена в дополнительном коде. Во втором случае для представления знака отводится два или более разрядов. В случае использования двух знаковых разрядов комбинация 00 позволяет сделать вывод о том, что результат получился положительным, 11 – отрицательным, 10 или 01 – переполнение. Ниже на примерах демонстрируется анализ переполнения по наличию и отсутствию переносов. В лабораторной работе для отслеживания переполнения должно быть использовано модифицированное кодирование. Пример 5. Рассмотрим пример операции сложения: С=А+В. В качестве слагаемых возьмем 5-разрядные числа (4 информационных разряда и 1 разряд – знаковый): А=11, В=-4. В двоичной системе счисления положительные числа представляется в прямом коде, а отрицательные – в дополнительном. Следовательно, А=01011 и В=11100. Производим операцию сложения: Зн. Инф. разр. 0 1011 1 1100 0 0111 Переполнения разрядной сетки не было, так как был перенос и в знаковый разряд, и из знакового разряда. Так как знак результата равен 0, то получаем положительный результат в прямом коде С=00111(2)=7(10). Пример 6. Рассмотрим пример операции вычитания: С=А-В. В качестве уменьшаемого и вычитаемого возьмем 5-разрядные числа (4 информационных разряда и 1 разряд – знаковый): А=11(10)=01011(2), В=-6(10)=11010(2). Для выполнения операции вычитания берем дополнительный код вычитаемого. Получаем, что В=00110. Производим операцию сложения: Зн. Инф. разр. 0 1011 0 0110 1 0001 Так как был перенос в знаковый разряд, и не было переноса из знакового разряда, то произошло переполнение разрядной сетки. Моделирование функционирования АЛУ. Структурная схема АЛУ показана на рис. 5. Рис. 5. Структурная схема АЛУ Из оперативной памяти по входной информационной шине Швх в регистр RA поступает первое слагаемое/уменьшаемое А и в регистр RB – второе слагаемое/вычитаемое. В случае операции сложения второй операнд переписывается в регистр R1 без изменения. Если выполняется операция вычитания, то операнд переписывается в регистр R1 в обратном коде. Далее, в случае операции сложения происходит суммирование операндов, а в случае операции вычитания – суммирование с добавлением 1. Результат операции записывается в регистр суммы RC и выдается из АЛУ в оперативную память по выходной информационной шине Швых. Для того, чтобы отследить переполнение разрядной сетки, пpи выполнении операции сложения/вычитания используется модифицированный код. Под него отводится девять разрядов: семь информационных и два знаковых. После выполнения операции производится анализ знаковых разрядов, если их значения совпадают - переполнения нет, а если значения различны - было переполнение. Таким образом, алгоритм выполнения операции сложения/вычитания заключается в следующем: ввод операндов; дешифрация кода операции; в случае операции сложения: сложение операндов; в случае операции вычитания: представление вычитаемого в обратном коде и сложение операндов с добавлением 1; проверка на переполнение разрядной сетки результата; вывод результата. Блок-схема выполнения операции сложения/вычитания показана на рис. 6. На примере рассмотрим выполнение операции сложения. В качестве Швх и Швых выступают входные восьмиразрядные регистры INPA и INPB, в которые вводятся операнды. Так как переполнение отслеживается с помощью модифицированных кодов, то регистры операндов RA и RB девятиразрядные. Рис. 6. Блок-схема выполнения операции сложения/вычитания Текст программы: writeln "**************************************************"; writeln "* Моделирование алгоритма сложения *"; writeln "**************************************************"; REG RA[9],RB[9],R1[9],RC[9],INPA[8],INPB[8],Z[9]; start: write "A=";read INPA; write "B=";read INPB; RA:=INPA; RA[8..8]:=INPA[7..7]; RB:=INPB; RB[8..8]:=INPB[7..7]; writeln "RA=",$B9 RA; writeln "RB=",$B9 RB; writeln "Сложение (A+B):"; R1:=RB; RC:=RA+R1; writeln "R1=",$B9 R1; writeln "RC=",$B9 RC; IF RC[8..8]<>RC[7..7] THEN writeln "!!! Переполнение разрядной сетки !!!"; IF (RC[8..8]=RC[7..7]) AND (RC[8..8]=0) THEN writeln "Результат Z=",$B9 RC,"=",$D3 RC; IF (RC[8..8]=RC[7..7]) AND (RC[8..8]=1) THEN GOSUB WREZ; writeln "***************** Конец программы ****************"; END; WREZ: Z:=COM(RC); Z[8..8]:=1; write "Результат Z= ",$B9 Z,"=-"; Z[8..8]:=0; writeln $D3 Z; RETURN; Результат работы программы Рис. 7. Получение положительного результата ************************************************** * Моделирование алгоритма сложения * ************************************************** A=3 B=6 RA=000000011 RB=000000110 Сложение (A+B): R1=000000110 RC=000001001 Результат Z=000001001= 9 ***************** Конец программы **************** Содержимое таблицы переменных 00 Переменная: ZF типа регистр; разрядность 1 бит; значение = 1 01 Переменная: NF типа регистр; разрядность 1 бит; значение = 0 02 Переменная: CF типа регистр; разрядность 1 бит; значение = 0 03 Переменная: RA типа регистр; разрядность 9 бит; значение = 3 04 Переменная: RB типа регистр; разрядность 9 бит; значение = 6 05 Переменная: R1 типа регистр; разрядность 9 бит; значение = 6 06 Переменная: RC типа регистр; разрядность 9 бит; значение = 9 07 Переменная: INPA типа регистр; разрядность 8 бит; значение = 3 08 Переменная: INPB типа регистр; разрядность 8 бит; значение = 6 09 Переменная: Z типа регистр; разрядность 9 бит; значение = 0 В случае получения отрицательного результата: Рис. 8. Получение отрицательного результата ************************************************** * Моделирование алгоритма сложения * ************************************************** A=28 B=-37 RA=000011100 RB=111011011 Сложение (A+B): R1=111011011 RC=111110111 Результат Z= 100001001=- 9 ***************** Конец программы **************** Содержимое таблицы переменных 00 Переменная: ZF типа регистр; разрядность 1 бит; значение = 0 01 Переменная: NF типа регистр; разрядность 1 бит; значение = 0 02 Переменная: CF типа регистр; разрядность 1 бит; значение = 0 03 Переменная: RA типа регистр; разрядность 9 бит; значение = 28 04 Переменная: RB типа регистр; разрядность 9 бит; значение = 475 05 Переменная: R1 типа регистр; разрядность 9 бит; значение = 475 06 Переменная: RC типа регистр; разрядность 9 бит; значение = 503 07 Переменная: INPA типа регистр; разрядность 8 бит; значение = 28 08 Переменная: INPB типа регистр; разрядность 8 бит; значение = 4294967259 09 Переменная: Z типа регистр; разрядность 9 бит; значение = 9 В случае переполнения: Рис. 9. Переполнение ************************************************** * Моделирование алгоритма сложения * ************************************************** A=14 B=125 RA=000001110 RB=001111101 Сложение (A+B): R1=001111101 RC=010001011 !!! Переполнение разрядной сетки !!! ***************** Конец программы **************** Содержимое таблицы переменных 00 Переменная: ZF типа регистр; разрядность 1 бит; значение = 1 01 Переменная: NF типа регистр; разрядность 1 бит; значение = 0 02 Переменная: CF типа регистр; разрядность 1 бит; значение = 0 03 Переменная: RA типа регистр; разрядность 9 бит; значение = 14 04 Переменная: RB типа регистр; разрядность 9 бит; значение = 125 05 Переменная: R1 типа регистр; разрядность 9 бит; значение = 125 06 Переменная: RC типа регистр; разрядность 9 бит; значение = 139 07 Переменная: INPA типа регистр; разрядность 8 бит; значение = 14 08 Переменная: INPB типа регистр; разрядность 8 бит; значение = 125 09 Переменная: Z типа регистр; разрядность 9 бит; значение = 0 Особенности выполнение операции сложения/вычитания чисел с фиксированной запятой при использовании обратного и дополнительного кодирования. Методы определения переполнения. Состав и назначение основных регистров АЛУ для выполнения операции сложения/вычитания чисел с фиксированной запятой. Формулировка задания. Структурная схема АЛУ для выполнения операции сложения/вычитания чисел с фиксированной запятой при использовании дополнительного кода для представления слагаемых. Блок-схема выполнения операции сложения/вычитания чисел с фиксированной запятой при использовании дополнительного кода для представления слагаемых. Программа на языке MCL, моделирующая выполнение операции сложения/вычитания чисел с фиксированной запятой при использовании дополнительного кода для представления слагаемых. Результаты выполнения программы в виде распечатки содержимого поля для вывода текстовой информации и скриншота (как показано в примере на рис. 7, 8, 9) в момент завершения выполнения программы. Промоделировать работу АЛУ при выполнении команд сложения/вычитания в соответствие с вариантом задания. Варианты задания представлены в таблице 1. Рекомендуется использовать следующие обозначения: I-код операции: 0-сложение 1-вычитание INPA,INPB-регистры для ввода операндов; RA-первый операнд АЛУ; RВ-второй операнд АЛУ; R1-второй операнд в обратном коде; RC-результат операции в АЛУ. При моделировании использовать девятиразрядные регистры, т.к. используются модифицированные коды. Регистры INPA, INPB – восьмиразрядные. При моделировании должно быть отслежено переполнение (используются модифицированные коды). Вывести на печать содержимое всех регистров в двоичной системе счисления, исходные данные и результат – в двоичной и десятичной системе счисления. Таблица 1. Варианты задания для моделирования операции сложения/вычитания № варианта Первый операнд Второй операнд Операция 1 -25 7 75 40 25 59 + - + 2 -45 5 100 10 45 30 + - + 3 -30 6 89 7 30 60 + - + 4 22 -22 90 -9 -8 -38 + - + 5 73 -73 67 -13 -10 -93 + - + 6 46 -46 -57 -17 -23 -73 + - + 7 27 10 92 17 27 -43 + - - 8 70 11 94 19 70 -45 + - - 9 28 14 103 16 28 -34 + - - 10 68 25 98 17 68 -55 + - - 11 16 -16 -105 -70 17 70 + - - 12 26 -26 -28 -28 15 117 + - - 13 -24 5 65 40 25 63 + - + 14 -43 6 99 10 45 30 + - + 15 -32 5 88 7 30 60 + - + 16 20 -19 95 -9 -8 38 + - + 17 61 -63 -77 -13 -10 -93 + - + 18 46 -46 -57 -17 -23 -73 + - + 19 25 11 -87 17 27 -43 + - - 20 68 10 -92 19 70 -45 + - - 21 27 -13 -102 -16 28 -34 + - - 22 58 23 -96 17 68 -55 + - - 23 15 -15 -104 -70 17 70 + - - 24 25 -25 -26 -28 15 -117 + - - Цель работы___________________________________________________________________________ 36 Функционирование АЛУ при выполнении операции умножения_____________________________36 Моделирование функционирования АЛУ при выполнении операции умножения двоичных чисел,представленных в прямом коде________________________________________ 36 Моделирование функционирования АЛУ при выполнении операции умножения двоичных чисел, представленных в дополнительном коде_______________________________ 39 Алгоритм выполнения операции умножения двоичных чисел_______________________________ 40 Пример выполнения операции умножения________________________________________________ 42 Контрольные вопросы__________________________________________________________________ 45 Содержание отчета______________________________________________________________________45 Задания к лабораторной работе__________________________________________________________ 46 изучение работы арифметико-логического устройства при выполнении операции умножения над числами с фиксированной запятой. В каждом цикле выполнения операции умножения анализируется очередная цифра множителя. Если очередная цифра множителя равна 1, то к сумме частичных произведений прибавляется множимое, в противном случае прибавляется нуль. Цикл завершается сдвигом множимого относительно суммы частичных произведений либо сдвигом суммы частичных произведений относительно неподвижного множимого. Таким образом, выполнение операции умножения в АЛУ сводится к последовательности операций сложения и сдвига. В случае отрицательного операнда при умножении чисел, представленных в прямом коде, операция умножения сводится к выполнению следующих этапов: определение знака произведения путем сложения по модулю 2 знаковых разрядов множимого и множителя; обнуление знаковых разрядов отрицательных операндов; выполнение операции умножения чисел, представленных в прямом коде. Существует четыре способа умножения чисел с фиксированной точкой. При выполнении операции умножения можно сдвигать либо множимое, либо промежуточный результат и начинать анализ множителя либо с младших разрядов, либо со старших. Соответственно различают четыре структуры АЛУ для этой операции. Рассмотрим указанные способы умножения чисел с фиксированной точкой. Умножение чисел, представленных в прямом коде, начиная с младших разрядов множителя, со сдвигом суммы частичных произведений вправо и при неподвижном множимом. Пример 1. Рассмотрим пример выполнения операции умножения: С=А*В, где А=14(10)=01110(2), В=4(10)=00100(2). При выполнении операции умножения будем сдвигать сумму частичных произведений вправо и анализировать разряды множителя, начиная с младшего разряда. Для простоты будем работать на 5-разрядной сетке (4 информационных разряда, 1 знаковый разряд). Множитель Зн. Информ. разряды 4-й 3-й 2-й 1-й 0-й 0 0 1 0 0 Зн. Информ. разряды Описание действий 0 1110 Множимое (мн-ое) 0 0100 Множитель (мн-ль) 0 0000 -> Сумма частичных произведений (СЧП) 0 0000 0 -> Сдвиг СЧП на 1 разряд вправо (0-й разряд множителя =0) +0 0000 00 Сдвиг СЧП на 1 разряд вправо (1-й разряд множителя =0) 0 1110 Множимое 0 1110 00 -> СЧП (2-й разряд множителя =1) 0 0111 000 -> Сдвиг СЧП на 1 разряд вправо 0 0011 1000 -> Сдвиг СЧП на 1 разряд вправо (3-й разряд множителя =0) 0 0001 11000 Сдвиг СЧП на 1 разряд вправо (4-й разряд множителя =0) Знак результата формируется операцией сложения по модулю 2 знаков множимого и множителя: Z=00=0. Результат С=0000111000(2)=56(10). Умножение чисел, представленных в прямом коде, начиная с младших разрядов множителя, со сдвигом множимого влево и при неподвижной сумме частичных произведений. Пример 2. Рассмотрим пример выполнения операции умножения: С=А*В, где А=11(10)=01011(2), В=-5(10)=10101(2). Числа представлены в прямом коде. При выполнении операции умножения будем сдвигать множимое влево и анализировать разряды множителя, начиная с младшего разряда. Для простоты будем работать на 5-разрядной сетке (4 информационных разряда, 1 знаковый разряд). Множитель Зн. Информац. разряды 4-й 3-й 2-й 1-й 0-й 0 0 1 0 1 Информ. разряды Описание действий 01011 Множимое 00101 Множитель + 00000 Сумма частичных произведений, 0-ой разряд множителя =1 01011 Множимое + 01011 СЧП, Сдвиг мн-ого на 1 разряд влево, 1-й разряд множителя =0 0 0000 +0 01011 СЧП, Сдвиг мн-ого на 1 разряд влево, 2-й разряд множителя =1 01 011 Сдвинутое множимое +01 10111 СЧП, Сдвиг мн-ого на 1 разряд влево, 3-й разряд множителя =0 000 00 +001 10111 СЧП, Сдвиг мн-ого на 1 разряд влево, 4-й разряд множителя =0 0000 0 0001 10111 Результат операции умножения Знак результата формируется операцией сложения по модулю 2 знаков множимого и множителя: Z=01=1. Результат С=1000110111(2)=-55(10). Умножение чисел, представленных в прямом коде, начиная со старших разрядов множителя, со сдвигом суммы частичных произведений влево и при неподвижном множимом. Пример 3. Рассмотрим пример выполнения операции умножения: С=А*В, где А=13(10)=01101(2), В=9(10)=01001(2). При выполнении операции умножения будем сдвигать сумму частичных произведений влево и анализировать разряды множителя, начиная со старшего разряда. Для простоты будем работать на 5-разрядной сетке (4 информационных разряда, 1 знаковый разряд). Множитель Зн. Информац. разряды 4-й 3-й 2-й 1-й 0-й 0 1 1 0 1 Информ. разряды Описание действий 01101 Множимое 01001 Множитель <- 00000 СЧП, 4-ый разряд множителя =0 +0 00000 Сдвиг СЧП на 1 разряд влево, 3-й разряд множителя =1 01101 Множимое <-0 01101 Сумма частичных произведений +00 11010 Сдвиг СЧП на 1 разряд влево, 2-й разряд множителя =0 00000 <-00 11010 Сумма частичных произведений +001 10100 Сдвиг СЧП на 1 разряд влево, 1-й разряд множителя =0 00000 <-001 10100 Сумма частичных произведений +0011 01000 Сдвиг СЧП на 1 разряд влево, 0-й разряд множителя =1 01101 Множимое 0011 10101 Результат операции умножения Знак результата формируется операцией сложения по модулю 2 знаков множимого и множителя: Z=00=0. Результат С=0001110101(2)=117(10). Умножение чисел, представленных в прямом коде, начиная со старших разрядов множителя, со сдвигом множимого вправо и при неподвижной сумме частичных произведений. Пример 4. Рассмотрим пример выполнения операции умножения: С=А*В, где А=11(10)=01011(2), В=15(10)=01111(2). Числа представлены в прямом коде. При выполнении операции умножения будем сдвигать множимое вправо и анализировать разряды множителя, начиная со старшего разряда. Для простоты будем работать на 5-разрядной сетке (4 информационных разряда, 1 знаковый разряд). Множитель Зн. Информац. разряды 4-й 3-й 2-й 1-й 0-й 0 1 1 1 1 13. Переменные-флаги
14. Общие замечания
15. Сообщения об ошибках интерпретатора языка MCL
Арифметико-логические устройства ЭВМ и принципы их функционирования
Лабораторная работа № 1. Моделирование функционирования АЛУ при выполнении операции сложения/вычитания над числами с фиксированной точкой
Содержание
Цель работы
Функционирование АЛУ при выполнении операции сложения/вычитания
Моделирование функционирования АЛУ при выполнении операции сложения с использованием обратного кода
Моделирование функционирования АЛУ при выполнении операции сложения с использованием дополнительного кода
Алгоритм алгебраического сложения/вычитания двоичных чисел
Пример микропрограммы выполнения операции сложения
Контрольные вопросы
Содержание отчета
Задание к лабораторной работе
Лабораторная работа № 2. Моделирование функционирования АЛУ при выполнении операции умножения над числами с фиксированной точкой
Содержание
Цель работы
Функционирование АЛУ при выполнении операции умножения
Алгоритм умножения двоичных чисел с фиксированной запятой, представленных в прямом коде














