Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






А л г о р и т м р о б о ч о г о ц и к л у

 

 

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

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

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

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

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

│ ------- 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, тобто перетворення слова в подвійне слово.

 

 

4.4. Приклади розробки і виконання програми на мові асемблера

 

4.4.1. Постановка задачі

Розробити програму обчислення значення виразу:

де A=32d=20h, B=–5, C=432d=1B0h і D=–6 коефіцієнти виразу.

 

4.4.2. Вимоги до програми

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

Вихідні, проміжні і результуючі дані розмістити в пам'яті ЕОМ, починаючи з чергового за програмою параграфом. Результуюче значення виразу, що дорівнює , вивести на екран.

 

4.4.3. Розробка алгоритму і програми

 

а) Розподіл пам'яті

Коефіцієнти A, B, C, D і результат Y - це змінні величини, значення яких повинні бути розміщені в комірках пам'яті з чергового параграфа, що йде за програмою, яка робить обчислення.

Для написання програми нам знадобиться 16 машинних команд.

Якщо кожна з цих команд програми буде мати довжину навіть по чотири байти (16*4=64d=40h), а сама програма буде розташована в кодовому сегменті, починаючи із зміщення 0100h, то очікувана адреса першої вільної комірки пам'яті повинна бути: 0100h+40h=0140h.

 

Простор первинних

x0 x1 x2 x3 x4 x5 x6 x7

┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬

0x│ ADD │ ADD w │ ADD d │ADD d w│ ADD │ ADD w │ PUSH │ POP │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ ES │ ES │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

1x│ ADC │ ADC w │ ADC d │ADC d w│ ADC │ ADC w │ PUSH │ POP │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ SS │ SS │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

2x│ AND │ AND w │ AND d │AND d w│ AND │ AND w │SEGMENT│ DAA │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ ES │ │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

3x│ XOR │ XOR w │ XOR d │XOR d w│ XOR │ XOR w │SEGMENT│ AAA │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ SS │ │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

4x│ INC │ INC │ INC │ INC │ INC │ INC │ INC │ INC │

│ AX │ CX │ DX │ BX │ SP │ BP │ SI │ DI │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

5x│ PUSH │ PUSH │ PUSH │ PUSH │ PUSH │ PUSH │ PUSH │ PUSH │

│ AX │ CX │ DX │ BX │ SP │ BP │ SI │ DI │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

6x│PUSH A │ POP A │ BOUND │ ARPL │XXXXXXX│XXXXXXX│XXXXXXX│XXXXXXX│

│ 2 │ 2 │ 2 │ 2 │XXXX 3 │XXXX 3 │XXXX 3 │XXXX 3 │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

7x│ JO │ JNO │JB/JNAE│JNB/JAE│ JE/JZ │JNE/JNZ│JBE/JNA│JNBE/JA│

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

8x│... │...w │XXXXXXX│...d w │ TEST │ TEST w│ XCHG │ XCHG w│

│ │ │XXXXXXX│ │r/m,reg│r/m,reg│r/m,reg│r/m,reg│

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

9x│ XCHG │ XCHG │ XCHG │ XCHG │ XCHG │ XCHG │ XCHG │ XCHG │

│ AX,AX │ CX,AX │ DX,AX │ BX,AX │ SP,AX │ BP,AX │ SI,AX │ DI,AX │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Ax│ MOV │ MOV w │ MOV │ MOV w │ MOVS │ MOVS w│ CMPS │ CMPS w│

│AL,mem │AX,mem │mem,AL │mem,AX │ │ │ │ │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Bx│ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │

│AL,imm │CL,imm │DL,imm │BL,imm │AH,imm │CH,imm │DH,imm │BH,imm │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Cx│... │...w │RETnear│ RET │ LES │ LDS │ MOV │ MOV │

│ 2 │ 2 │ imm16 │ near │reg,r/m│reg,r/m│r/m,imm│r/m,imm│

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Dx│... │...w │...v │... v w│ AAM │ AAD │XXXXXXX│ XLAT │

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Ex│LOOPNZ/│ LOOPZ/│ LOOP │ JCXZ │ IN │ IN w │ OUT │ OUT │

│LOOPNE │ LOOPE │ │ │AL,port│AX,port│port,AL│port,AX│

├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼

Fx│ LOCK │XXXXXXX│REP/.NZ│REPE/.Z│ HLT │ CMC │... │...w │

└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴

┌──────────────┬───────┬───────┬───────┬───────┬

│ Первичный │ Байт 2, биты

│ код операции │ 000 │ 001 │ 010 │ 011 │

