русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Система команд


Дата добавления: 2014-11-28; просмотров: 3467; Нарушение авторских прав


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

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

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

Каждая команда процессора имеет два представления:

- В виде машинной команды (цифровое представление).

- В виде команды Ассемблера. Поскольку человек не привык читать сплошные цифры, каждая команда имеет своё имя (имена) и формат.

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

Имя_команды операнд_Приемник, операнд_Источник.

Расскажем теперь только об основных командах и только самое главное. Все приведенные ниже примеры будут относиться к системе команд х86. Полную информацию об этой системе команд можно найти в приложении.

 

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

- арифметические, например «сложения» и «вычитания»;

- битовые, например «логическое и», «логическое или» и «логическое не»;

- присваивание данных, например «переместить», «загрузить», «выгрузить»;

- ввода-вывода, для обмена данными с внешними устройствами;

- управляющие инструкции (команды переходов), например «переход», «условный переход», «вызов подпрограммы», «возврат из подпрограммы».

Арифметические команды выполняют операции сложения, вычитания, умножения, деления, увеличения на единицу (инкрементирования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд (для большинства процессоров, и для частности для семейства х86, один из входных операндов будет и выходным, это так называемый операнд приемник, второй входной операнд будет операндом источником).



Примеры арифметических команд

1. Чтоб сложить содержимое двух регистров, нужно использовать команду

ADD AH,AL

Прибавить к содержимому регистра AH содержимое регистра AL. Результат будет находиться в регистре AH. Здесь ADD обозначает код операции, а AH,AL операнды, которые в нашем примере являются регистрами общего назначения.

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

SUB CX,DX

Отнять от CX содержимое DX, результат будет находиться в регистре CX.

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

3. Добавить число к содержимому регистра

ADD AH,9

Добавляем значение 9 к содержимому регистра AH, результат будет находиться в регистре AH. То есть в этом случае приемник это регистр, а источник находится непосредственно в команде. Это пример на использование в качестве операнда конкретного числа.

4. Добавить содержимое, находящееся по известному адресу, к содержимому регистра

ADD AX,[0133h]

Прибавить к содержимому регистра AX байты находящиеся в памяти по адресу 0133h (квадратные скобки указывают что операндом будет адрес).

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

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

1. Поместить содержимое одного регистра в другой

MOV DX,BX

Копировать содержимое регистра BX в регистр DX.

2. Поместить число по известному адресу

MOV [BX], 5050H

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

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

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

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

XOR EAX,EAX

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

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

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

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

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

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

 

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

- переход, если равно нулю;

- переход, если больше нуля;

- переход, если меньше или равно нулю.

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

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

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

JZ 40h

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

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

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;

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

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

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

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

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

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

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

0044C890 660305DAFB4400 add ax, [ib]

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

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

5. 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 показывает, что мы работаем с шестнадцатиразрядным числом.

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

004D9A1 mov ax, [$00450bd8]

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

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

004D9A7 add [ib], ax

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

ib := ib + ia;

 

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

004D9AE inc [ia]

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

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

004D9B5 cmp word ptr [ib], $05

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

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

004D9BD jnz -$1e

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



<== предыдущая лекция | следующая лекция ==>
Упрощенная архитектура компьютера | Упрощенная внутренняя структура процессора


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.402 сек.