Практическое занятие № 14
Тема: «Изучение системы команд Ассемблера. Команды пересылки данных и арифметические команды»
Цель: изучить использование регистров процессора, изучить команды пересылки и арифметические команды в языке Ассемблер.
Теория
Процессор способен выполнять команды, находящиеся в памяти в виде двоичных кодов. В процессорах iх86 длина команды может составлять от 1 до 12 байт. Первый байт команды содержит код операции, а также некоторую дополнительную информацию (например, о длине обрабатываемых данных). Данные, подлежащие обработке, называются операндами. Каждый операнд может представлять собой байт или слово и находиться в регистре общего назначения или в памяти. Кроме того, существуют команды, использующие в качестве операндов последовательности байтов или слов (строки).
Разрабатывать программу, записывая все команды непосредственно в двоичной кодировке, очень трудно. С другой стороны, языки программирования высокого уровня, такие, как Паскаль или Си, намного облегчают написание программ, но они не дают доступа ко всем ресурсам компьютера; размер получаемого кода оказывается значительным. «Золотой серединой» здесь оказывается язык Ассемблер. В этом языке каждой команде процессора соответствует мнемонический код (или мнемокод), т.е. код, удобный для запоминания. Кроме кодов команд, Ассемблер содержит директивы, т.е. служебные инструкции, определяющие формат программы, данных и т.п. Существуют как самостоятельные Ассемблер-системы, так и встроенные в языки высокого уровня (например, в системе Borland Pascal).
Использование регистров процессора
Регистр – специально отведенная память для временного хранения каких-то данных. Микропроцессоры i8086 имеют 14 регистров.
Таблица 6.1 – Регистры данных (регистры общего
назначения, РОН)
|
AX |
BX |
CX |
DX |
||||
|
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
|
Аккумулятор |
База |
Счетчик |
Регистр данных |
||||
РОН могут использоваться программистом по своему усмотрению (за исключением некоторых случаев). В них можно хранить любые данные: числа, адреса и пр. В верхнем ряду таблицы 6.1 находятся шестнадцатиразрядные регистры, которые могут хранить числа от 0 до 65535 или от 0h до FFFFh в шестнадцатеричной системе счисления. В следующей строке расположен ряд восьмиразрядных регистров. В них можно загружать максимальное число 255 (FFh). Они представляют собой старшую (High) и младшую (Low) половинки шестнадцатиразрядных регистров.
Таблица 6.2 – Регистры-указатели
|
SI |
DI |
BP |
SP |
|
Индекс источника |
Индекс приемника |
Регистры для работы со стеком |
|
Регистры SI и DI используются в строковых операциях.
Таблица 6.3 – Сегментные регистры
|
CS |
DS |
ES |
SS |
|
Регистр кода |
Регистр данных |
Дополнительный регистр |
Регистр стека |
Сегментные регистры необходимы для обращения к тому или иному сегменту памяти.
Команды пересылки данных и загрузки
Таблица 6.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-разрядными данными, представляющими целые числа.
Таблица 6.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-разрядные).
Примеры разработки программ
1. Задание: записать во все РОН целое число 5050.
Данное нам число – это константа. Для записи констант в какие-либо регистры в нашем распоряжении есть команда MOV (таблица 6.4). Число 5050 превосходит максимальное значение для байта (255), но меньше максимального значения для машинного слова (65535). Следовательно, будем использовать 16-разрядные регистры. Программа будет выглядеть так:
MOV AX, 5050
MOV BX, AX
MOV CX, AX
MOV DX, AX
2. Задание: вычислить выражение (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 Варианты заданий
|
Вариант |
Выражение |
Регистр-приемник |
|
1 |
(53+8)*2+(150-60)/3 |
DX |
|
2 |
(1260-450)/2+310*3 |
SI |
|
3 |
(176/2+23*3)-(125-50)/3 |
BX |
|
4 |
(786+35)*3+(125-50)/5 |
DI |
|
5 |
(5684/4+357/3+245/5)*3 |
CX |
|
6 |
(25*7-31*2+11*3)/2 |
BL. В регистр BH записать 0 |
|
7 |
150/3+78/2+365/5 |
CL. В регистр CH записать 0 |
|
8 |
(35/7)*(78/2)-190 |
BH. В регистр BL записать 0 |
|
9 |
(81/9)*(65/5)-110 |
CH. В регистр CL записать 0 |
|
10 |
150/5-35/7+210/3 |
DL. В регистр DH записать 0 |
Контрольные вопросы
1 Что называется операндом и мнемокодом?
2 Что такое регистры процессора? Для чего используются регистры общего назначения?
3 Чем отличаются команды ADD и INC?
4 Какое сочетание операндов недопустимо для большинства двухоперандных команд Ассемблера?
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.