Простор ├──────────────┼───────┼───────┼───────┼───────┼

│ 80 или 81 │ ADD │ OR │ ADC │ SBB │

вторинних ├──────────────┼───────┼───────┼───────┼───────┼

│ 83 │ ADD │ │ ADC │ SBB │

кодів ├──────────────┼───────┼───────┼───────┼───────┼

│ F6 или F7 │ TEST │ │ NOT │ NEG │

операцій ├──────────────┼───────┼───────┼───────┼───────┼

│ FE │ INC │ DEC │ │ │

МП 8086 ├──────────────┼───────┼───────┼───────┼───────┼

│ FF │ INC w │ DEC w │CALL nr│CALL fr│

└──────────────┴───────┴───────┴───────┴───────┴

 

кодів операцій МП 8086

x8 x9 xA xB xC xD xE xF

┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐

│ OR │ OR w │ OR d │ OR w d│ OR │ OR w │ PUSH │XXXXXXX│

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ CS │XXX 2 3│

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ SBB │ SBB w │ SBB d │SBB d w│ SBB │ SBB w │ PUSH │ POP │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ DS │ DS │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ SUB │ SUB w │ SUB d │SUB d w│ SUB │ SUB w │SEGMENT│ DAS │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ CS │ │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ CMP │ CMP w │ CMP d │CMP d w│ CMP │ CMP w │SEGMENT│ AAS │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│ AL,imm│ AX,imm│ DS │ │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ DEC │ DEC │ DEC │ DEC │ DEC │ DEC │ DEC │ DEC │

│ AX │ CX │ DX │ BX │ SP │ BP │ SI │ DI │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ POP │ POP │ POP │ POP │ POP │ POP │ POP │ POP │

│ AX │ CX │ DX │ BX │ SP │ BP │ SI │ DI │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ PUSH │ IMUL │PUSH S │IMUL S │ INS │ INS w │ OUTS │OUTS w │

│ imm 2│ imm 2│ imm 2│ imm 2│ 2 │ 2 │ 2 │ 2 │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ JS │ JNS │ JP/JPE│JNP/JPO│JL/JNGE│JNL/JGE│JLE/JNG│JNLE/JG│

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ MOV │ MOV w │ MOV d │MOV d w│ MOV │ LEA │ MOV │... │

│r/m,reg│r/m,reg│reg,r/m│reg,r/m│r/m,seg│reg,r/m│seg,r/m│ │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ CBW │ CWD │ CALL │ WAIT │ PUSHF │ POPF │ SAHF │ LAHF │

│ │ │ far │ │ │ │ │ │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ TEST │ TEST w│ STOS │ STOS w│ LODS │ LODS w│ SCAS │ SCAS w│

│AL,imm │AX,imm │ │ │ │ │ │ │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │ MOV │

│AX,imm │CX,imm │DX,imm │BX,imm │SP,imm │BP,imm │SI,imm │DI,imm │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ ENTER │ LEAWE │RET far│ RET │ INT │ INT │ INTO │ IRET │

│ 2 │ 2 │ imm16 │ far │ type 3│ │ │ │

┼───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┤

│ ESC 0 ─ 7 287, 387, 486, 586. │

┼───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┤

│ CALL │ JMP │ JMP │ JMP │ IN │ IN w │ OUT │ OUT w │

│ near │ near │ far │ short │AL,dx │AX,dx │ dx,AL │ dx,AX │

┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤

│ CLC │ STC │ CLI │ STI │ CLD │ STD │... │... w │

┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘

┬───────┬───────┬───────┬───────┐

5, 4, 3 │

│ 100 │ 101 │ 110 │ 111 │

┼───────┼───────┼───────┼───────┤

│ AND │ SUB │ XOR │ CMP │

┼───────┼───────┼───────┼───────┤

│ │ SUB │ │ CMP │

┼───────┼───────┼───────┼───────┤

│ MUL │ IMUL │ DIV │ IDIV │

┼───────┼───────┼───────┼───────┤

│ │ │ │ │

┼───────┼───────┼───────┼───────┤

│ JMP nr│JMP far│ PUSH │ │

┴───────┴───────┴───────┴───────┘

 


Так як при завантаженні налагоджувача debug.com вміст CS дорівнює DS,.то в оперативній пам’ті, починаючи з адреси DS:0140, необхідно буде розташувати чисельні значення вихідних, проміжних і результуючих даних таким чином:

DS: 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 014A 014B 014C 014D

байт байт мбайт сбайт байт байт мбайт сбайт мбайт сбайт мбайт сбайт мбайт сбайт

