Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М01_Архитектура.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.45 Mб
Скачать

4.3.1 Формат команди мови асемблера в середовищі debug. Com

Кожна команда мови асемблера визначає дію процесора і в середовищі налагоджувача debug.com. може мати до двох полів наступного виду: Мнемокод [ Операнд [,Операнд]]

Наприклад: add cx , 12

imul bx

idiv byte ptr [013A]

ret

Єдине обов'язкове поле - поле м н е м о к о д у (коду) операції. Це поле визначає ту команду, яку повинен виконати процесор. Формат команди є плаваючим, тобто між полями команди повинен бути один або більше пробілів.

Поле операндов містить додаткову інформацію про команду, наприклад, про розміри, що беруть участь в операції. Поле операндів визначається кодом операції. Кожному коду операції повинно відповідати певне число операндів.

4.3.2 Команди мови асемблера

Система команд процесора 8086 містить 135 базових команд. За функціональною ознакою вона підрозділяється на шість груп: 1) пересилка даних; 2) арифметичні операції; 3) логічні операції і зміщення; 4)передача управління; 5) обробка ланцюжків; 6) управління процесором.

Кожна з перших трьох груп у свою чергу підрозділяється на ряд підгруп в залежності від того, чи працює команда над безпосередніми даними, регістрами або областями пам'яті, чи опрацьовують байти або слова, а також, який (із семи можливих) прийнятий режим адресації даних Завдяки цьому, число можливих варіантів команд, які може виконати процесор, тобто число різноманітних машинних кодів, перевищує 3800.

З 135 базових команд процесора 8086 найбільший інтерес при першому знайомстві з мовою асемблера, становлять три команди групи передачі даних (mov, xchg, lea) і 12 основних команд арифметичних операцій (add, inc, sub, dec, mul, imul, div, idiv, neg, cmp, cbw, cwd), що показують обчислювальні можливості процесора.

Далі при опису операндів зазначенних команд застосовуються такі позначення:

ax, bx, cx, dx, bp, sp, si, di, ip – 16-розрядні (r16) регістри

ac – акумулятор (al або ax),

al, ah, bl, bh, cl, ch, dl, dh – 8-розрядні (r8) регістри

sr – сегментний регістр,

cs, ss, es, ds – сегментні регістри

op – операнд,

op1 – операнд-приймач (змінюється при виконанні команди),

op2 – операнд-джерело (не змінюється при виконанні команди),

data, imm – безпосередній операнд

Команди пересилки даних. Здійснюють передачу виду регістр–регістр, регістр–пам'ять і пам'ять–регістр.

Команда MOV ор1, ор2 пересилає вміст другого операнда (op2) у перший (op1). При цьому вміст op2 не змінюється. Перший операнд (op1) може бути заданий у регістрі загального призначення, регістрі сегмента (крім регістра CS) або комірки пам'яті. Другий операнд, крім того, може бути ще і безпосереднім операндом. Проте, адресувати дві комірки пам'яті не можна. Алгоритм: (op1) := (op2) Приклад:

1. Нехай регістр CX містить слово 0123h, а регістр DX – слово 4567h. Після трансляції команди MOV CX, DX у машинний код і його виконання вмістом регістра CX буде слово 4567h, а вміст регістра DX не зміниться.

2. Нехай регістр AH містить число 89h, а комірка пам'яті REZ2 містить 27h. Після виконання команди MOV REZ2, AH вмістом комірка пам'яті REZ2 буде число 89h, а вміст регістра AH не зміниться.

А Л Г О Р И Т М Р О Б О Ч О Г О Ц И К Л У

┌--------------►------------------------------------------►-----------┐

│ ┌---------▼--------┐

│ │Выборка очередного│

│ │ байта команды │>==========

│ Регистр очереди команд ├---┬--┬--┬--┬--┬--┤◄==========

------- 6 байт ------►└---┴--┴-┬┴--┴--┴--┘

│ ┌-------------------------------┐

