429.50K
Категория: ЭлектроникаЭлектроника

Система команд МП I80X86. Команди пересилання даних, зсуви та арифметичні команди

1.

Полтавський національний технічний університет імені Юрія Кондратюка
Лекція № 9 з навчальної дисципліни
“Архітектура обчислювальних систем”.
Розділ 2. Програмування низького рівня.
Тема лекції:
Система команд МП I80X86. Команди пересилання
даних, зсуви та арифметичні команди
План лекції
1. Класифікація команд МП X86. Основні відомості про мову
Assembler-86.
2. Директиви опису та ініціювання змінних.
3. Команди пересилання інформації.
4. Команди двійкової арифметики.
5. Зсуви.
6. Приклад простої програми.
Кафедра комп'ютерної інженерії
К.т.н., доцент Тиртишніков О.І.

2.

1. Класифікація команд МП X86. Основні відомості про мову
асемблера
Система команд МП X86:
- інструкції пересилання даних,
- інструкції введення-виведення,
- інструкції двійкової (та двійково-десяткової) арифметики,
- інструкції логічних операцій та зсувів,
- інструкції обробки бітів і байтів,
- команди передачі управління (умовні та безумовні переходи, виклик
процедур та повернення з них, організація циклів),
- строкові (рядкові) операції,
- операції з прапорцями,
- інструкції завантаження покажчиків,
- інструкції математичного співпроцесора,
- інструкції пакетів мультимедійних розширень,
- системні інструкції.
Команди МП подаються мнемокодами асемблера. Асемблерні
програми вимагають меншого обсягу пам'яті і часу виконання порівняно з
програмами, написаними будь-якою мовою високого рівня. Саме тому
асемблер застосовується при створенні системних програм, драйверів
пристроїв, основними вимогами до яких є швидкість виконання та
компактність. Асемблер, на відміну від мов програмування високого
рівня, є апаратно-залежною мовою.

3.

1. Класифікація команд МП сімейства Іntel 80X86. Основні
відомості про мову асемблера
Програма на асемблері складається з одного або декількох
блоків (сегментів) пам'яті. Сегмент містить сукупність речень
мови, кожнє з яких займає окремий рядок коду програми. Речення,
що складають програму, можуть бути командою, макрокомандою, директивою або коментарем:
команди або інструкції - символічні аналоги машинних команд. У
процесі трансляції інструкції асемблера перетворюються у відповідні
команди МП;
макрокоманди - оформлені певним чином речення тексту програми,
які заміщаються під час трансляції іншими реченнями - як правило,
істотно великими за обсягом;
КОп
ім’я
мітки
:
Операнд 1
;
,
Операнд 2
Коментар

4.