2 0 F B B 0 0 1 F A ?? ?? ?? ?? ?? ?? ?? ?? ??

В и х і д н і д а н і. П р о м і ж н і д а н і Р е з у л ь т у ю ч і д а н і

A B C D Znam Chis Остача Частка

 

б) Розробка алгоритму і програми.

al:=Bбайт mov al, [0141] Завантаження числового значення коеф. B із сегмента даних у регістр AL процесора. Після виконання команди: AX=??FB al:=al+Dбайт add al, [0144] Додавання вмісту AL із числовим значенням коеф. D і запис результату в AL. Після виконання команди: AX=??F5 ax:=al*Bбайт imul byte ptr [0141] Множення вмісту AL на числове значення коеф. B і запис результату в AX. Після виконання команди: AX=0037 Znam:=ax mov [0146], ax Запис значення знаменника в комірку пам'яті. al:=Dбайт mov al, [0144] Завантаження числового значення коеф. D із сегмента даних у регістр AL процесора. Після виконання команди: AX=00FA ax:=Dслово cbw Перетворення байта коеф. D у слово для роботи з коеф. C. Після виконання команди: AX=FFFA ax:=ax+Cслово add ax, [0142] Додавання вмісту AX з коеф. C і запис результату в регістр AX. Після виконання команди: AX=01AA Chis:=ax mov [0148], ax Запис значення чисельника в комірка пам'яті. al:=Aбайт mov al, [0140] Завантаження числового значення коеф. A із сегмента даних у регістр AL процесора. Після виконання команди: AX=0120 al:=–Aбайт neg al Формування негативного значення коеф. A Після виконання команди: AX=01E0 ax:=–Aслово cbw Перетворення байта коеф. (– A) у слово для роботи із значен- ням чисельника Chis. Після виконання команди: AX=FFE0 Пр:=ax*Chis imul word ptr [0148] Формування добутку в регістрах DX і AX Після виконання команди: DX=FFFF, AX=CAC0 Ч/Зал.:= idiv word ptr [0146] Ділення вмісту DX:AX на числове значення Znam і запис частки в регістр AX, а остачі від ділення в регістр DX. Після виконання команди: DX=FFD1, AX=FF09 ax:=ax+252 add ax, 00FC Додавання вмісту AX із значенням 252 і запис результату в регістр AX. Після виконання команди: AX=0005 Yціле:=ax mov [014C], ax Запис значення виразу Yціле в комірку пам'яті Частка. Yостача:=dx mov [014A], dx Запис значення виразу Yостача в комірку пам'яті ОСТАЧА. К і н е ц ь int 20 Передача управління в debug.com

4.4.4. Робота в середовищі налагоджувача

1) Створимо середовище налагоджувача debug.com: F:\912\91205>debug.com, переглянемо вміст регістрів МП.

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0100 NV UP EI PL NZ NA PO NC

1DB6:0100 0F DB 0F

2) Введемо в мнемокодах асемблера команди програми, починаючи з адреси CS:0100:

{Адреса 1-іх} { К о м а н д и } { Довжина }

{байт команд} {п р о г р а м и} { команди }

-a cs:100

1DB6:0100 mov al, [0141] {3 байта}

1DB6:0103 add al, [0144] {4 байта}

1DB6:0107 imul byte ptr [0141] {4 байта}

1DB6:010B mov [0146], ax {3 байта}

1DB6:010E mov al, [0144] {3 байта}

1DB6:0111 cbw {1 байт}

1DB6:0112 add ax, [0142] {4 байта}

1DB6:0116 mov [0148], ax {3 байта}

1DB6:0119 mov al, [0140] {3 байта}

1DB6:011C neg al {2 байта}

1DB6:011E cbw {1 байт}

1DB6:011F imul word ptr [0148] {4 байта}

1DB6:0123 idiv word ptr [0146] {4 байта}

1DB6:0127 add ax, 00FC {3 байта}

1DB6:012A mov [014C], al {3 байта}

1DB6:012D mov [014A], dx {4 байта}

1DB6:0131 int 20 {2 байта}

3) Переглянемо вміст 33h=51d байт пам'яті, починаючи з байта CS: 0100, диасемблюючи (інтерпретуючи) їхні шістнадцяткові коди в мнемонічні команди мови асемблера: -u cs:100 L 33

{Адреса 1-іх} {Коди машиних} { К о м а н д и } { Код операції}

{байт команд} {команд в 16с/ч} {п р о г р а м и} { к о м а н д и }

1DB6:0100 A04101 MOV AL, [0141] A0

1DB6:0103 02064401 ADD AL, [0144] 02