│ │ Процедура тандемных пересылок │◄--- Нет -◄----------

│ │байт из регистра очереди команд├-►------- Да----►

│ └-------------------------------┘

│ │ Да

│ ┌-----▼---------------------

│ ┌-------------------------------------------◄│ 1.Определение т

│ │ ┌-------------------◄│ (2.Определение данных ко

│ │ │ └-----┬-------------------┬-

│ Команды Арифметические Логические Команды пе

│ пересылки данных команды команды управле

│ │ │ │ │

│ ┌--------------▼-----------------------▼------------------------- ▼-------------------▼-

│ │ О п р е д е л е н и е с п о с о б а а д р е с а ц и и о п е р а н

│ │ (reg,reg) (reg,data) (reg,mem; mem,reg; mem,data)

│ └------------------┬-----------------------------┬------------┬-------------------------

│ Регистровая │ Непосредственная │ │ Адресация памяти

│ адресация (1) │ адресация (2) │ │ (3,4,5,6,7)

│ ┌------------------▼----┐ ┌-------------------▼----┐ ┌---▼--------------------┐

│ │ Размещение содержимого│ │Размещение следующего │ │ Формирование адреса │

│ │ регистров в регистрах │ │байта команды в регистре│ │ памяти операнда │

│ │ временного хранения │ │временного хранения │ ├------------------------┤

│ └-----------┬-----------┘ └------------┬-----------┘ │ В ы б о р к а операнда │

│ └-►------------┬------------◄-┘ ├------------------------┤

│ │ │ Операнд в │ >==

│ ▼ │ регистре │ ◄==

│ │ │ ----------------┤

│ │ │ Операнд в │ >==

│ │ │ памяти │ ◄==

│ │ │ ------------┤

│ │ │ Операнд │ >==

│ │ │ в ВУ │ ◄==

│ │ │ ---------┤

│ │ │ Операнда │

│ │ │ нет │

▲ │ └------------┬-----------┘

│ ┌--- Ожидание ----------►│

├-◄--------◄-┐ │ │ │

▲ │ │ │ Нет

│ ┌---------┴------------┐ │ └--------------◄---

│ │ Обработка прерывания │ │

│ │системной стандартной│ │

│ │программой(процедурой)│ │ │ Да

│ │,адрес которой опреде-│ │ ┌------------ -▼--------------┐

│ │ляется по типу прерыв.│ │ │ Размещение операнда(ов) в │

│ └---------▲------------┘ │ │регистрах временного хранения│

│ │ │ └--------------┬--------------┘

│ ┌---------┴---------┐ │ ╔══════════════▼══════════════╗

│ │ Определение типа │ └------►--------------------►║ В ы п о л н е н и е команды

│ прерывания ◄-------Да----◄---------◄--┐ ╚══════════════╤══════════════╝

│ └-------------------┘ ┌------------▼-----------┐

│ │ │ >==

└------------------------◄-----Нет---◄----- ◄-┤ Запись результата │ ◄==

│ выполненной команды │

│(зачастую в 1-й операнд)│ >==

▲ │ и фиксация │ ◄==

-----►┌-------┴-------┐ │ признаков результата │

Требование -----►│ С и с т е м а │ │ в регистре флагов │ >==

прерываний -----►│ прерываний │ │ │ ◄==

-----►└---------------┘ └------------------------┘

К О М А Н Д И Ц П 80х86

┌-------------------┬-------------------┬-------------------¬

│ Регистры │ Память │Внешние устройства │

├------------------ ┼-------------------┼-------------------┤

│ │ ┌-------------┐ │ │

=================► Адрес >=========================► │ сегмент │ │ │

==================< Команда ◄========================< │ кода │ │ │

│ │ └-------------┘ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

------------------------┐ │ │ │ │

па операций │ │ │ │ │

анды и модификация IP) │ │ │ │ │

-----------------┬------┘ │ │ │ │

едачи Команды управления │ │ │ │

