Автор работы: Пользователь скрыл имя, 04 Сентября 2014 в 13:43, реферат
Все компьютеры используют для хранения информации двоичную систему. Это значит, что каждый элемент хранимой информации может иметь только два состояния. Эти состояния обозначаются как «включен» и «выключен», «истина» и «ложь», или «1» и «0». Как правило, компьютер использует эти значения в виде уровней напряжения.
Из-за двоичного представления данных компьютеры используют в своих вычислениях арифметику с двоичным основанием. Используя простейшие числа 0 и 1, можно выполнять очень сложные вычисления.
MOV [BX], 5050H
Поместить в память по адресу 0133h значение 5050h. В этом случае операндом источником будет число, находящееся непосредственно в команде, а операндом источником – адрес.
Логические команды выполняют над операндами логические (побитовые) операции (для тех, кто забыл, что такое логические операции, информация по ним приведена в приложении), то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Среди логических команд можно назвать логическое И, логическое ИЛИ, исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и формируют они один выходной операнд.
Пример логической команды
Применить побитовое исключающее или к операндам обозначающий один и тот же регистр:
XOR EAX,EAX
Самый быстрый для процессора способ обнулить регистр EAX (если операнды одинаковые, то на выходе в любом случае будет 0).
Команды переходов предназначены для изменения обычного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевозможные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти команды позволяют строить сложные алгоритмы обработки информации.
Для того чтобы рассказать, что такое условный переход необходимо предварительно рассказать о регистре состояния процессора (PSW). Иначе этот регистр называют регистром флагов. Он предназначен для отражения текущего состояние процессора. Биты этого регистра устанавливаются или очищаются в соответствии с результатом каждой выполненной команды. Каждый бит регистра состояния имеет свой смысл и называется флагом.
Чаще всего нас интересует флаг нуля (ZF – Zero Flag), который включается, когда в результате действия команды переменная обнуляется. Другим часто используемым флагом является флаг знака (SF – Sign Flag), который показывает что переменная, установленная в результате действия команды, будет положительна. Все арифметические и некоторые другие команды меняют флаги, т.е. мы всегда знаем, что получилось в результате (операнд приемник содержит нуль, положительное или отрицательное число и т.д.)
Вернемся к условным и безусловным переходам.
Команды безусловных переходов вызывают переход в новый адрес независимо ни от чего. Они могут вызывать переход на указанную величину смещения (вперед или назад) или же на указанный адрес памяти. Величина смещения или новое значение адреса указываются в качестве входного операнда.
Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Несколько примеров команд условных переходов:
Если условие перехода выполняется, то производится загрузка в регистр-счетчик команд нового значения. Если же условие перехода не выполняется, счетчик команд просто наращивается, и процессор выбирает и выполняет следующую по порядку команду
Примеры команд пересылки данных
JZ 40h
Если результат предыдущей операции равен нулю переходим к инструкции, которая находится добавлением к текущему адресу 40h.
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
Рассмотрим результат трансляции построчно.
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;
0044C881 66С705DAFB440003 mov word ptr [ib], $0003
Это инструкция расположена по адресу 0044C881 (обратим внимание, что этот адрес на восемь больше чем адрес первой инструкции). В результате исполнения этой инструкции число 3 будет перемещено по адресу переменной ib, что соответствует второй строке нашей программы.
0044C88A 66A1D8FB4400 mov ax, [$0044fbd8]
Здесь данные, находящиеся по адресу 0044fbd8h (это адрес переменной ia, в которой сейчас находится число 5) перемещаются в регистр AX.
0044C890 660305DAFB4400 add ax, [ib]
К содержимому регистра AX добавим данные, находящиеся по адресу переменной ib (в переменную ib было помещено число 3).
Пятая строка содержит:
В результате исполнения этой инструкции содержимое регистра 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
Рассмотрим полученный код построчно (для упрощения не будем больше показывать код инструкции, а ограничимся адресом команды и ее символьным представлением).
004D998 mov word ptr [ia], $0000
В результате исполнения этой инструкции по адресу переменной ia будет занесен 0. Напоминаем, что определитель размера данных word ptr показывает, что мы работаем с шестнадцатиразрядным числом.
004D9A1 mov ax, [$00450bd8]
Содержимое переменной ia, находящейся по адресу 00450BD8h, скопируем в регистр ax, при помощи которого будет производиться суммирование.
004D9A7 add [ib], ax
К содержимому находящемуся по адресу ib добавляем содержимое регистра ax (напоминаем, что в этот регистр было помещено значение находящееся в ia). Таким образом эта инструкция соответствует следующей строке программы
ib := ib + ia;
004D9AE inc [ia]
Команда inc обеспечивает приращение на единицу данных по адресу переменной ia.
004D9B5 cmp word ptr [ib], $05
Инструкция cmp сверяет значение двух байт в памяти по адресу ib с числом 5, в результате будут установлены флаги в регистре флагов.
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 |
Информация о работе Арифметические основы вычислительных машин