1DB6:0107 F62E4101 IMUL BYTE PTR [0141] F6

1DB6:010B A34601 MOV [0146], AX A3

1DB6:010E A04401 MOV AL, [0144] A0

1DB6:0111 98 CBW 98

1DB6:0112 03064201 ADD AX, [0142] 03

1DB6:0116 A34801 MOV [0148], AX A3

1DB6:0119 A04001 MOV AL, [0140] A4

1DB6:011C F6D8 NEG AL F6

1DB6:011E 98 CBW 98

1DB6:011F F72E4801 IMUL WORD PTR [0148] F7

1DB6:0123 F73E4601 IDIV WORD PTR [0146] F7

1DB6:0127 05FC00 ADD AX, 00FC 05

1DB6:012A A34C01 MOV [014C], AX A3

1DB6:012D 89164A01 MOV [014A], DX 89

1DB6:0131 CD20 INT 20 CD

4) Визначимо призначення двійкових розрядів у декількох створених машинних командах (користуємось таблицею простору первинних і вторинних кодів операцій процесора 80x86 - стор.18-19).

 

- приймач - al (w=0) - джерело - пряма адресація одного байта (w=0) пам'яті DS:0141 02064401 add reg, r/m

 

A04101 mov al, mem
1010 000 0 0100 0001 0000 0001
- mod=00, r/m=110 - пряма адресація одного байта (w=0) пам'яті ds:0144 (джерело) - reg=000, w=0, d=1 -приймач al

Код опер. w адрес-млад. адрес-старш.

 

 

F62E4101 imul r/m - mod=00, r/m=110 - пряма адресація одного байта (w=0) пам'яті ds:0141 (джерело) приймач - al (w=0); - байт 2, біти 5:3 =101, тобто imul r/m; - результат - ax 05FC00 add ax, дані - приймач - ax (w=1) - 2-3 байти є без- посередні дані в машинній команді   F73E4601 idiv r/m - mod=00, r/m=110 - пряма адресація одного слова (w=1) пам'яті ds:0146 (джерело) - приймач - ax (w=1); - байт 2, біти 5:3=111 тоб то idiv r/m; - результат: частка - ax, остача – dx   89164A01 mov mem, dx - джерело - dx (w=1); - приймач - адреса слова (w=1) пам'яті DS:014A 98 cbw - поширення знака числа в регістрі al на регістр ah, тобто перетворення байта в слово CD20 int 20 - вихід із поточної програми і передача управління батьківській програмі, тобто програми debug. com
0000 00 1 0 00 000 110 0100 0100 0000 0001

Код оп. d w mod reg r/m адрес-мол. адрес-старш

 

 

1111 01 1 0 00 101 110 0100 0001 0000 0001

Код оп. d w mod imul r/m адрес-мол. адрес-старш

 

 

0000 010 1 1111 1100 0000 0000

Код опер. w дані дані (w=1)

 

 

1111 01 1 1 00 111 110 0100 0110 0000 0001

Код оп. d w mod idiv r/m адрес-мол. адрес-старш

 

1000 000 1 00 010 110 0100 1010 0000 0001

Код опер. w mod reg r/m адрес-мол. адрес-старш

 

1001 1000

Код операції

 

1100 1101 0010 0000

Код операції Тип переривання

 

5) Введемо з комірки DS:0140 значення коефіцієнтів A, B, C, D і код символу * рівний 2A (на плановане місце замість розташування проміжних і результуючих даних):

-e ds:0140 20 fb b0 01 fa 2a 2a 2a 2a 2a 2a 2a 2a 2a

 

6) Переглянемо вміст 14 байт пам'яті створеної області вихідних і інших даних: -d ds:0140 L е

шістнадцяткові з н а ч е н н я символьні значення

1DB6:0140 20 FB B0 01 FA 2A 2A 2A-2A 2A 2A 2A 2A 2A....*********

 

7) Переглянемо вихідний дамп пам'яті (4E байт) перед виконанням програми: -d cs:100 L 4е

1DB6:0100 A0 41 0102 06 44 01F6 2E 41 01A3 46 01A0 44. A... D... A..F..D

1DB6:0110 019803 06 42 01A3 48 01A0 40 01F6 D898F7....B..H..@.....

1DB6:0120 2E 48 01F7 3E 46 0105 FC 00A3 4C 0189 16 4A. H..>F..... L... J

1DB6:0130 01CD 20 8E C2 AC 8A D0 00 00 4E AD 8B C8 46 8A......... N... F.

1DB6:0140 20FBB0 01FA2A 2A 2A 2A 2A 2A 2A 2A 2A....*********