ия микропроцессором │ │ │ │

│ │ │ │ │

-----------------▼------------┐ │ │ │ │

о в │ │ │ │ │

│ │ │ │ │

------------------------------┘ │ │ │ │

Пять способов адресации │ │ │ │

памяти: │ │ │ │

- 3 - прямая; │ │ │ │

- 4 - косвенная; │ │ │ │

- 5 - косвенная со смещением; │ │ │ │

- 6 - базово-индексная; │ │ │ │

7 - базово-индексная со смещ. │ Регистры │ │ │

│ ┌---------------┐ │ │ │

=========► Адрес >===============►│ AX BX CX DX │ │ │ │

========< Данные ◄==============<│ SI DI SP BP │ │ │ │

│ └---------------┘ │ ┌-------------┐ │ │

====================► Адрес >======================► │ сегмент │ │ │

====================< Данные ◄======================< │ данных │ │ │

│ │ └-------------┘ │ ┌---------------┐ │

===========================► Адрес >===================================► │ Внешнее │ │

===========================< Данные ◄===================================< │ устройство │ │

│ │ │ └---------------┘ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ │ │ │

│ Регистры │ │ │

│ ┌---------------┐ │ │ │

=========► Адрес >===============►│ AX BX CX DX │ │ │ │

========< Данные ◄==============<│ SI DI SP BP │ │ │ │

│ └---------------┘ │ ┌-------------┐ │ │

====================► Адрес >======================► │ сегмент │ │ │

====================< Данные ◄======================< │ данных │ │ │

│ │ └-------------┘ │ ┌---------------┐ │

=============================► Адрес >==================================►│ Внешнее │ │

===========================< Данные ◄===================================< │ устройство │ │

│ │ │ └---------------┘ │

└-------------------┴--------------------┴-------------------

Команда XCHG ор1, ор2 змінює байти або слова, що адресуються операндами. Операнди можуть бути задані тільки в регістрах (крім сегментних) або комірках пам'яті. Алгоритм: (раб.яч.) := (op1); (op1) := (op2); (op2) := (раб.яч.);

Приклад. Нехай регістр AX містить число 2345h, а регістр CX – число 0FA3h. Виконується команда XCHG AX, CX. Новим вмістом регістра AX буде 0FA3h, а регістр CX - 2345h.

Команда LEA ор1, ор2. За цією командою 16-бітова переміщувана адреса другого операнда передається в регістр першого операнда. Перший операнд зберігається в 16-бітовому регістрі загального призначення, а другий операнд - в комірки пам'яті. Алгоритм: (op1) := Виконавча адреса op2

Приклад. Припустимо, що однослівна комірка пам'яті TEXT1 з адресою 82FCh містить число 65h. Виконується така послідовність команд: MOV CX, TEXT1 LEA SI, TEXT1. Після виконання цих команд регістри CX і SI будуть містити числа 65h і 82FCh відповідно.

Арифметичні команди (add, inc, sub, dec, neg, cmp, mul, imul, div, idiv, cbw, cwd). Процесор 8086 виконує чотири основні арифметичні дії (з різноманітними модифікаціями) над 8- і 16-розрядними цілими числами (операндами) за правилами арифметики з урахуванням і без урахування знака. Для чисел із знаком прийняте представлення в додатковому коді. При реалізації арифметичних дій встановлюються шість ознак результату (CF, PF, AF, ZF, SF, OF).

Команда ADD ор1, ор2. По цій команді здійснюється додавання першого і другого операндів. Результат поміщається на місце зберігання першого операнда. Попереднє значення першого операнда губиться. Вміст комірки другого операнда залишається незмінним. Місцем зберігання першого операнда може бути регістр або комірка пам'яті; другого операнда - регістр або комірка пам'яті, або він може бути заданий безпосереднім операндом. Не дозволяється використовувати для запису операндів сегментні регістри, а також комірки пам'яті для одночасного зберігання двох операндів. Алгоритм: (op1) := (op1) + (op2)

Приклад. Нехай регістр BL містить число 65h, однобайтова комірка пам'яті C2 містить 1Ah, а в регістрі прапорів процесора знаходиться число F847h.

Вміст регістра прапорів 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 = F847h

OF SF ZF AF PF CF

Вміст комірки C2 0000 1010 = 1Ah

Вміст регістра BL 0110 0101 = 65h

Розглянемо формиування бітів регістра прапорів. Після виконання команди ADD C2, BL в комірка пам'яті буде записане 7Eh, а в регістр прапорів - код F002h.

Новий вміст комірки C2 0111 1111 = 7Fh

Новий вміст регістра прапорів 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 = F002h

OF SF ZF AF PF CF

Число одиничних бітів в комірці пам'яті C2 після виконання команди дорівнює сім, тобто непарне число, тому біт паритету PF скидається в нуль. Біти SF і ZF обнуляються, так як результат операції - позитивне, відмінне від нуля число. Біти CF і OF також обнуляються через відсутність переносу і переповнювання відповідно. Біт AF має нульове значення, оскільки немає переносу з третього розряду результату.

Команда INC ор збільшує на 1 вміст вихідного операнда. Операнд - загальний регістр або комірка пам'яті. Команда може використовуватися як з однобайтними, так і двобайтними операндами. Операнди інтерпретуються як числа без знака. Команда впливає на прапори AF, OF, PF, SF і ZF. Алгоритм: (op) := (op) + 1

Команда SUB ор1, ор2 Вміст другого операнда при виконанні команди віднімається від вмісту першого операнда, результат поміщається на місце першого операнда. Перший операнд при цьому губиться, а другий залишається незмінним. Перший операнд може бути заданий у регістрі або комірки пам'яті. Другий операнд - регістр, комірка пам'яті або безпосередні дані. Не дозволяється використовувати для запису операндів сегментні регістри, а також комірки пам'яті для одночасного зберігання двох операндів. Алгоритм: (op1) := (op1) - (op2)

Приклад. Нехай регістр DL містить число 58h, регістр DH - число 20h і регістр прапорів процесора - число F046h. Після виконання команди SUB DL, DH у регістрі DL буде записане число 38h, а в регістр прапорів - код F002h.

Команда DEC ор зменшує на 1 вміст вихідного операнда. Операнд - загальний регістр або комірка пам'яті. Команда може використовуватися як з однобайтними, так і двобайтними операндами. Алгоритм: (op) := (op) - 1

Приклад. Нехай у регістрі DL записано 00. Виконується команда DEC DL. Новим вмістом регістра DL буде число FFh. Так як результат є негативним, відмінним від нуля числом у додатковому коді, прапор знака SF=1, а прапор нуля ZF=0.

Команда NEG ор робить віднімання вмісту операнда з нуля і розміщає результат на тому ж місці. Операнд - загальний регістр або комірка пам'яті. Команда може використовуватися як з однобайтними, так і двобайтними операндами. Команда NEG впливає на прапори CF, PF, AF, ZF, SF, OF. Алгоритм: (op) := - (op)

Приклад. Нехай у регістрі BX записано 2. Виконується команда NEG BX. Новим вмістом регістра BX буде число FFFEh, що є записом числа -2 у додатковому коді.

Команда CMP ор1, ор2 - порівняння операндів. Робить віднімання, подібно команді SUB, встановлює прапори CF, PF, AF, ZF, SF, OF, але самі операнди не змінює. Алгоритм: (op1) - (op2)

Приклад. Нехай у регістрі AX записане число 024Dh, у регістрі CX - 1823h, а в регістрі прапорів - число F046h. Після виконання команди CMP AX, CX у регістрі прапорів буде записане число F083h.

