Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 байт байт мбайт сбайт байт байт мбайт сбайт мбайт сбайт мбайт сбайт мбайт сбайт
В и х і д н і д а н і. П р о м і ж н і д а н і Р е з у л ь т у ю ч і д а н і A B C D Znam Chis Остача Частка
б) Розробка алгоритму і програми.
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).
Код опер. w адрес-млад. адрес-старш.
Код оп. d w mod reg r/m адрес-мол. адрес-старш
Код оп. d w mod imul r/m адрес-мол. адрес-старш
Код опер. w дані дані (w=1)
Код оп. d w mod idiv r/m адрес-мол. адрес-старш
Код опер. w mod reg r/m адрес-мол. адрес-старш
Код операції
Код операції Тип переривання
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
|