Арифметические основы вычислительных машин

Автор работы: Пользователь скрыл имя, 04 Сентября 2014 в 13:43, реферат

Описание работы

Все компьютеры используют для хранения информации двоичную систему. Это значит, что каждый элемент хранимой информации может иметь только два состояния. Эти состояния обозначаются как «включен» и «выключен», «истина» и «ложь», или «1» и «0». Как правило, компьютер использует эти значения в виде уровней напряжения.
Из-за двоичного представления данных компьютеры используют в своих вычислениях арифметику с двоичным основанием. Используя простейшие числа 0 и 1, можно выполнять очень сложные вычисления.

Файлы: 1 файл

Архитектура компьютера и принципы его работы.doc

— 1.02 Мб (Скачать файл)
  1. Поместить число по  известному адресу

MOV  [BX], 5050H

Поместить в память по адресу 0133h значение 5050h. В этом случае операндом источником будет число, находящееся непосредственно в команде, а операндом источником – адрес.

Логические команды выполняют над операндами логические (побитовые) операции (для тех, кто забыл, что такое логические операции, информация по ним приведена в приложении), то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Среди логических команд можно назвать логическое И, логическое ИЛИ, исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и формируют они один выходной операнд.

Пример  логической команды

Применить побитовое исключающее или к операндам обозначающий один и тот же регистр:

XOR  EAX,EAX

Самый быстрый для процессора способ обнулить регистр EAX (если операнды одинаковые, то на выходе в любом случае будет 0).

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

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

Чаще всего нас интересует флаг нуля (ZF – Zero Flag), который включается, когда в результате действия команды переменная обнуляется. Другим часто используемым флагом является флаг знака (SF – Sign Flag), который показывает что переменная, установленная в результате действия команды,  будет положительна. Все арифметические и некоторые другие команды меняют флаги, т.е. мы всегда знаем, что получилось в результате (операнд приемник содержит нуль, положительное или отрицательное число и т.д.)

Вернемся к условным и безусловным переходам.

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

 

Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Несколько примеров команд условных переходов:

  • переход, если равно нулю;
  • переход, если больше нуля;
  • переход, если меньше или равно нулю.

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

Примеры  команд пересылки данных

  1. Если в результате предыдущей операции получаем нуль, перейти к  известной ячейке (по известному смещению):

JZ 40h

Если результат предыдущей операции равен нулю переходим к инструкции, которая находится добавлением к текущему адресу 40h.

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

JMP [BX + SI]

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

 

Пример простой программы 1 (использование команд пересылки данных и арифметических)

Рассмотрим, во что (в какие машинные команды) превратится в памяти компьютера очень простая программа на паскале.

Итак, программа следующая:

var ia,ib,ic : Smallint;

 

begin

  ia := 5;

  ib := 3;

  ic := ia + ib;

end; 

 

В этой программе мы объявляем (резервируем в памяти) три переменных занимающих два байта (16 разрядов) каждая – в паскале этот тип называется  Smallint. В теле программы первой переменной присваивается 5, второй – 3, а третьей  – 5 + 3. Покажем результат трансляции этой программы в последовательность машинных инструкций (См рис. …)

 

Рисунок Результат трансляции программы 1

Рассмотрим результат трансляции построчно.

 

  1. Первая стока (как и все прочие) состоит из трех частей

0044C878   66С705D8FB440005   mov word ptr  [ia], $0005



 

 

Итак, первая группа из восьми шестнадцатеричных цифр представляет собой адрес, по которому располагается команда, в нашем случае адрес первой команды будет равен 0044C878h. (Почему в адресе указываются именно восемь позиций для шестнадцатеричных цифр, разберем в дальнейшем).

Вторая группа является собственно цифровым представлением машинной инструкции. Как видно, эта инструкция занимает в памяти восемь байт. (Напоминаю, что один байт записывается в две шестнадцатеричных позиции.)  Необходимо обратить внимание, что в этом коде присутствуют оба операнда, операнд приемник (адрес переменой ia – 0044FBD8h) и операнд источник (число 5 – 0005).

Третья группа является символьным представлением инструкции. MOV – имя команды пересылки данных. word ptr – не команда, это лишь определитель размера данных, он показывает, что мы будем пересылать машинное слово, то есть шестнадцатиразрядное число (напоминаю, что переменная типа Smallint занимает 16 байт). [ia] это операнд приемник – адрес переменной ia. $0005 – операнд источник (символ $ означает что используется шестнадцатеричная система счисления).

В результате исполнения этой инструкции число 5 будет перемещено по адресу переменной ia, что полностью соответствует первой строке нашей программы  

ia := 5;

  1. Вторая строка имеет вид:

0044C881   66С705DAFB440003   mov word ptr  [ib], $0003

Это инструкция расположена по адресу 0044C881 (обратим внимание, что этот адрес на восемь больше чем адрес первой инструкции). В результате исполнения этой инструкции число 3 будет перемещено по адресу переменной ib, что соответствует второй строке нашей программы.

  1. Третья строка имеет вид:

0044C88A   66A1D8FB4400   mov ax, [$0044fbd8]

Здесь данные, находящиеся по адресу 0044fbd8h (это адрес переменной ia, в которой сейчас находится число 5) перемещаются в регистр AX.

  1. Четвертая строка:

0044C890   660305DAFB4400   add ax, [ib]

К содержимому регистра AX добавим данные, находящиеся по адресу переменной ib (в переменную ib было помещено число 3).