Команда MUL op - беззнакове множення вмісту акумулятора й операнда. Якщо операнд є байтом, то він множиться на вміст регістра AL і результат подвійної довжини (слово) записується в регістр AX. Якщо операнд - слово, то він множиться на вміст регістра AX і результат, подвійне слово, записується в пару регістрів DX і AX, причому регістр DX містить старші розряди результату. Операнд - загальний регістр або комірка пам'яті. Операнд не може бути безпосереднім значенням.

Алгоритм однобайтового множення: (AX) := (AL) * (op) Якщо (AH) = 0 , то (CF) := 0 і (OF) := 0

Якщо (AH) ¹ 0 , то (CF) := 1 і (OF) := 1

Алгоритм двобайтового множення: (DX, AX) := (AX) * (op) Якщо (DX) = 0 , то (CF) := 0 і (OF) := 0

Якщо (DX) ¹ 0 , то (CF) := 1 і (OF) := 1

Приклад. 1. Нехай регістр AL містить число 30h, однобайтова комірка пам'яті Const1 містить 12h. Виконується команда MUL Const1. Результат множення (12h * 30h = 360h) записується в регістр AX. Оскільки вміст регістра AH¹0, прапори CF і OF встановлюються в 1.

2. Нехай тепер регістр AX містить число 1000h, регістр BX - число 550h. Тоді після виконання команди MUL BX результат множення (1000h * 550h = 550 000h) буде записаний у пару регістрів DX і AX. Так як нове значення регістра DX = 0055h, прапори CF = OF = 1.

Команда IMUL op - знакове множення, подібна команді MUL.

Алгоритм однобайтового множення: (AX) := (AL) * (op) Якщо (AH) = знакове розширення (AL), то (CF):=0 і (OF):=0

Якщо (AH) ¹ знакове розширення (AL), то (CF):=1 і (OF):=1

Алгоритм двобайтового множення:(DX, AX):=(AX)*(op) Якщо (DX) = знакове розширення (AX), то (CF):=0 і (OF):=0

Якщо (DX) ¹ знакове розширення (AX), то (CF):=1 і (OF):=1

Команда DIV op - беззнакове ділення. Команда виконує ділення вмісту акумулятора і його розширення - ДІЛЕНЕ (AL і AH для 8-розрядної операції, AX і DX для 16-розрядної) на вміст, що адресується операндом (op) - ДІЛЬНИК, і розміщає ЧАСТКУ в акумуляторі ( AL або AX) і ОСТАЧУ одинарної довжини в розширенні акумулятора ( AH або DX ). Операнд - загальний регістр або комірка пам'яті.

Алгоритм однобайтового цілочисленного ділення: (AL) := (AX) div (op8) (AH) := (AX) mod (op8)

ЧАСТКА ДІЛЕНЕ ДІЛЬНИК ОСТАЧА ДІЛЕНЕ ДІЛЬНИК

Алгоритм двобайтового целочисленного ділення:(AX):=(Dx,AX) div (op16) (DX):=(DX,AX) mod (op16)

ЧАСТКА ДІЛЕНЕ ДІЛЬНИК ОСТАЧА ДІЛЕНЕ ДІЛЬНИК

Приклади: 1. Нехай регістр AX містить число 0047h , регістр CL - число 12h. Виконується команда DIV CL. Частка від ділення (03h = 47h / 12) записується в регістр AL , а остача 11h - у регістр AH.

2. Роздивимося випадок, коли регістри DX і AX містять відповідно числа 0012h і F043h, що представляють 32-розрядне шістнадцяткове число 0012F043h, регістр BX містить число 4320h. Виконується команда DIV BX. Частка від ділення (0048h = 12F043h / 4320h) записується в регістр AX, а остача (0F43h) - у регістр DX.

Команда IDIV op - знакове ділення, працює подібно команді DIV , за винятком того, що вона робить ділення з урахуванням знака.

Команда CBW виконує розповсюдження знака числа в регістрі AL на регістр AH, тобто перетворення байта в слово.

Команда CWD виконує розповсюдження знака числа в регістрі AX на регістр DX, тобто перетворення слова в подвійне слово.