Виділені тут групи байтів і одиничні байти являють собою машинні команди і вихідні дані нашої програми.

 

8) Виконаємо трасування введеної програми

 

8-1) Переглянемо вміст регістрів МП і переконаємося, що CS: IP вказують на першу команду програми: -r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0100 NV UP EI PL NZ NA PO NC

1DB6:0100 A04101 MOV AL, [0141] DS: 0141=FB

 

8-2) Виконаємо першу машинну команду A02001, тобто mov al, [0120], де [0120]=12h. -t

AX=00FB BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0103 NV UP EI PL NZ NA PE NC

1DB6:0103 02064401 ADD AL, [0144] DS:0144=FA

Бачимо, що AX містить тепер 00FBh, IP=0103 вказує на перший байт другої команди 02064401, тобто add al, [0144], а вміст комірки DS: 0144 = FA = – 6 d.

 

8-3) Послідовно набираючи команду налагоджувача t і аналізуючи після кожної виконаної машинної команди вміст регістрів МП, порівнюємо очікувані й одержувані проміжні і кінцеві результати роботи програми:-t

AX=00F5 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0107 NV UP EI NG NZ AC PE CY

1DB6:0107 F62E4101 IMUL BYTE PTR [0141] DS: 0141=FB

Дійсно: (– 5) + (– 6) = – 11 або FB + FA = F5

-t

AX=0037 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=010B NV UP EI PL NZ NA PE NC

1DB6:010B A34601 MOV [0146], AX DS: 0146=2A2A

Дійсно: (– 11) * (– 5) = 55 або 0037h

-t

AX=0037 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=010E NV UP EI PL NZ NA PE NC

1DB6:010E A04401 MOV AL, [0144] DS:0144=FA

-t

AX=00FA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0111 NV UP EI PL NZ NA PE NC

1DB6:0111 98 CBW

-t

AX=FFFA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0112 NV UP EI PL NZ NA PE NC

1DB6:0112 03064201 ADD AX, [0142] DS: 0142=01B0

-t

AX=01AA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0116 NV UP EI PL NZ NA PE CY

1DB6:0116 A34801 MOV [0148], AX DS:0148=2A2A

Дійсно: (– 6) + 432 = 426 або FFFA + 01B0 = 01AA

-t

AX=01AA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0119 NV UP EI PL NZ NA PE CY

1DB6:0119 A04001 MOV AL, [0140] DS: 0140=20

-t

AX=0120 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011C NV UP EI PL NZ NA PE CY

1DB6:011C F6D8 NEG AL

-t

AX=01E0 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011E NV UP EI NG NZ NA PO CY

1DB6:011E 98 CBW

Дійсно: 0 – 32 = – 32 або E0

-t

AX=FFE0 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011F NV UP EI NG NZ NA PO CY

1DB6:011F F72E4801 IMUL WORD PTR [0148] DS: 0148=01AA

 

 

-t

AX=CAC0 BX=0000 CX=0000 DX=FFFF SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0123 NV UP EI NG NZ NA PE NC

1DB6:0123 F73E4601 IDIV WORD PTR [0146] DS: 0146=0037

Дійсно: (– 32) * 426 = – 13 632 або – 3540h = FFFF CAC0

-t

AX=FF09 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0127 NV UP EI PL NZ NA PO CY

1DB6:0127 05FC00 ADD AX, 00FC

Дійсно: (– 13 632) div 55 = – 247 або – F7h = FF09

(– 13 632) mod 55 = – 47 або – 2Fh = FFD1

-t

AX=0005 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=012A NV UP EI PL NZ AC PE CY

1DB6:012A A34C01 MOV [014C], AX DS: 014C=2A2A

Дійсно: (– 247) + 252 = 5 або (– F7h = FF09) + 00FC = 0005

-t

AX=0005 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=012D NV UP EI PL NZ AC PE CY

1DB6:012D 89164A01 MOV [014A], DX DS: 014A=2A2A

-t

AX=0005 BX=0000 CX=004E DX=FFD1 SP=FFFE BP=0000 SI=0000 DI=0000

DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0131 NV UP EI PL NZ AC PE CY

1DB6:0131 CD20 INT 20

-g Program terminated normally

-q

8-4) Переглянемо вихідний дамп пам'яті (4E байт) після виконання програми: -d cs:100 L 4е

1DB6:0100 A0 41 01 02 06 44 01 F6 2E 41 01 A3 46 01 A0 44. A... D... A..F..D

1


<== предыдущая | следующая ==>
 | Міністерства

Date: 2015-10-19; view: 364; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию