Краткие теоретические и учебно-методические материалы
Процессор способен выполнять команды, находящиеся в памяти в виде двоичных кодов. В процессорах iх86 длина команды может составлять от 1 до 12 байт. Первый байт команды содержит код операции, а также некоторую дополнительную информацию (например, о длине обрабатываемых данных). Данные, подлежащие обработке, называются операндами. Каждый операнд может представлять собой байт или слово и находиться в регистре общего назначения или в памяти. Кроме того, существуют команды, использующие в качестве операндов последовательности байтов или слов (строки).
Разрабатывать программу, записывая все команды непосредственно в двоичной кодировке, очень трудно. С другой стороны, языки программирования высокого уровня, такие, как Паскаль или Си, намного облегчают написание программ, но они не дают доступа ко всем ресурсам компьютера; размер получаемого кода оказывается значительным. «Золотой серединой» здесь оказывается язык Ассемблер. В этом языке каждой команде процессора соответствует мнемонический код (или мнемокод), т.е. код, удобный для запоминания. Кроме кодов команд, Ассемблер содержит директивы, т.е. служебные инструкции, определяющие формат программы, данных и т.п. Существуют как самостоятельные Ассемблер-системы, так и встроенные в языки высокого уровня (например, в системе Borland Pascal).
Использование регистров процессора
Регистр – специально отведенная память для временного хранения каких-то данных. Микропроцессоры i8086 имеют 14 регистров.
Таблица 1 – Регистры данных (регистры общего назначения, РОН)
AX | BX | CX | DX | ||||
AH | AL | BH | BL | CH | CL | DH | DL |
Аккумулятор | База | Счетчик | Регистр данных | ||||
РОН могут использоваться программистом по своему усмотрению (за исключением некоторых случаев). В них можно хранить любые данные: числа, адреса и пр. В верхнем ряду таблицы 6.1 находятся шестнадцатиразрядные регистры, которые могут хранить числа от 0 до 65535 или от 0h до FFFFh в шестнадцатеричной системе счисления. В следующей строке расположен ряд восьмиразрядных регистров. В них можно загружать максимальное число 255 (FFh). Они представляют собой старшую (High) и младшую (Low) половинки шестнадцатиразрядных регистров.
Таблица 2 – Регистры-указатели
SI | DI | BP | SP |
Индекс источника | Индекс приемника | Регистры для работы со стеком |
Регистры SI и DI используются в строковых операциях.
Таблица 3 – Сегментные регистры
CS | DS | ES | SS |
Регистр кода | Регистр данных | Дополнительный регистр | Регистр стека |
Сегментные регистры необходимы для обращения к тому или иному сегменту памяти.
Команды пересылки данных и загрузки
Таблица 4 – Команды пересылки данных, загрузки адресов
Название | Общий вид команды | Действие |
Пересылка данных | MOV op1, op2 | op1 ← op2 |
Обмен (перестановка) данных | XCHG op1, op2 | op1 ↔ op2 |
Загрузка исполнительного адреса | LEA op1, op2 | op1 ← ( адрес op2) |
Команда MOV (to move – передвигать, перемещать) осуществляет пересылку байта или слова из источника (это второй операнд, «op2») в место назначения (первый операнд, он же операнд-получатель, «op1»). В качестве источника и получателя могут служить РОН, индексный или сегментный регистр, ячейка памяти. Источником могут также являться данные (константа), непосредственно указанные в команде.
Пример
MOV AX, 5050 – записать число 5050 в регистр АХ.
MOV AX, BX – переместить число из регистра ВХ в регистр АХ.
Команда XCHG (to exchange – переставлять) осуществляет обмен байтами или словами между своими операндами (РОН, индексные регистры, память). Сегментные регистры не могут использоваться при обмене.
В этих командах, как и многих других двухоперандных командах рассматриваемых МП, недопустимы сочетания операндов типа «память-память», что представляет определённые неудобства при программировании.
Команда LEA (Load Executable Address) носит название «загрузить исполнительный адрес». По этой команде извлекается не сам операнд, а его исполнительный адрес. Действие команды состоит в передаче вычисленного 16-разрядного адреса (внутрисегментного смещения) операнда в 16-разрядный регистр.
Арифметические команды
В классической системе команд 8086-совместимых процессоров существуют все четыре арифметические действия – сложение, вычитание, умножение, деление над 8- и 16-разрядными данными, представляющими целые числа.
Таблица 5 – Арифметические команды
Название | Общий вид команды | Действие |
Сложение | ADD op1, op2 | op1 ← op1+op2 |
Инкремент (увеличение на 1) | INC op | op ← op+1 |
Вычитание | SUB op1, op2 | op1 ← op1-op2 |
Декремент (уменьшение на 1) | DEC op | op ← op-1 |
Умножение | MUL op | см. ниже |
Деление | DIV op | см. ниже |
Команда ADD (addition) выполняет сложение операнда-источника («op2») с операндом места назначения («op1»). Операндами могут быть регистры и ячейки памяти, причём в качестве источника может быть указано число (константа).
Команда SUB (subtraction) выполняет вычитание операнда-источника из операнда-получателя (op1-op2), записывая результат на место первого операнда. Опять же могут быть использованы регистры, память; вычитаемое может быть константой.
Операции «память-память» в этих командах недопустимы, то есть нельзя указывать ссылку на ячейку памяти одновременно и в первом и во втором операнде. Если это необходимо согласно алгоритму решения задачи, следует использовать операцию «регистр-память», а затем переслать (командой MOV) результат из указанного регистра в другую ячейку памяти.
Команда инкремента INC увеличивает свой единственный операнд на единицу, команда декремента DEC – уменьшает. Эти команды удобно применять, например, в цикле при необходимости наращивания или уменьшения какого-либо счётчика, адреса и т.п.
Команда MUL (multiplication), осуществляющая умножение, более сложна в использовании. Она имеет лишь один операнд – первый множитель. Где указывается второй и где окажется результат зависит от того, будет ли работать команда со словом или с байтом.
Пусть в качестве единственного операнда указан регистр или ячейка размером в байт (например, MUL CL). Тогда второй множитель (тоже байт) берётся обязательно из регистра AL, а результат (16-разрядный, т.е. длиной в слово) окажется в регистре AX:
AX ← AL*op.
Если же операнд «op» взят 16-разрядным (например, MUL CX), то команда выполнит следующее действие:
DXAX ← AX*op,
то есть второй множитель, также 16-разрядный, будет автоматически взят из регистра AX, а результат размером в двойное слово, т.е. 32-разрядный, окажется в регистровой паре, состоящей из DX и AX.
Команда деления DIV работает следующим образом. Как и в команде MUL, здесь указывается единственный операнд, который является делителем. Этот делитель опять же может быть словом или байтом. Если «op» – байт, то команда выполняется как
((AH-остаток) и (AL-частное)) ← AX/op,
то есть делимое берётся из 16-разрядного регистра AX, 8-разрядное частное оказывается записанным в AL, остаток такой же размерности – в AH.
Если же «op» – 16-разрядное слово, то МП выполнит команду как
((DX-остаток) и (AX-частное)) ← DXAX/op,
то есть 32-разрядное делимое будет взято из регистровой пары DXAX, частное окажется в AX, остаток – в DX (оба – 16-разрядные).
Примеры разработки программ
Задание: записать во все РОН целое число 5050.
Данное нам число – это константа. Для записи констант в какие-либо регистры в нашем распоряжении есть команда MOV (таблица 6.4). Число 5050 превосходит максимальное значение для байта (255), но меньше максимального значения для машинного слова (65535). Следовательно, будем использовать 16-разрядные регистры. Программа будет выглядеть так:
MOV AX, 5050
MOV BX, AX
MOV CX, AX
MOV DX, AX
Задание: вычислить выражение (25*7+137*5-60) и результат оставить в регистре AX.
Из рассмотрения данного выражения следует, что нам понадобятся команды ADD (сложить), MUL (умножить), SUB (вычесть), приведённые в таблице 6.5, а также MOV (переслать). Получим сначала произведение 25*7 и сохраним его; затем получим произведение 137*5 и сложим оба частичных результата; вычтем 60 из того, что получилось. Приходим к программе:
MOV AL, 25 ; записать в AL число 25
MOV DL, 7 ; записать в DL число 7
MUL DL ; теперь AX = 25*7
MOV BX, AX ; копировать из АХ в ВХ, теперь BX = 25*7
MOV AL, 137
MOV DL, 5
MUL DL ; AX = 137*5
ADD AX, BX ; AX = 25*7 + 137* 5
SUB AX, 60 ; AX уменьшен на 60
Варианты заданий
1 Составить таблицу «Регистры процессора» с указанием названия регистра и его назначения.
2 Составить таблицу «Команды Ассемблера» с указанием названия команды, ее мнемокода и выполняемого действия.
3 Разработать программу на языке Ассемблер для вычисления арифметического выражения (таблица 6.6) и сохранения результата в указанном регистре.
Таблица 6 – Таблица вариантов
Вариант | Выражение | Регистр-приемник |
(53+8)*2+(150-60)/3 | DX | |
(1260-450)/2+310*3 | SI | |
(176/2+23*3)-(125-50)/3 | BX | |
(786+35)*3+(125-50)/5 | DI | |
(5684/4+357/3+245/5)*3 | CX | |
(25*7-31*2+11*3)/2 | BL. В регистр BH записать 0 | |
150/3+78/2+365/5 | CL. В регистр CH записать 0 | |
(35/7)*(78/2)-190 | BH. В регистр BL записать 0 | |
(81/9)*(65/5)-110 | CH. В регистр CL записать 0 | |
150/5-35/7+210/3 | DL. В регистр DH записать 0 |
Контрольные вопросы
1 Что называется операндом и мнемокодом?
2 Что такое регистры процессора? Для чего используются регистры общего назначения?
3 Чем отличаются команды ADD и INC?
4 Какое сочетание операндов недопустимо для большинства двухоперандных команд Ассемблера?
Критерии оценивания выполнения практических работ по дисциплине «Вычислительная техника»
Оценка | |
5 (отлично) | Студент принимал активное участие в выполнении практической работы. В отчете представлены все необходимые таблицы с данными измерений, выполнены правильно расчеты, аккуратно построены графики зависимости проведенных исследований. В выводах даны пояснения и анализ результатов исследований. При ответах на контрольные вопросы студент умеет объяснить физическую сущность процессов |
4 (хорошо) | Студент самостоятельно и правильно выполнил необходимые расчеты, однако в результатах не проставил единицы измерений, при оформлении графиков допустил небрежность. В выводах отсутствует глубокий анализ проведенных исследований. Ответы на контрольные вопросы не отличаются глубиной понимания физических процессов в электронных приборах. |
3 (удовлетв.) | В ходе проведения практической работы студент пользовался консультацией преподавателя, испытывал затруднения в подключении приборов. Построение графиков выполнено с низкой наглядностью. При защите отчета по практической работе показал низкий уровень теоретических знаний. В выводах о проделанной работе присутствует только констатация результатов измерений без анализа и пояснений. |
2 (неудовл.) | Студент проявил слабую заинтересованность в проведении практической работы. Расчеты проводились под непосредственным руководством преподавателя. При защите практической работы студент не может проанализировать полученные результаты |