1. Класифікація команд МП X86. Основні відомості про мову
асемблера
директиви є вказівкою трансляторові асемблера на виконання деяких
дій. У директив немає аналогів у машинному поданні;
Директива
ім’я
Операнд1
;
,
Коментар
Операнд n
рядки коментарів,
транслятором).
що
містять
будь-які
символи
(ігноруються
Алфавіт мови асемблера:
1. латинські літери: A-Z, a-z. Великі та малі літери вважаються
еквівалентними;
2. цифри від 0 до 9;
3. знаки ?, @, $, _, &;
4. роздільники , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.

5.

1. Класифікація команд МП X86. Основні відомості про мову
асемблера
Речення асемблера формуються з лексем – синтаксично
нероздільних послідовносей припустимих символів мови, що
мають сенс для транслятора.
Лексеми:
- ідентифікатори - послідовності символів, що використовуються
для позначення об'єктів програми: кодів операцій, імен змінних і міток.
Ідентифікатор може складатися з одного або декількох символів: літер
латинського алфавіту, цифр і спеціальних знаків _, ?, $, @ та не може
починатися цифрою. Довжина ідентифікатора - до 255 символів, але
транслятор сприймає лише перші 32.
ланцюжки символів - послідовності символів в одинарних або
подвійних лапках;
- цілі числа : двійкові, десяткові, шістнадцяткові. Десяткові числа
не вимагають для свого ототожнення додаткових символів, наприклад 25
або 139. Для ототожнення двійкових чисел необхідно після запису нулів
і одиниць додати латинське "b", наприклад 10010101b. Для ототожнення
шістнадцяткових чисел необхідно наприкінці додати латинську літеру
"h“; якщо шістнадцяткове число починається з літери, то перед ним
записується ведучий нуль, наприклад 0ef15h.

6.

1. Класифікація команд МП X86. Основні відомості про мову
асемблера
Вирази асемблера - комбінації операндів і операторів, які
розглядаються як єдине ціле. Типи операторів визначаються типами
команд МП. Типи операндів визначаються режимами адресування МП.
Операнди:
- постійні або безпосередні операнди,
- адресні операнди,
- переміщувані операнди,
- лічильник адреси,
- регістровий операнд,
- базовий і індексний операнди,
- структурні операнди,
- записи.
Результатом обчислення виразу може бути адреса деякої комірки
пам'яті або деяке константне (абсолютне) значення. Як і в мовах
високого рівня, виконання операторів асемблера при обчисленні виразів
здійснюється відповідно до їх пріоритетів, операції з однаковими
пріоритетами виконуються послідовно зліва праворуч. Зміна порядку
виконання можлива шляхом застосування круглих дужок, які мають
найвищий пріоритет.

7.

2. Директиви опису та ініціювання змінних
Тип змінної у асемблері – це її довжина у байтах (об'єм пам'яті,
виділеної під змінну. При визначенні змінної необхідно вказати її тип та
ім'я. Можна також повідомити компілятор про початкове значення змінної
(ініціювати її), але це не обов'язково. Формат директив опису змінних:
Ім'я Мнемокод Початкове_значення.

Мнемокод
Призначення
1
db
Define Byte (визначити байт)
2
dw
Define Word (визначити слово)
3
dd
Define Double Word (визначити подвійне слово)
P db 2
Початкове значення P=2 (00000010)
R db ?
R не ініційовано
S db 3+2 Початкове значення S=5
Приклади:
T db ‘ю’ В байті Т ASCII – код букви Ю
A db 7
В байті А число 7
G dw A
В слові G зсув байта А
C dd A
в старшому слові С сегмент, в молодшому – зсув байта А

8.

3. Команди пересилання інформації
Позначення у командах для можливих типів операндів: r –
регістровий, m – адресний, d – безпосередній операнди.
1. mov < операнд призначення (приймач) r/m>, < операнд –
джерело > r/m/d. Основна команда пересилання даних, реалізує різні
варіанти пересилань, наприклад:
MOV AL,03 - помістити число 03 у молодшу половину (байт) регістра
АХ. Тут 03 - безпосередній операнд, а AL - регістровий операнд.
MOV AХ,DX - пересилання значення з регістра DX у AX. Тут обидва
операнди - регістрові.
MOV AХ,0000 - очищення акумулятора.
MOV [0023],AХ - пересилання вмісту акумулятора в комірку пам'яті за
адресою DS:0023. Число в прямокутних дужках – зсув логічної адреси
комірки пам'яті.
MOV СХ,[0023] – пересилання вмісту комірки пам'яті за адресою
DS:0023 у CX.
Приймач та джерело не можуть бути одночасно змінними у
пам'яті або сегментними регістрами; якщо приймач – сегментний
регістр (крім CS), джерело – шістнадцятирозрядний регістр.

9.

3. Команди пересилання інформації
Неприпустимі варіанти: MOV 03,AL; MOV CS,DX; MOV ES,DS; MOV
DS,0b000h; MOV [BX],[0005]; MOV AL,280
Команді MOV відповідає більш 20 машинних команд.
Команди роботи зі стеком
2. pop <приймач r/m >. Команда призначена для добування слова зі
стека (вмісту вершини стека) у комірку пам'яті або регістр. Алгоритм
виконання:
- завантажити в приймач вміст вершини стека (адресується парою
SS:SP);
- збільшити вміст SP на 2 байти.
Неприпустиме добування слова в сегментний регістр CS.
3. push <джерело r/m >. Команда записує вміст операнда "джерело"
у стек. Алгоритм виконання:
- зменшити значення покажчика стека SP на 2;
- записати джерело у вершину стека (адресується парою SS:SP).
В стек можна включати значення сегментного регістра CS. При
записі в стек байтів для них виділяється слово.

10.

4. Команди двійкової арифметики
Арифметичні операції виконуються однаково для знакових та для
беззнакових величин. Додавання та віднімання байтів виконується за
модулем 28, слів – за модулем 216. Додавання за модулем 2n означає,
що у випадку, якщо результат перевищує 2n, одиниця старшого (n+1)-го
розряду відкидається. Віднімання за модулем 2n – що у випадку, коли
від'ємник більше за зменшуване, фактично здійснюється “позика”
одиниці старшого (n+1)-го розряду, після цього виконується віднімання.
1. add < приймач r/m>,< джерело r/m/d >. Додавання двох цілих
операндів (джерело і приймач) розмірністю байт, слово або подвійне
слово. Результат додавання розміщується за адресою першого
операнда (приймача).
Наприклад: ADD DX,03 - збільшує на 3 значення регістра DX.
2. sub < приймач r/m >,< джерело r/m/d >. Команда цілечисельного
віднімання першого операнда з другого, результат записується у
приймач.
Приклад: SUB DX,AX - значення регістра AX віднімається з DX,
результат записується в DX.
Приймач та джерело мають однакову довжину та не можуть
бути одночасно змінними у пам'яті.

11.

4. Команди двійкової арифметики
Якщо при виконанні дії була позика або відкидання одиниці
старшого розряду, прапор переносу CF=1, інакше CF=0. Якщо при
виконанні дії був перенос в старший розряд, прапор
переповнення ОF=1, інакше ОF=0.
3. adс < приймач r/m>,< джерело r/m/d >. Приймач := Приймач +
Джерело + [CF].
4. sbb < приймач r/m>,< джерело r/m/d >. Приймач := Приймач –
Джерело – [CF].
Виконуються так саме, як команди add і sub, але з додаванням або
відніманням попереднього значення прапора CF (для віднімання та
додавання “довгих” чисел).
5. іnc < операнд r/m >. Збільшує значення операнда в пам'яті або
регістрі на 1. Наприклад: ІNC BL - збільшує вміст регістра BL на 1.
6. dec < операнд r/m >. Зменшує значення операнда в пам'яті або
регістрі на 1. Наприклад: DEC BL - зменшує вміст регістра BL на 1.
Операнд – регістр, слово або байт у пам'яті. Ці команди не
змінюють стан CF.

12.

4. Команди двійкової арифметики
7. mul (imul) <співмножник_1 r/m >. Команда множення двох цілих
чисел без знаків (зі знаками). Алгоритм виконання залежить від формату
операнда і вимагає явної вказівки місця розташування тільки одного
співмножника – в пам'яті або в регістрі. Місце розташування другого
співмножника фіксоване і залежить від розміру першого:
- якщо операнд, зазначений у команді - байт, то другий співмножник
має розташовуватися в AL (молодшій половині акумулятора);
- якщо операнд, зазначений у команді - слово, то другий співмножник
має розташовуватися в AX.
Результат множення також розташовується у фіксованому місці,
обумовленому розміром співмножників:
- при множенні байтів результат записується в AX;
- при множенні слів результат записується у пару регістрів DX:AX;
Наприклад: MUL BL - множення вмісту регістра BL на вміст молодшої
половини акумулятора. Результат записується в акумулятор.
Для результату завжди відводиться удвічі більше пам'яті, чім для
кожного операнда. Але фактично результат множення байтів може
розмішуватися у байті, слів – в слові. Якщо добуток потребує подвійного
формату, прапори CF=1, ОF=1, якщо для результату достатньо формату
співмножників – CF=0, ОF=0

13.

4. Команди двійкової арифметики
8. dіv (idiv) < дільник r/m >. Команда цілечисельного ділення двох
двійкових беззнакових чисел (чисел зі знаками) з видачею результату у
вигляді частки і остачі. Ділене задається неявно і розмір його залежить
від розміром дільника, що вказується в команді:
- якщо дільник - байт, то ділене має бути розташоване в регістрі
AX. Після операції частка записується в AL, остача - у AH;
- якщо дільник - слово, то ділене має бути розташоване в парі
регістрів DX:AX, причому молодша частина діленого знаходиться в
AX. Після операції частка записується в AX, а остача - у DX.
Наприклад:
DІV BL - ділення вмісту акумулятора на вміст молодшої половини
регістра BX.
При виконанні операції ділення можливі виняткові ситуації (помилки)
двох типів, при виникненні яких програма аварійно завершується:
ділення на 0 (zero divide) – дільник рівний 0; переповнення (divide
overflow) – частка занадто велика для її розміщення в регістрі AX/AL.
Виняткові ситуації обробляються за допомогою прапорів ZF та ОF.

14.

5. Зсуви
Класифікація команд зсувів
Зсуви
Звичайні
Арифметичний
Циклічні
Логічний
З перенесенням
Дане
СF
Без перенесення
Дане
СF
Зсув може бути звичайним та циклічним (обертаннями). При
звичайному зсуві розряди, що висуваються за розрядну сітку,
втрачаються. При циклічному зсуві вони записуються на місце
вивільнених розрядів.
Звичайний зсув може бути арифметичним та логічним. При
арифметичному зсуві вправо вільні позиції зліва заповнюються
знаковим (старшим) розрядом. При логічному зсуві вправо вільні
розряди зліва заповнюються нулями. Арифметичний зсув вправо
звичайно застосовується для цілечисельного ділення знакового числа
на 2n, а логічний - для беззнакового числа. Операції зсуву вліво для
обох типів команд виконуються однаково.
Циклічний зсув може бути з перенесенням або без перенесення.
Висунутий біт завжди записується в біт переносу С.

15.

4. Зсуви
Мнемокоди команд зсувів
S
R
1
H
A L
O R
C
2
3
Перша літера визначає тип зсуву: S –
звичайний, R – циклічний.
Друга літера – тип зсуву. Для звичайного: А –
арифметичний зсув, Н – логічний зсув. Для
циклічного: С – зсув з перенесенням, О – без
перенесення.
Третя літера визначає напрям зсуву: R –
вправо, L – вліво.
Команди SAL і SHL еквівалентні.
Загальний формат команд зсуву: код <оп1 r/m>, <оп2 cl/d>
оп1 – дане, що зсувається (слово, байт або подвійне слово). Може бути
задано у РЗП або у комірці пам'яті.
оп2 – кількість розрядів зсуву. Може бути константою або вмістом CL.

16.

4. Зсуви
Виконання операцій множення та ділення на 2n за допомогою
команд зсувів
Множення та ділення чисел за допомогою зсувів виконується значно
швидше, чим командами MUL і DIV.
Зсув вліво на n позицій за допомогою команд SAL або SHL
еквівалентний множенню на 2n як для чисел беззнакових, так і для чисел
зі знаком (якщо не відбувається витискування значущих бітів).
Зсув вправо на n позицій за допомогою команди SHR еквівалентний
цілечисельному діленню на 2n тільки для чисел без знака.
Зсув вправо на n позицій за допомогою команди SAR еквівалентний
цілечисельному діленню на 2n як для чисел зі знаком, так і для
беззнакових, але для від'ємних чисел результат відрізняється від
результату команди ІDIV: команда ІDIV округлює результат до
найближчого меншого за модулем цілого числа, а команда SAR – до
найближчого більшого за модулем цілого числа.
Приклад:
Mov
Mov
Idiv
Mov
Sar
AX,-3
CL,2
CL
AL,-3
AL,1
; AL=-1
; AL=-2

17.

6. Приклад простої програми
Основні можливості EMU8086
Вікно редагування EMU8086 з текстом програми
Emu8086 дозволяє переглядати пам'ять, вводити програми в
машинних кодах і мовою асемблера та здійснювати трасування їх
виконання, а також емулювати роботу МП і8086.
Для створення нової програми: File – New – COM template (або інший
шаблон). При цьому заголовок файла буде створений автоматично.
Ярлик File – Samples дозволяє завантажувати приклади.
Кнопка Compile - програма компілюється з подальшим запрошенням
до збереження файлу. Якщо в програмі є помилки, то компілятор вказує
номер строки де знаходиться помилка із зазначенням типа помилки.

18.

6. Приклад простої програми
Кнопка Emulator – відкриваються вікна емулятора МП І8086,
програма готова до виконання у покроковому режимі (Single Step) або у
безперервному (Run) з можливістю повернення на початок програми
(Reload).
Вікна емулятора EMU8086
В емуляторі можна спостерігати стан регістрів МП, переглядати вміст
оперативної пам'яті, результат дизасемблірування машинного коду
програми, а також отримувати доступ до вікон екрану користувача (User
Screen), стану АЛП (ALU), стека (Stack) та регістра прапорів (Flags).

19.

6. Приклад простої програми
Умова: обчислити значення функції при X=10. Результат записати
2
в стек.
Варіант 1
Y x 2x 5
#make_COM#
ORG 100H
mov al,10
mov [0001h],al
mul al
mov [0002h],ax
mov al,[0001h]
mov bl,2
mul bl
add ax,[0002h]
sub ax,5
push ax
hlt
Необов'язковий заголовок для створення COM- файла
Запис числа Х=1010 в АL
Пересилання вмісту AL (байт) у комірку пам'яті за
адресою DS:0001.
Підняття Х=1010 у квадрат (результат - слово, у AХ).
Пересилання Х2=10210 з AХ у комірку пам'яті за адресою
DS:0002.
Завантаження числа Х=1010 в АL із пам’яті
Запис числа 210 в BL
Множення Х=1010 на 210 (результат – слово, в AХ)
Додавання Х2 (із пам’яті) і 2Х
Віднімання 510 із Х2+2Х
Запис результату в стек.
Завершення програми.
Програма максимально наближена до машинного коду (не
використовуються імена змінних або констант, директиви, коментарі).
Результат дизасемблірування співпадає з вихідним кодом.

20.

Варіант 2
6. Приклад простої програми
#make_COM#
Приклад програми зі спрощеним визначенням
ORG 100H
сегментів та використанням моделі пам'яті TINY.
.model tiny
Замість адрес комірок пам'яті [0001], [0002]
.stack 256
використані змінні x, s відповідно.
.data
x db 10
СОМ - програма викликається ОС як процедура,
S dw ?
тому для коректного її завершення достатньо
.code
команди ret. Призначення цієї команди – повернення
mov al,x
із внутрішньосегментної процедури, тому вона при
mul al
виконанні відновлює із стеку у IP раніше збережену
mov s,ax
адресу повернення.
mov al,x
Деякі додаткові команди
mov bl,2
hlt – зупинка МП (відноситься до групи команд
mul bl
керування станом МП) . При трасуванні програми
add ax,s
може використовуватися для створення крапок
sub ax,5
зупинки або для завершення програми.
push ax
nop – немає операції.
hlt
Результат дизасемблірування відрізняється від вихідного коду. Розмір
відкомпільованого коду більше, чем у попередньому варіанті.

21.

#make_COM#
include 'emu8086.inc'
ORG 100h
.model tiny
.stack 256
.data
x db 10
S dw ?
.code
PRINT 'Лінійна програма'
mov al,x
mul al
mov s,ax
mov al,x
mov bl,2
mul bl
add ax,s
sub ax,5
push ax
CALL print_num
hlt
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
END
6. Приклад простої програми
Для організації виведення результату на
екран доцільно використовувати бібліотеку
загальних функцій емулятора emu8086.inc.
Для
використання
загальних
функції
необхідно включити її в склад програми за
допомогою директиви include 'emu8086.inc‘.
Виведення тексту на екран: PRINT ‘…’
Функції
бібліотеки
викликаються
процедури командою CALL.
як
Функція
PRINT_NUM

процедура
виведення на екран числа зі знаком, яке
знаходиться у регістрі АХ. Для її використання
оголошуємо:
DEFINE_PRINT_NUM
і
DEFINE_PRINT_NUM_UNS
перед
директивою END.
Функція PRINT_NUM_UNS – процедура
виведення на екран числа без знаку, яке
знаходиться у регістрі АХ. Для її використання
оголошуємо:
DEFINE_PRINT_NUM_UNS
перед директивою END.

22.

Рекомендована література
1. Юров В.И. Assembler. Учебник для вузов. 2-е изд. – СПб.:
Питер, 2003.
2. Зубков С.В. Assembler для DOS, Windows и Unix. – М.: ДМК
Пресс, 2000.
3. Митницкий В.Я. Архитектура IBM PC и язык Ассемблера:
Учеб. Пособие. – М: МФТИ, 2000.
4. Схемотехніка електронних систем: У 3 кн. Кн. 3.
Мікропроцесори та мікроконтролери: Підручник / В.І. Бойко,
А.М. Гуржий, В.Я. Жуйков та ін. – К.: Вища шк., 2004.
5. Микропроцессорный
комплект
К1810:
Структура,
программирование, применение: Справочная книга / Ю.М.
Казаринов, В.Н. Номоконов, Г.С. Подклетнов, Ф.В. Филиппов;
Под ред. Ю.М. Казаринова. – М.: Высш. шк., 1990.
English     Русский Правила