Пятая строка содержит:

  1. 0044C897   66A3DСFB4400   mov [$0044fbdс], ax

В результате исполнения этой инструкции содержимое регистра AX (там храниться результат сложения) будет перемещено по адресу 0044FBDСh, это адрес переменной iс. Третья, четвертая и пятая машинная команды соответствуют третьей строке исходной программы:

ic := ia + ib;

 

Пример простой программы 2 (использование команд переходов)

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

var ia,ib,ic : Smallint;

Сама программа имеет вид:

begin

  for ia := 0 to 4 do

     ib := ib + ia;

end;

 

Т.е. мы организуем цикл по переменной ia, которая меняется от 0 до 4, в цикле к переменной ib добавляем текущее значение ia (выполняем это пять раз). Результат трансляции этой программы показан на рис. …

Рисунок Результат трансляции программы 2

 

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

  1. Первая строка обеспечивает начальное присвоение переменной ia нулю:

004D998  mov word ptr [ia], $0000

В результате исполнения этой инструкции по адресу переменной ia будет занесен 0. Напоминаем, что определитель размера данных word ptr показывает, что мы работаем с шестнадцатиразрядным числом.

  1. Во второй строке готовимся выполнять сложение

004D9A1  mov ax, [$00450bd8]

Содержимое переменной ia, находящейся по адресу 00450BD8h, скопируем в регистр ax, при помощи которого будет производиться суммирование.

  1. Третья строка выполняет непосредственное сложение

004D9A7  add [ib], ax

К содержимому находящемуся по адресу ib добавляем содержимое регистра  ax (напоминаем, что в этот регистр было помещено значение находящееся в ia). Таким образом эта инструкция соответствует следующей строке программы    

ib := ib + ia;

 

  1. Четвертая строка обеспечивает увеличение переменой ia в цикле на единицу:

004D9AE  inc [ia]

Команда inc обеспечивает приращение на единицу данных по адресу переменной ia.

  1. Пятая строка нужна для сравнения содержимого переменой ia с конечным значением параметра цикла:

 004D9B5  cmp  word ptr [ib], $05

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

  1. Шестая инструкция завершает наш цикл.

004D9BD  jnz -$1e

Инструкция jnz (переход, если не равно нулю) выполняет ветвление по адресу второй  инструкции (004D9A1h), если результат предыдущей операции не нулевой. Этот результат определяется по регистру флагов. Адрес ветвления находится так: к адресу команды следующей после текущей 004D9BFh (это содержание счетчика команд) добавляем смещение, указанное в команде -1Eh, получаем указанный адрес 004D9A1h. Когда количество проходов цикла достигает пяти, в переменной ia будет находиться 5 и выполнение цикла прекратиться.

Упрощенная внутренняя структура процессора

Упрощенно структуру микропроцессора можно представить в следующем виде (Рис. …).

 

Рисунок  Упрощенная структура процессора

 

В общих чертах работа процессора выглядит следующим образом:

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

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

Непосредственное выполнение инструкции производится арифметико-логическим устройством (АЛУ). На входы АЛУ могут подаваться обрабатываемые данные из памяти или из внутренних регистров. Результат выполнения инструкции сохраняется в одном из регистров или в памяти. Кроме этого выполнение  инструкции всегда изменяет регистр счетчика команд и (не для всех инструкций) регистр флагов, каждый бит которого содержит информацию о результате выполнения последней команды.

Основные функции показанных узлов следующие.

Арифметико-логическое устройство (АЛУ, англ. Arithmetic And Logic Unit, ALU)) предназначено для обработки информации в соответствии с полученной процессором командой. Примерами обработки могут служить логические операции (типа логического «И», «ИЛИ», «Исключающего ИЛИ» и т.д.) то есть побитные операции над операндами, а также арифметические операции (типа сложения, вычитания, умножения, деления и т.д.). Над какими кодами производится операция, куда помещается ее результат — определяется выполняемой командой. Если команда сводится всего лишь к пересылке данных без их обработки, то АЛУ не участвует в ее выполнении. АЛУ имеет свои собственные внутренние регистры. Разрядность регистров АЛУ называется внутренней разрядностью процессора, которая может не совпадать с внешней разрядностью.

В принципе АЛУ умеет только суммировать разряды. Все остальные арифметические действия сводятся к арифметической операции суммирования, логическим операциям сдвига при умножении и делении (Заметим, что сдвиг влево на 1 разряд соответствует умножению на два, а сдвиг вправо на один разряд - целочисленному делению на два.). Вычитание заменяется суммированием в дополнительном коде. Разберем, как работает АЛУ на примере инструкции суммирования. Порядок работы следующий: слагаемые размещаются во внутренних регистрах АЛУ. Старший разряд резервируется для знака числа и называется знаковым, все остальные будут называться числовыми. (Напоминаем, что для представления отрицательного числа используется дополнительный код) Слагаемые складываются по правилам сложения двоичных чисел. При этом знаковые разряды участвуют в вычислениях наряду с числовыми.

Приведем несколько примеров. Для упрощения будем рассматривать АЛУ с 8 разрядными регистрами.

Примеры арифметических операций для целых чисел.

Сначала простой случай, проведем сложение 61 + 1

 

+

0

0

1

1

1

1

1

1

0

0

0

0

0

0

0

1

 

0

1

0

0

0

0

0

0

Информация о работе Арифметические основы вычислительных машин