Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЕМСТ_Шпора(ALL).docx
Скачиваний:
1
Добавлен:
13.09.2019
Размер:
1.46 Mб
Скачать

89

  1. mov [bx+0d9feh], 0b6ceh | 81 AD D9 C6 BD A2

============== №1 Ассемблирование – mov [bx+0d9feh], 0b6ceh =============

Комментарий к команде: M(DS:Bx+0D9FEh) ← 0B6CEh

1-й байт(код операции):

из табл. команд, № 7 находим КОП 11000111b=C7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0d9feh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

111 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+disp= BX+0D9FEh.

Получаем второй байт: 10000111=87h.

3-й байт(dispLow):

FEh.

4-й байт(dispHigh):

D9h

5-й байт(dataLow):

CEh

6-й байт(dataHigh):

B6h

Машинный код команды: C7 87 FE D9 CE B6

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BX – база, 0d9feh – смещение относительно базы.

Правый операнд – непосредственная, 0b6ceh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды:

Время выполнения в тактах:

nТ = (n+Tиа) = 10+Tиа, где Tиа – время вычисления эффективного адреса: EA = BX+0D9FEh.

По таблице 11 находим, что для базовой адресации

Tиа = 9, тогда nТ = 10+9 = 19 тактов.

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

Tk = (n+Tиа)*tТ = nТ*tТ = 19*10-8 = 0,19 мкс, где

tТ = 1/fТ = 1/100000000 = 10-8.

=============== №2 Дизассемблирование – (81 AD D9 C6 BD A2) ===============

Задание: 81 AD D9 C6 BD A2

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –SUB (r/m <- r/m-data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

1010 1101b=ADh, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

101 – reg

101 – reg/mem, mod=10: левый операнд – DI+disp

3-й байт(dispLow):

D9

4-й байт(dispHigh):

С6

5-й байт(dataLow):

BD

6-й байт(dataHigh):

А2

Мнемоника команды: SUB [word DI+0C6D9h], 0A2BDh

Адрессация операндов:

Левый оператор – индексная, где DI – индекс, 0C6D9h – смещение

Правый оператор – непосредственная, 0A2BDh – непосредственное значение

Комментарий к команде: M(DS:DI+0C6D9h) <- M(DS:DI+0C6D9h)- 0A2BDh

Размещение команды в памяти:

Время выполнения:

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=8+9=17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,17 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати парні біти (тобто 0-й, 2-й, 4-й, 6-й), то маска буде мати вигляд 01010101. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,01010101:

XOR

Х

0

Х

1

Х

0

Х

1

Х

0

Х

1

Х

0

Х

1

Х

Х

Х

Х

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 30 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 30*4 = 120D = 0001111000В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000001111000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики (прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -15 буде віднято 46, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -15-46 можна замінити операцією -15+(-46). Для цього треба представити число -46 в додатковому коді: записуємо модуль цього числа в двійковій формі: 46D = 00101110B; інвертуємо отриманий результат: 11010001В; додаємо до отриманої комбінації одиницю:

+

1

0

1

0

0

0

1

0

0

0

0

0

0

0

1

1

1

1

0

1

0

0

1

0

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11010010В = 1 + 4 + 8 + 3 2 = 45. До отриманого результату додаємо одиницю і отримуємо 46, а оскільки знаковий розряд = 1, то маємо -46. Переведення в додатковий код виконано вірно. Таким же чином переведемо -15 в додатковий код: 15D = 00001111B; інвертуємо: 11110000В; додаємо одиницю: 11110001B. Робимо перевірку: 11110001B = 2 + 4 + 8 = 14. До отриманого результату додаємо одиницю і отримуємо 15, а оскільки знаковий розряд = 1, то маємо -15. Виконуємо операцію додавання над числами в додатковому коді:

+

1

1

1

1

0

1

1

1

0

0

0

0

1

0

0

1

1

1

1

0

0

0

0

1

1

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

+

1

1

1

1

0

1

0

1

0

1

0

1

1

1

1

1

1

1

1

0

0

0

0

1

0

Переведемо отриманий результат з додаткового коду в десяткову систему:

111000010 = (32 + 16 + 8 + 4 + 1) + 1 = 62D.

Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -62.

  1. ADD [DI+0C5BDh], 0D36Ah | 81 BC 9F 4B CD DB

============ №1 Ассемблирование – ADD [DI+0C5BDh], 0D36Ah ============

Комментарий к команде: M(DS:DI+0C5BDh) ← M(DS:DI+0C5BDh) + 0D36Ah

1-й байт(код операции):

из табл. команд, № 7 находим КОП 100000swb = 10000001b = 81h, sw=01, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0C5BDh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

101 – reg/mem: поле reg/mem =101, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=DI+disp.

Получаем второй байт: 10000101=85h.

3-й байт(dispLow):

BDh.

4-й байт(dispHigh):

C5h

5-й байт(dataLow):

6Ah

6-й байт(dataHigh):

D3h

Машинный код команды: 81 85 BD C5 6A D3

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где DI – база, 0C5BDh – смещение относительно базы.

Правый операнд – непосредственная, 0D36Ah – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды:

Время выполнения в тактах:

nТ = (n+Tиа) = 4/17+Tиа, где Tиа – время вычисления эффективного адреса.

По таблице 11 находим, что для базовой адресации

Tиа = 9, тогда nТ = 17+9 = 26 тактов.

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

Tk = (n+Tиа)*tТ = nТ*tТ = 26*10-7 = 2,6 мкс, где

tТ = 1/fТ = 1/10000000 = 10-7.

=============== №2 Дизассемблирование – (81 BC 9F 4B CD DB) ===============

Задание: 81 BC 9F 4B CD DB

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h – CMP (r/m – data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

1011 1100b=BCh, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение;

111 – reg

100 – reg/mem, mod=10: левый операнд – SI+disp

3-й байт(dispLow):

9F

4-й байт(dispHigh):

4B

5-й байт(dataLow):

CD

6-й байт(dataHigh):

DB

Мнемоника команды: CMP [word SI+04B9Fh], 0DBCDh

Адресация операндов:

Левый операнд – базовая, где SI – база, 04B9Fh – смещение

Правый операнд – непосредственная, 0DBCDh – непосредственное значение

Комментарий к команде: M(DS:SI+04B9Fh) – 0DBCDh

Размещение команды в памяти:

Время выполнения:

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=SI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-7=2,6 мкс, где

tТ=1/fТ=1/10000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати непарні біти (тобто 1-й, 3-й, 5-й, 7-й), то маска буде мати вигляд 10101010. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,10101010:

XOR

Х

1

Х

0

Х

1

Х

0

Х

1

Х

0

Х

1

Х

0

Х

Х

Х

Х

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, непарні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 32 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 32*4 = 128D = 0010000000В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000010000000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики (прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -20 буде віднято 44, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -20-44 можна замінити операцією -20+(-44). Для цього треба представити число -44 в додатковому коді: записуємо модуль цього числа в двійковій формі: 44D = 00101100B; інвертуємо отриманий результат: 11010011В; додаємо до отриманої комбінації одиницю:

+

1

0

1

0

0

0

1

0

0

0

0

0

1

0

1

1

1

1

0

1

0

1

0

0

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11010100В = 1 + 2 + 8 + 3 2 = 43. До отриманого результату додаємо одиницю і отримуємо 44, а оскільки знаковий розряд = 1, то маємо -44. Переведення в додатковий код виконано вірно. Таким же чином переведемо -20 в додатковий код: 20D = 00010100B; інвертуємо: 11101011В; додаємо одиницю: 11101100B. Робимо перевірку: 11101100B = 1 + 2 + 16 = 19. До отриманого результату додаємо одиницю і отримуємо 20, а оскільки знаковий розряд = 1, то маємо -20. Виконуємо операцію додавання над числами в додатковому коді:

+

1

1

1

1

0

1

1

0

0

1

1

1

0

0

0

0

1

1

1

0

0

0

0

0

0

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

+

1

1

1

1

0

1

0

1

0

1

0

1

0

1

0

1

1

1

0

1

1

1

1

1

1

Переведемо отриманий результат з додаткового коду в десяткову систему:

110111111 = 64 + 1 = 65D.

Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -65.

  1. sub [bx + 0bc5fh], 0e78dh | 81 83 B5 CA FD A4

============= №1 Ассемблирование – sub [bx + 0bc5fh], 0e78dh =============

Комментарий к команде: M(DS*16+ bx + 0bc5fh) - 0e78dh

r/m r/m – data

1-й байт(код операции):

из табл. комманд находим КОП 100000sw =10000001 = 81h

sw=01, так как есть data H.

2-й байт(постбайт):

md101 r/m = 10101111 = AFh

md = 10, так как смещение disp = 16 біт;

r/m = 111, так как исполнительній адрес = bx+disp

3-й байт:

Молодший байт від disp із першого операнду = 5Fh

4-й байт:

Старший байт від disp із першого операнду = BCh

5-й байт:

Молодший байт від другого операнду = 8Dh

6-й байт:

Старший байт від другого операнду = E7h

Машинный код команды: 81 AF 5F BC 8C 8D E7

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BX – база

Правый операнд – непосредственная

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)= 4/17+TИА, где Tиа – время вычисления эффективного адреса: EA=BX+0bc5fh.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 83 B5 CA FD A4) ==============

Задание: 81 83 B5 CA FD A4

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h – ADD (r/mr/m+data),

sw=01, т.е. операнд ы 16-ми разрядные.

2-й байт(постбайт):

1000 0011b=83h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0CAB5h);

011 – reg/mem, mod=10: левый операнд – BP+DI+disp

3-й байт(dispLow):

B5

4-й байт(dispHigh):

CA

5-й байт(dataLow):

FD

6-й байт(dataHigh):

A4

Мнемоника команды: ADD [BP+DI +0CAB5h], 0 A4FDh

Адрессация операндов:

Левый операнд – базово-индексная со смещением

Правый операнд – непосредственная

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA= BP+DI +data16.

По таблице 11 находим, что Tиа=11, тогда nТ=17+11=28 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,28 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Маска буде мати вигляд 00010101. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL, 01010101:

XOR

Х

0

Х

1

Х

0

Х

1

Х

0

Х

1

Х

0

Х

1

Х

Х

Х

Х

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 33 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 33*4 = 132D = 0010000100В. Таким чином повна 20-и розрядна фізична адреса обробника 33-ого переривання має вигляд: 00000000000010000100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -25 буде віднято 42, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -15-42 можна замінити операцією -15+(-46). Для цього треба представити число -42 в додатковому коді: записуємо модуль цього числа в двійковій формі: 42D= 00101010B; інвертуємо отриманий результат: 11010101В; додаємо до отриманої комбінації одиницю:

+

1

0

1

0

0

0

1

0

0

0

1

0

0

0

1

1

1

1

0

1

0

1

1

0

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11010110В = 1+8+32=41. До отриманого результату додаємо одиницю і отримуємо 42, а оскільки знаковий розряд = 1, то маємо -42.

Переведення в додатковий код виконано вірно. Таким же чином переведемо -25 в додатковий код: 25D = 00011001B; інвертуємо: 11100110В; додаємо одиницю: 11100111B. Робимо перевірку:

11100111B = 8 + 16 = 24. До отриманого результату додаємо одиницю і отримуємо 25, а оскільки знаковий розряд = 1, то маємо -25. Виконуємо операцію додавання над числами в додатковому коді:

+

1

1

1

1

0

1

1

0

0

0

1

1

1

1

0

1

1

1

0

1

1

1

1

0

1

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

+

1

1

0

1

1

1

1

1

1

1

1

1

0

1

1

1

1

1

0

1

1

1

1

0

0

Переведемо отриманий результат з додаткового коду в десяткову форму:

110111100В = (64 + 2 + 1) + 1 = 68D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -68.

  1. add [si + 0e56fh], 0f13eh | C7 80 DC CC 6C D3

============ №1 Ассемблирование – add [si + 0e56fh], 0f13eh =============

Комментарий к команде: M(DS:si+0E56Fh)←0F13Eh

1-й байт(код операции):

З табл. команд № 4 знаходимо КОП 100000sw, розширення знаком молодшого байта з 8-розрядної до 16-розрядної константи не відбувається, тому s=0. w=1, бо довжина операнда 16 біт.

10000001b=81h

2-й байт(постбайт):

md000r/m

поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0e56h);

так як використовується індексна адресація вигляду (SI)+data16, то mod=10, r/m=100, разом

10000100b=84h

3-й байт(dispLow):

6fh.

4-й байт(dispHigh):

e5h

5-й байт(dataLow):

3eh

6-й байт(dataHigh):

f1h

Машинный код команды: 81 84 6F E5 3E F1

Длина команды: 6 байт.

Способы адресации операндов:

Левый операнд – индексная, где SI – индекс, 0e56fh – смещение относительно индекса.

Правый операнд – непосредственная, 0f13eh – непосредственный 16-ти битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA= si + 0e56fh.

По таблице 11 находим, что для индексной адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-7=2,6 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (C7 80 DC CC 6C D3) ===============

Задание: C7 80 DC CC 6C D3

Длина команды: 6 байт.

1-й байт(код операции):

C7h=11000111b – MOV (r/m<-data) , поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

80h=10000000b,

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение;

000 – reg/mem, mod=10: левый операнд – (BX)+(SI) + DATA16

3-й байт(dispLow):

DC

4-й байт(dispHigh):

CC

5-й байт(dataLow):

6C

6-й байт(dataHigh):

D3

Мнемоника команды: MOV [BX+SI+0CCDCh], 0D36Ch

Адрессация операндов:

левый – базово-индексная со смещением, где DI – индекс, BX - база, 0CCDCh – смещение

правый – непосредственная, 0D36Ch – непосредственное значение

Комментарий к команде: M(DS: BX+SI+0CCDCh) <- 0D36Ch

Размещение команды в памяти:

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=(BX)+(SI) + DATA16.

По таблице 11 находим, что Tиа=11, тогда nТ=10+11=21 такт.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-7=2,1 мкс, где

tТ=1/fТ=1/10000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти №2, 4, 6, то маска буде мати вигляд 01010100. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,01010100:

X X X X X X X X

0 1 0 1 0 1 0 0

X X X X

Як бачимо, внаслідок виконання команди в регістр AL буде поміщена комбінація, 2, 4, 6 біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 35 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво (множення на 4) номеру переривання. Так для 35-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 35*4 = 140D = 0010001100В. Таким чином, повна 20-ти розрядна фізична адреса обробника 35-ого переривання має вигляд: 00000000000010001100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -30 буде віднято 40, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -30-40 можна замінити операцією -30+(-40). Для цього треба представити число -40 в додатковому коді: записуємо модуль цього числа в двійковій формі: 40D= 00101000B; інвертуємо отриманий результат: 11010111В; додаємо до отриманої комбінації одиницю:

11010111

1

11011000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11011000В = 1+2+4+32=39. До отриманого результату додаємо одиницю і отримуємо 40, а оскільки знаковий розряд = 1, то маємо -40. Переведення в додатковий код виконано вірно. Таким же чином переведемо -30 в додатковий код: 30D = 00011110B; інвертуємо: 11100001В; додаємо одиницю: 11100010B. Робимо перевірку: 11100010B = 1+4+8+16=29. До отриманого результату додаємо одиницю і отримуємо 30, а оскільки знаковий розряд = 1, то маємо -30. Виконуємо операцію додавання над числами в додатковому коді:

11011000

11100010

1 10111010

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10111010

11111111

1 10111001

Переведемо отриманий результат з додаткового коду в десяткову форму: 110111001В = 2+4+64+1=71D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -71.

  1. mov [bp+ di + 0185dh], 0f65dh | 81 B4 F2 D2 8F CD

============ №1 Ассемблирование – mov [bp+ di + 0185dh], 0f65dh ===========

Комментарий к команде: M(DS:bp+ DS:di+0185dh) ←0f65dh

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 11000011b=C7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0D9FEh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

011 – reg/mem: поле reg/mem =011, т.к. для вычисления EA используется bp и si

Получаем второй байт: 10000011=83h.

3-й байт(dispLow):

5Dh.

4-й байт(dispHigh):

18h

5-й байт(dataLow):

5Dh

6-й байт(dataHigh):

F6h

Машинный код команды: C7 83 5d 18 5d f6

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная со смещением, bp-база, di-индекс, 185dh -смещение

Правый операнд – непосредственная, 0f65dh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=bp+di+0185dh.

По таблице 11 находим, что для базовой адресации Tиа=11, тогда nТ=10+11=21 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-8=0,21мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 B4 F2 D2 8F CD) ===============

Задание: 81 B4 F2 D2 8F CD

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –XOR r/m r/mdata, поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

10110100b= B4h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

110 – reg

100 – r/m, mod=10: левый операнд – (SI) + disp16

3-й байт(dispLow):

F2

4-й байт(dispHigh):

D2

5-й байт(dataLow):

8F

6-й байт(dataHigh):

CD

Мнемоника команды: XOR [word SI+D2F2h], CD8Fh

Адресация операндов:

Левый операнд – индексная, где SI – индекс, D2F2h – смещение

Правый операнд – непосредственная, CD8Fh – непосредственное значение

Комментарий к команде: M(ES:SI+0 D2F2h) ← M(ES:SI+0 D2F2h) & 0CD8Fh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=SI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №3 Навести команду мікропроцесора x86… ================

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати 1-й,2-й,7-й,8-й біти, то маска буде мати вигляд 01100011. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,01010101:

Х

1

Х

1

Х

0

Х

0

Х

0

Х

0

Х

1

Х

1

Х

Х

Х

Х



Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, відповідні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 42 ===============

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 42-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 42*4 = 168D = 0010101000В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000010101000В.

============== №5 Виконати функцію … команди SBB AL, data8 =============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -35 буде віднято 38, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -35-38 можна замінити операцією -35+(-38). Для цього треба представити число -38 в додатковому коді: записуємо модуль цього числа в двійковій формі: 38D= 00100110B; інвертуємо отриманий результат: 11011001В; додаємо до отриманої комбінації одиницю:

1

0

1

0

0

0

1

0

1

0

0

0

0

0

1

1

1

1

0

1

1

0

1

0

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11011010В = 1+4+32=37. До отриманого результату додаємо одиницю і отримуємо 38, а оскільки знаковий розряд = 1, то маємо -38. Переведення в додатковий код виконано вірно. Таким же чином переведемо -35 в додатковий код: 35D = 00100011B; інвертуємо: 11011100В; додаємо одиницю: 11011101B. Робимо перевірку: 11011101B = 2+32=34. До отриманого результату додаємо одиницю і отримуємо 35, а оскільки знаковий розряд = 1, то маємо -35. Виконуємо операцію додавання над числами в додатковому коді:

1

1

1

1

0

0

1

1

1

1

1

0

0

1

1

0

1

1

0

1

1

0

1

1

1

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

+

1

1

0

1

1

1

1

1

0

1

1

1

1

1

1

1

1

1

0

1

1

0

1

1

0

Переведемо отриманий результат з додаткового коду в десяткову форму:

10110110В = (64 + 8 + 1) + 1 = 74D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -74.

  1. test [bx + 0e26bh], 0ffffh | F7 81 CC C5 FF FF

============= №1 Ассемблированиеtest [bx + 0e26bh], 0ffffh ===============

Комментарий к команде: M(D:bx+0e26bh) & 0ffffh

1-й байт(код операции):

из табл. Команд находим КОП 11110111b=F7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0e26bh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

111 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+disp= BX+0e26bh.

Получаем второй байт: 10000111=87h.

3-й байт(dispLow):

6Bh.

4-й байт(dispHigh):

E2h

5-й байт(dataLow):

FFh

6-й байт(dataHigh):

FFh

Машинный код команды: F7 87 6B E2 FF FF

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BX – база, 0e26bh – смещение относительно базы.

Правый операнд – непосредственная, 0ffffh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+0e26bh.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=10+9=19 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=19*10-7=1,9 мкс, где

tТ=1/fТ=1/100000000=10-7.

============= №2 Дизассемблирование – (F7 81 CC C5 FF FF B) ==============

Длина команды: 6 байт.

1-й байт(код операции):

11110111b=F7h –TEST (r/m & data), поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

10000001b=81h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c5cch);

000 – reg

001 – reg/mem, mod=10: левый операнд – BX+DI+disp

3-й байт(dispLow):

C5

4-й байт(dispHigh):

СC

5-й байт(dataLow):

FF

6-й байт(dataHigh):

FF

Мнемоника команды: TEST [bx + di + 0C5CCh], 0FFFFh

Адрессация операндов:

левый – базово-индексная со смещением, bx – база, di –индекс, 0C5CCh – смещение.

правый – непосредственная, 0FFFFh – непосредственное значение

Комментарий к команде: M(DS: BX+DI+0C5CCh)& 0FFFFh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

По таблице 11 находим, что Tиа=12, тогда nТ=10+12=22 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=22*10-7= 2.2 мкс, где

tТ=1/fТ=1/100000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти(3-й,4-й,6-й,7-й) то маска буде мати вигляд 11011000. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL, 11011000b:

X X X X X X X X

1 1 0 1 1 0 0 0

X X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 45 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0 до 255 і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 45-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 45*4 = 180 = 0010110100b. Таким чином повна 20-и розрядна фізична адреса обробника 45-ого переривання має вигляд: 00000000000010110100b.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -40 буде віднято 36, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -40-36 можна замінити операцією -40+(-36). Для цього треба представити число 36 в додатковому коді: записуємо модуль цього числа в двійковій формі: 36= 00100100b; інвертуємо отриманий результат: 11011011В; додаємо до отриманої комбінації одиницю:

11011011

1

1 1011100

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11011100b= 1+2+32=35. До отриманого результату додаємо одиницю і отримуємо 36, а оскільки знаковий розряд = 1, то маємо -36. Переведення в додатковий код виконано вірно. Таким же чином переведемо -40 в додатковий код: 40 = 00101000B; інвертуємо: 11010111В; додаємо одиницю: 11011000B. Робимо перевірку: 11011000B = 1+2+4+32=39. До отриманого результату додаємо одиницю і отримуємо 40, а оскільки знаковий розряд = 1, то маємо -40. Виконуємо операцію додавання над числами в додатковому коді:

11011100

1 1011000

110110100

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10110100

11111111

110110011

Переведемо отриманий результат з додаткового коду в десяткову форму: 110110011b = 4+8+64+1=77. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -77.

7. sub [bx + si + 0f913h], 0e22dh | 81 87 D8 78 E4 F8

========== №1 Ассемблирование – sub [bx + si + 0f913h], 0e22dh ===========

Комментарий к команде: M(DS:bx+ si + f913) ←0e22dh

1-й байт(код операции):

из табл. 2.2.5.3 комманд, № 15 находим КОП 10000001b=81h, w=1, s=0 т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0f913h);

101– reg: поле reg содержит расширение КОП (1-й байт);

000 – reg/mem: поле reg/mem =000, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+SI+disp= BX+SI+0f913h.

Получаем второй байт: 10101000=A8h

3-й байт(dispLow):

13h.

4-й байт(dispHigh):

f9h

5-й байт(dataLow):

2dh

6-й байт(dataHigh):

e2h

Машинный код команды: 81 A8 13 f9 2d e2

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная, где BX – база,SI-индекс, 0f913h – смещение относительно базы и индекса.

Правый операнд – непосредственная, 0e22dh – непосредственный 16-и битный операнд

Размещение команды в памяти:

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+4.

По таблице 11 находим, что для базово-индексной адресации Tиа=11, тогда nТ=10+11=21 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-7=0,21 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (81 87 D8 78 E4 F8) ===============

Задание: 81 87 D8 78 E4 F8

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –AND (r/m <- r/m&data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

1000 0111b=87h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

000 – reg

111 – reg/mem, mod=10: левый операнд – BX+disp

3-й байт(dispLow):

D8

4-й байт(dispHigh):

78

5-й байт(dataLow):

E4

6-й байт(dataHigh):

F8

Мнемоника команды: AND [word BX+078D8h], 0F8E4h

Адрессация операндов:

левый – базовая, где BX – база, 078D8h – смещение

правый – непосредственная, 0F8E4h – непосредственное значение

Комментарий к команде: M(DS:DI+078D8h) <- M(DS:DI+078D8h)& 0F8E4h

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=8+9=17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,17 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти №1, 4, 6, 8 то маска буде мати вигляд 101010010. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,01010101:

X X X X X X X X X

1 0 1 0 1 0 0 1 0

X X X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 48 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 48*4 = 192D = 0011000000В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000011000000 В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -45 буде віднято 34, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -45-34 можна замінити операцією -45+(-34). Для цього треба представити число -34 в додатковому коді: записуємо модуль цього числа в двійковій формі: 34D= 00100010B; інвертуємо отриманий результат: 11011101В; додаємо до отриманої комбінації одиницю:

11011101

1

11011110

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11011110В = 1+32=33. До отриманого результату додаємо одиницю і отримуємо 34, а оскільки знаковий розряд = 1, то маємо -34. Переведення в додатковий код виконано вірно. Таким же чином переведемо -45 в додатковий код: 45D = 00101101B; інвертуємо: 11010010В; додаємо одиницю: 11010011B. Робимо перевірку: 11010011B = 4+8+32=44. До отриманого результату додаємо одиницю і отримуємо 45, а оскільки знаковий розряд = 1, то маємо -45. Виконуємо операцію додавання над числами в додатковому коді:

11011110

11010011

110110001

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10110001

11111111

1 10110000

Переведемо отриманий результат з додаткового коду в десяткову форму:

110110000В = 1+2+4+8+64+1=90D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -90.

8. add [bx + di + 0679ah], 0b138h | 81 AC F5 F3 5D C9

========== №1 Ассемблирование – add [bx + di + 0679ah], 0b138h ===========

Коментар до команди: М(DS:bx + DS:di + 0679ah) 0b13h

1-й байт(код операции):

из табл. комманд, № 3 находим КОП 10000001b=81h.

2-й байт(постбайт):

md=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0679ah);

000 – reg: поле reg содержит расширение КОП (1-й байт);

r/m =001, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+DI+disp

Получаем второй байт:10000001=81h

3-й байт(dispLow):

9ah

4-й байт(dispHigh):

67h

5-й байт(dataLow):

38h

6-й байт(dataHigh):

b1h

Машинный код команды: 81 81 9a 67 38 b1

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная со смещением, где BX – база, DI-индекс, 0679ah – смещение относительно базы.

Правый операнд – непосредственная, 0b138h – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=4+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+di +0679ah.

По таблице 11 находим, что для базово-индексной адресации Tиа=8, тогда nТ=4+8=12 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=12*10-7=1.2 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (81 AC F5 F3 5D C9) ==============

Длина команды: 6 байт.

1-й байт(код операции):

10000001b=81h, то AND(r/m <- r/m&data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10101100b=ACh, то:

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

101-reg

100- reg/mem, то левый операнд – SI+disp, sub(r/m <- r/m - data)

3-й байт(dispLow):

F5h

4-й байт(dispHigh):

F3h

5-й байт(dataLow):

5Dh

6-й байт(dataHigh):

C9h

Мнемоника команды:

SUB [word SI+ 0F3F5h],0C95Dh

левый – индексная, где SI – база, 0F3F5h – смещение

правый – непосредственная, 0C95Dh – непосредственное значение

Комментарий к команде:

M(DS:SI+0F3F5h) <- M(DS:SI+0F3F5h) - 0C95Dh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=4+Tиа, где Tиа – время вычисления эффективного адреса: EA=SI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=4+9=13 тактов.

================ №3 Навести команду мікропроцесора x86… ===============

xor al, 01101100

X X X X X X X X

0 1 1 0 1 1 0 0

X X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, №2, 3, 5, 6 біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 53 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 53-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 53*4 = 212D = 0011010100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000011010100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -50 буде віднято 32, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -50-32 можна замінити операцією -50+(-32). Для цього треба представити число -32 в додатковому коді: записуємо модуль цього числа в двійковій формі: 32D= 00100000B; інвертуємо отриманий результат: 11011111В; додаємо до отриманої комбінації одиницю:

11011111

1

11100000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11100000В = 1+2+4+8+16=31. До отриманого результату додаємо одиницю і отримуємо 32, а оскільки знаковий розряд = 1, то маємо -32. Переведення в додатковий код виконано вірно. Таким же чином переведемо -50 в додатковий код: 50D = 00110010B; інвертуємо: 11001101В; додаємо одиницю: 11001110B. Робимо перевірку: 11001110B = 1+16+32=49. До отриманого результату додаємо одиницю і отримуємо 50, а оскільки знаковий розряд = 1, то маємо -50. Виконуємо операцію додавання над числами в додатковому коді:

11100000

11001110

1 10101110

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10101110

11111111

1 10101101

Переведемо отриманий результат з додаткового коду в десяткову форму: 110101101В = 2+16+64=82D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -82.

  1. test [bx + si + 0f26ch], 00000h | C7 85 AE C1 CB C8

============ №1 Ассемблирование – test [bx + si + 0f26ch], 00000h ===========

1-й байт(код операции):

из табл. комманд, № 15 находим КОП 11110111b=F7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт): md000 r/m

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0f26ch);

000 – reg: поле reg содержит расширение КОП (1-й байт);

000 – reg/mem: поле reg/mem задает способ вычисления эффективного адреса второго операнда(источника) в сегменте данных EA=(BX)+(SI)+disp16.

Получаем второй байт: 10000000=80h.

3-й байт(dispLow):

6Ch

4-й байт(dispHigh):

F2h

5-й байт(dataLow):

00h

6-й байт(dataHigh):

00h

Машинный код команды: F7 80 6C F2 00 00

Длина команды: 6 байт.

Способы адресации операндов:

Левый операнд – базово-индексная со смещением

Правый операнд – непосредственная

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса

По таблице 11 находим, что для базово-индексной со смещением адресации Tиа=11, тогда nТ=10+11=21 такт.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-8=0,21 мкс, где

tТ=1/fТ=1/100000000=10-8.

============== №2 Дизассемблирование – (C7 85 AE C1 CB C8) ==============

Длина команды: 6 байт.

1-й байт(код операции):

1100 0111b= C7h MOV(r/m  data) поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

1000 0101b=85h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение;

000 – reg

101 – reg/mem, mod=10: левый операнд – (DI) + disp16

3-й байт(dispLow):

AE

4-й байт(dispHigh):

C1

5-й байт(dataLow):

CB

6-й байт(dataHigh):

C8

Мнемоника команды: MOV [DI+0C1AEh], 0C8CBh

Адресация операндов:

Левый операнд – базовая, где DI – база, 0C1AEh – смещение

Правый операнд – непосредственная, 0C8CBh – непосредственное значение

Размещение команды в памяти:

Время выполнения:

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=8+9=17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,17 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти молодшої тетради ( тобто 0-й,1-й,3-й,4-й) то маска буде мати вигляд 00001111. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL, 00001111:

X X X X X X X X

0 0 0 0 1 1 1 1

X Х Х Х

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, біти молодшої тетради якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 57 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 57*4 = 228D = 11100100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000011100100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -55 буде віднято 30, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -55-30 можна замінити операцією -55+(-30). Для цього треба представити число -30 в додатковому коді: записуємо модуль цього числа в двійковій формі: 30D= 00011110B; інвертуємо отриманий результат: 11100001В; додаємо до отриманої комбінації одиницю:

11100001

1

11100010

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто

11100010В = 1 + 4 + 8 + 16 = 29. До отриманого результату додаємо одиницю і отримуємо 30, а оскільки знаковий розряд = 1, то маємо -30. Переведення в додатковий код виконано вірно. Таким же чином переведемо -55 в додатковий код: 55D = 00110111B; інвертуємо: 11001000В; додаємо одиницю: 11001001B. Робимо перевірку: 11001001B = 2+4+16+32=54. До отриманого результату додаємо одиницю і отримуємо 55, а оскільки знаковий розряд = 1, то маємо -55. Виконуємо операцію додавання над числами в додатковому коді:

11100010

11001001

1 10101011

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10101011

11111111

1 10101010

Переведемо отриманий результат з додаткового коду в десяткову форму:

110101010В = (1 + 4 + 16 + 64) + 1 = 86D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -86.

  1. cmp [di + 04f8ah], 0dd1fh | 81 98 DB B8 9C FD

============== №1 Ассемблирование – cmp [di + 04f8ah], 0dd1fh =============

Коментарий к команде: M(DS: di + 04f8ah) == 0dd1fh ???

1-й байт(код операции):

из табл. 2.2.5.3 (Арифметические команды), № 26 (CMP; r/m – data) находим КОП 100000sw. s=0, w=1. 10000001b = 81h.

2-й байт(постбайт):

md111 r/m.

при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=04f8ah), то mod(md) = 10.

Т.к. EA=(di)+disp, то r/m=101.

Получаем второй байт: 10111101b=BDh

3-й байт(младший байт данных):

1Fh.

4-й байт(старший байт данных):

DDh.

5-й байт(младший байт смещения disp16):

8Ah.

6-й байт(старший байт смещения disp16):

4Fh.

Машинный код команды: 83 BD 1F DD 8A 4F

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – идексная со смещением 04f8ah

Правый операнд – непосредственная.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа

По таблице 2.2.6.2 Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ =nТ*tТ=26*10-8=0,26 мкс, где tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 98 DB B8 9C FD) ==============

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h – SBB (r/m ← r/m-data-CF), поле w=1, т.е. операнд 16-и разрядный.

2-й байт(постбайт):

1001 1000b=98h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0B8DBh);

011 – reg

000 – reg/mem: левый операнд - (BX)+(SI)+disp16

3-й байт(dataLow):

B8

4-й байт(dataHigh)

DB

5-й байт(dispLow):

FDh

6-й байт(dispHigh):

9Ch

Мнемоника команды: SBB [BX+SI+0B8DBh], FD9C

Комментарий к команде: M(DS: BX+SI+0B8DBh) ← M(DS: BX+SI+0B8DBh)-FD9C-CF

Способы адресации операндов: 1) Базово – индексная со смещением 2) Непосредственная.

Размещение команды в памяти:

Время выполнения команды:

Время выполнения в тактах:

nТ =(n+Tиа)=17+Tиа

Tиа=11, тогда nТ =17+11=28 тактов.

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

Tk =(n+Tиа)*tТ =nТ*tТ=28*10-8=0,28 мкс, где

tТ = 1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти старшої тетради( тобто 7-й,6-й,5-й,4-й) то маска буде мати вигляд 11110000. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL, 11110000:

X X X X X X X X

1 1 1 1 0 0 0 0

X X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, біти старшої тетради якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 60 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 60-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 60*4 = 240D = 0011110000В. Таким чином повна 20-и розрядна фізична адреса обробника 60-ого переривання має вигляд: 00000000000011110000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -60 буде віднято 28, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -60-28 можна замінити операцією -60+(-28). Для цього треба представити число -28 в додатковому коді: записуємо модуль цього числа в двійковій формі: 28D= 00011100B; інвертуємо отриманий результат: 11100011В; додаємо до отриманої комбінації одиницю: 11100100В. Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто

11100100В = 1 + 2+ 8 + 16 = 27. До отриманого результату додаємо одиницю і отримуємо 28, а оскільки знаковий розряд = 1, то маємо -28. Переведення в додатковий код виконано вірно. Таким же чином переведемо -60 в додатковий код: 60D = 00111100B; інвертуємо: 11000011В; додаємо одиницю: 11000100B. Робимо перевірку: 11000100B = 1+2+8+16+32=59. До отриманого результату додаємо одиницю і отримуємо 60, а оскільки знаковий розряд = 1, то маємо -60. Виконуємо операцію додавання над числами в додатковому коді:

11100100

11000100

110101000

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10101000

11111111

110100111

Переведемо отриманий результат з додаткового коду в десяткову форму:

110100111В = (8 + 16 + 64) + 1 = 89D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -89.

  1. add [bx + si + 0f45ch], 0db7ah | 81 85 BD B4 7F D3

============= №1 Ассемблированиеadd [bx + si + 0f45ch], 0db7ah ============

Задание: add [bx + si + 0f45ch], 0db7ah

Комментарий к команде: M(DS: bx + si + 0f45ch)←M(DS: bx + si + 0f45ch) +0db7ah

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 10000001b=81h, w=1, s=0 т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0f45ch);

000 – reg: поле reg содержит расширение КОП (1-й байт);

000 – reg/mem: поле reg/mem =000, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: (BX)+(SI)+disp16.

Получаем второй байт: 10000000=80h.

3-й байт(dispLow):

5ch.

4-й байт(dispHigh):

f4h

5-й байт(dataLow):

7ah

6-й байт(dataHigh):

dbh

Машинный код команды: 81 80 5C F4 7A DB

Длина команды: 6 байта.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)= 4/17+TИА, где Tиа – время вычисления эффективного адреса: EA= BX + SI + 0f45ch.

По таблице 11 находим, что для базовой адресации Tиа=11, тогда nТ=4/17+11=191/17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=191/17 *10-7=1,1 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (81 85 BD B4 7F D3) ==============

Задание: 81 85 BD B4 7F D3

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h – ADD (r/m←r/m+data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000101 b =85h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0bc9ah);

000 – reg

101 – reg/mem, mod=10: левый операнд – (DI)+disp16

3-й байт(dispLow):

BD

4-й байт(dispHigh):

B4

5-й байт(dataLow):

7F

6-й байт(dataHigh):

D3

Мнемоника команды: ADD [DI+0B4BDh], 0D37Fh

Адрессация операндов:

левый – индексная, DI – индекс смещения, 0B4BDh – смещение

правый – непосредственная, 0D37Fh – непосредственное значение

Комментарий к команде: M(ES: DI+0B4BDh) <- M(ES: DI+0B4BDh) + 0D37Fh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)= 17+ТИА, где Tиа – время вычисления эффективного адреса: EA=(DI)+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-7=2,6 мкс, где

tТ=1/fТ=1/10000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для встановлення певних біт в «1» використаємо команду OR (логічне додавання). Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки потрібно встановити непарні біти (1-й, 3-й, 5-й, 7-й) в «1», то маска буде мати вигляд 10101010.

Команда: OR AL, 10101010

Нехай в регістрі AL записана наступна комбінація: XXXXXXXX.

Виконаємо команду OR AL, 10101010

X X X X X X X X

1 0 1 0 1 0 1 0

1 X 1 X 1 X 1 X

Як бачимо, в наслідок виконання команди в регістр AL буде поміщена комбінація, непарні біти якої встановлені в «1».

================ №4 Сформувати … номер переривання 65 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду, то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 65-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 65*4 = 260D = 0100000100В. Таким чином повна 20-и розрядна фізична адреса обробника 65-ого переривання має вигляд: 00000000000100000100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -70 буде віднято 24, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -70-24 можна замінити операцією -70+(-24). Для цього треба представити число -24 в додатковому коді: записуємо модуль цього числа в двійковій формі: 24D= 00011000B; інвертуємо отриманий результат: 11100111В; додаємо до отриманої комбінації одиницю:

11100111

1

1 1101000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11101000В = 1+2+4+16=23. До отриманого результату додаємо одиницю і отримуємо 24, а оскільки знаковий розряд = 1, то маємо -24. Переведення в додатковий код виконано вірно. Таким же чином переведемо -70 в додатковий код: 70D = 01000110B; інвертуємо: 10111001В; додаємо одиницю: 10111010B. Робимо перевірку: 10111010B = 1+4+64=69. До отриманого результату додаємо одиницю і отримуємо 70, а оскільки знаковий розряд = 1, то маємо -70. Виконуємо операцію додавання над числами в додатковому коді:

11101000

10111010

1 10100010

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10100010

00000001

10100001

Переведемо отриманий результат з додаткового коду в десяткову форму: 10100001В = (2+4+8+16+64)+1=95D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -95.

  1. sub [bx + di + 0d2c3h], 0f27dh | 81 AF 7C BC 8D D7

======== №1 Ассемблирование – sub [bx + di + 0d2c3h], 0f27dh =============

Задание: sub [bx + di + 0d2c3h], 0f27dh;

Комментарий к команде: M(DS: bx + di + 0d2c3h)←M(DS: bx + di + 0d2c3h) - 0f27dh

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 10000001b=81h, w=1, s=0 т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0d2c3h);

101 – reg: поле reg содержит расширение КОП (1-й байт);

001 – reg/mem: поле reg/mem =001, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: (BX)+(DI)+disp16.

Получаем второй байт: 10101001=a9h.

3-й байт(dispLow):

C3h.

4-й байт(dispHigh):

D2h

5-й байт(dataLow):

7dh

6-й байт(dataHigh):

F2h

Машинный код команды: 81 A9 C3 D2 7D F2

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная, где BX – база, DI – индексное смещение, 0d2c3h – смещение относительно базы.

Правый операнд – непосредственная, 0f27dh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)= 4/17+TИА, где Tиа – время вычисления эффективного адреса: EA= BX + DI + 0d2c3h.

По таблице 11 находим, что для базовой адресации Tиа=12, тогда nТ=4/17+12=208/17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=208/17*10-7=1,6 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (81 AF 7C BC 8D D7) =============

Задание: 81 AF 7C BC 8D D7

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –sub(r/m <- r/m-data) поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10101111 b=afh, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0bc7ch);

101 – reg

111 – reg/mem, mod=10: левый операнд – (BX)+disp16

3-й байт(dispLow):

7c

4-й байт(dispHigh):

BC

5-й байт(dataLow):

8d

6-й байт(dataHigh):

D7

Мнемоника команды: SUB [BX+0bc7ch], 0d78dh

Адрессация операндов:

левый – базова, где BX-база, 0BC7ch – смещение

правый – непосредственная, 0d78dh – непосредственное значение

Комментарий к команде: M(CS: BX+0BC7ch) <- M(CS: BX+0BC7ch)-0d78dh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)= 4/17+ТИА, где Tиа – время вычисления эффективного адреса: EA=(BX)+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=4/17+9=157 /17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=157/17*10-7=0.9 мкс, где

tТ=1/fТ=1/10000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для зміни 1,3,5 одиницю ми будемо використовувати операцію OR(логічне додавання). Оскільки необхідно встановити в одиницю біти №1,3,5 то маска буде мати вигляд 00101010

Команда: OR AL, 00101010

Перевірка:

1 1 0 0 1 0 1 0

0 0 1 0 1 0 1 0

1 1 1 0 1 0 1 0

================ №4 Сформувати … номер переривання 67 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 67-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 67*4 = 268D = 0100001100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000100001100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -75 буде віднято 22, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -75-22 можна замінити операцією -75+(-22). Для цього треба представити число -22 в додатковому коді: записуємо модуль цього числа в двійковій формі: 22D= 00010110B; інвертуємо отриманий результат: 11101001В; додаємо до отриманої комбінації одиницю:

11101001

1

11101010

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11101010В = 1+4+16=21. До отриманого результату додаємо одиницю і отримуємо 22, а оскільки знаковий розряд = 1, то маємо -22. Переведення в додатковий код виконано вірно. Таким же чином переведемо -75 в додатковий код: 75D = 01001011B; інвертуємо: 10110100В; додаємо одиницю: 10110101B. Робимо перевірку: 10110101B = 2+8+64=74. До отриманого результату додаємо одиницю і отримуємо 75, а оскільки знаковий розряд = 1, то маємо -75. Виконуємо операцію додавання над числами в додатковому коді:

11101010

10110101

1 10011111

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10011111

00000001 (не правильно!!!)

1 10011110

Переведемо отриманий результат з додаткового коду в десяткову форму: 110011110В = 1+32+64=97D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -97.

  1. mov [bp+ si + 0c95dh], 0d784h | 81 84 6F D6 5E F1

============ №1 Ассемблированиеmov [bp+ si + 0c95dh], 0d784h ==========

Комментарий к команде: M(DS*16+ bp+ si + 0c95dh) &0d784h

1-й байт(код операции):

из табл. комманд, находим КОП 11000111 =C7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт): 10000010

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c95dh);

010 – reg/mem: т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BP+SI+disp= BP + SI + 0c95dh.

Получаем второй байт: 10000010=82h.

3-й байт(dispLow):

5Dh

4-й байт(dispHigh):

C9h

5-й байт(dataLow):

84h

6-й байт(dataHigh):

D7h

Машинный код команды: C7 82 5D C9 84 D7

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная со смещением

Правый операнд – непосредственная.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+12, где Tиа – время вычисления эффективного адреса: BP + SI + 0c95dh.

По таблице находим, что для базовой адресации Tиа=12, тогда nТ=10+12=22 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=22*10-7=2.2 мкс, где

tТ=1/fТ=1/100000000=10-7.

=============== №2 Дизассемблирование – (81 84 6F D6 5E F1) ===============

Задание: 81 84 6F D6 5E F1

Длина команды: 6 байт.

1-й байт(код операции):

11000001=81h –ADD (r/mr/m+data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000100b=84h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

000

100 – reg/mem, mod=10: левый операнд –SI+disp

3-й байт(dispLow):

6F

4-й байт(dispHigh):

D8

5-й байт(dataLow):

5E

6-й байт(dataHigh):

F1

Мнемоника команды: ADD [SI+D86Fh], F15Eh

Адрессация операндов:

левый –индексная со смещением

правый – непосредственная.

Комментарий к команде: M(DS*16 + SI+D86Fh) <- F15Eh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA= SI+disp16.

По таблице находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-7=2.6 мкс, где

tТ=1/fТ=1/100000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для встановлення бітів двійкового числа в «1» використовується операція «АБО». В мові асемблера їй відповідає команда OR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для встановлення. Оскільки необхідно встановити в «1» біти, то маска буде мати вигляд 00101010. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду OR AL,11001100:

X X X X X X X X

0 1 0 1 0 1 0 0

X 1 X 1 X 1 X X

================ №4 Сформувати … номер переривання 69 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 69-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 69*4 = 276D = 00100010100 В. Таким чином повна 20-и розрядна фізична адреса обробника 69-ого переривання має вигляд: 000000000000100010100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -80 буде віднято 20, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -80-20 можна замінити операцією -80+(-20). Для цього треба представити число -80 в додатковому коді: записуємо модуль цього числа в двійковій формі: 80D= 01010000B; інвертуємо отриманий результат: 10101111В; додаємо до отриманої комбінації одиницю:

10101111

1

1 0110000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 10110000В = 1+2+4+8+64=79. До отриманого результату додаємо одиницю і отримуємо 80, а оскільки знаковий розряд = 1, то маємо -80. Переведення в додатковий код виконано вірно. Таким же чином переведемо -20 в додатковий код: 20D = 00010100B; інвертуємо: 11101011В; додаємо одиницю: 11101100B. Робимо перевірку: 11101100B = 1+2+16=19. До отриманого результату додаємо одиницю і отримуємо 20, а оскільки знаковий розряд = 1, то маємо -20. Виконуємо операцію додавання над числами в додатковому коді:

10110000

11101100

110011100

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10011100

11111111

110011011

Переведемо отриманий результат з додаткового коду в десяткову форму: 110011011В = 4+32+64+1=101D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -101.

  1. xor [bx + 0b9dfh], 016cbh | C7 83 5D DD FD F6

============ №1 Ассемблирование – A xor [bx + 0b9dfh], 016cbh ==============

Комментарий к команде: M(DS:BX+0b9dfh) ←016cbh

1-й байт(код операции):

из табл. команд находим КОП 10000001=81h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0b9dfh);

110 – reg: поле reg содержит расширение КОП (1-й байт);

111 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+disp= BX+0b9dfh.

Получаем второй байт: 10110111=B7h.

3-й байт(dispLow):

df

4-й байт(dispHigh):

b9

5-й байт(dataLow):

cb

6-й байт(dataHigh):

16

Машинный код команды: 81 B7 DF B9 CB 16

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BX – база, 0b9dfh – смещение относительно базы.

Правый операнд – непосредственная, 0b6ceh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+0b9dfh.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26 *10-7=2.6 мкс, где

tТ=1/fТ=1/10000000=10-7.

=============== №2 Дизассемблирование – (C7 83 5D DD FD F6) =============

Задание: C7 83 5D DD FD F6

Длина команды: 6 байт.

1-й байт(код операции):

11000111b=C7h –MOV (r/m <- data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000011b=83h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0DD5Dh);

000 – reg

011 – reg/mem, mod=10: левый операнд – BP+DI+disp16

3-й байт(dispLow):

DD

4-й байт(dispHigh):

5D

5-й байт(dataLow):

F6

6-й байт(dataHigh):

FD

Мнемоника команды: MOV [BP+DI+0DD5Dh], 0FF6FDh

Адрессация операндов:

левый – базово индексная со смещением, где BP – база, DI – инекс, 0DD5Dh – смещение

правый – непосредственная, 0FF6FDh – непосредственное значение

Комментарий к команде: M(DS:BP+DS:DI+0DD5Dh) <- M(DS:BP+DS:DI+0DD5Dh)& 0FF6FDh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=BP+DI+disp16.

По таблице 11 находим, что Tиа=11, тогда nТ=10+11=21 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-7=2,1 мкс, где

tТ=1/fТ=1/10000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для того, щоб встановити 4 біта в одиницю використаємо операцію АБО = операцію логічного додавання (OR).

Наводжу результати команди OR: 1 OR 0 = 1, 1 OR 1 = 1, 0 OR 0 = 0

Як бачимо, при операції OR з 1 завжди отримаємо 1.

Отже, потрібно зробити наступну операцію: OR AL, 11000011

X X X X X X X X

1 1 0 0 0 0 1 1

1 1 X X X X 1 1

================ №4 Сформувати … номер переривання 70 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 70*4 = 280D = 0100011000В. Таким чином повна 20-и розрядна фізична адреса обробника 70-ого переривання має вигляд: 00000000000100011000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -85 буде віднято 18, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -85-18 можна замінити операцією -85+(-18). Для цього треба представити число -18 в додатковому коді: записуємо модуль цього числа в двійковій формі: 18D= 00010010B; інвертуємо отриманий результат: 11101101В; додаємо до отриманої комбінації одиницю:

11101101

1

11101110

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11101110В = 1+16=17. До отриманого результату додаємо одиницю і отримуємо 18, а оскільки знаковий розряд = 1, то маємо -18. Переведення в додатковий код виконано вірно. Таким же чином переведемо -85 в додатковий код: 85D = 01010101B; інвертуємо: 10101010В; додаємо одиницю: 10101011B. Робимо перевірку: 10101011B = 4+16+64=84. До отриманого результату додаємо одиницю і отримуємо 85, а оскільки знаковий розряд = 1, то маємо -85. Виконуємо операцію додавання над числами в додатковому коді:

11101110

10101011

1 10011001

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10011001

00000001

10011000

Переведемо отриманий результат з додаткового коду в десяткову форму: 10011000В = 1+2+4+32+64+1=104D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -104.

  1. test [bx + di + 0c513h], 0ffffh | C7 80 FC D8 AE D9

============ №1 Ассемблирование – test [bx + di + 0c513h], 0ffffh =============

Комментарий к команде: M(DS*16+ bx + di + 0c513h) &0ffffh

1-й байт(код операции):

из табл. комманд, находим КОП 11110111 =F7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт): 10000001

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c513h);

001 – reg/mem: т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+DI+disp= bx + di + 0c513h.

Получаем второй байт: 10000001=81h.

3-й байт(dispLow):

13h

4-й байт(dispHigh):

C5h

5-й байт(dataLow):

FFh

6-й байт(dataHigh):

FFh

Машинный код команды: F7 81 13 C5 FF FF

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная со смещением

Правый операнд – непосредственная.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+12, где Tиа – время вычисления эффективного адреса: bx + di + 0c513h.

По таблице находим, что для базовой адресации Tиа=12, тогда nТ=10+12=22 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=22*10-7=2.2 мкс, где

tТ=1/fТ=1/100000000=10-7.

============== №2 Дизассемблирование – (C7 80 FC D8 AE D9) ==============

Задание: C7 80 FC D8 AE D9

Длина команды: 6 байт.

1-й байт(код операции):

11000111=C7h –MOV (r/m <-data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000000b=80h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c69dh);

000

000 – reg/mem, mod=10: левый операнд – BX+SI+disp

3-й байт(dispLow):

FC

4-й байт(dispHigh):

D8

5-й байт(dataLow):

AE

6-й байт(dataHigh):

D9

Мнемоника команды: MOV [BX+SI+D8FCh], D9AEh

Адрессация операндов:

левый – базово-индексная со смещением

правый – непосредственная.

Комментарий к команде: M(DS*16 +BX+SI+D8FCh) <-D9AEh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+SI+disp16.

По таблице находим, что Tиа=12, тогда nТ=10+12=22 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-7=2.2 мкс, где

tТ=1/fТ=1/100000000=10-7.

================ №3 Навести команду мікропроцесора x86… ===============

Для встановлення бітів двійкового числа в «1» використовується операція «АБО». В мові асемблера їй відповідає команда OR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для встановлення. Оскільки необхідно встановити в «1» біти, то маска буде мати вигляд 11011000. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду OR AL,11011000:

X X X X X X X X

1 1 0 1 1 0 0 0

1 1 X 1 1 X X X

================ №4 Сформувати … номер переривання 71 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 71-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 71*4 = 284D = 00100011100В. Таким чином повна 20-и розрядна фізична адреса обробника 71-ого переривання має вигляд: 000000000000100011100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -90 буде віднято 16, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -90-16 можна замінити операцією -90+(-16). Для цього треба представити число -90 в додатковому коді: записуємо модуль цього числа в двійковій формі: 90D= 01011010B; інвертуємо отриманий результат: 10100101В; додаємо до отриманої комбінації одиницю:

10100101

1

10100110

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 10100110В = 1+8+16+64=89. До отриманого результату додаємо одиницю і отримуємо 90, а оскільки знаковий розряд = 1, то маємо -90. Переведення в додатковий код виконано вірно. Таким же чином переведемо -16 в додатковий код: 16D = 00010000B; інвертуємо: 11101111В; додаємо одиницю: 11110000B. Робимо перевірку: 11110000B = 1+2+4+8=15. До отриманого результату додаємо одиницю і отримуємо 16, а оскільки знаковий розряд = 1, то маємо -16. Виконуємо операцію додавання над числами в додатковому коді:

10100110

11110000

110010110

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10010110

11111111

1 10010101

Переведемо отриманий результат з додаткового коду в десяткову форму:

110010101В = 2+8+32+64+1=107D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -107.

  1. add [bx+078f5h],0f8e4h | 81 80 6D F4 8C DB

============== №1 Ассемблированиеadd [bx+078f5h],0f8e4h ===============

Задание: add [bx+078f5h],0f8e4h

Комментарий к команде: M(DS:bx+078f5h) ←0f8e4h

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 10000001b=81h, sw=01, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=078f5h);

000 – reg: поле reg содержит расширение КОП (1-й байт);

111 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+disp= BX+078f5h.

Получаем второй байт: 10000111=87h.

3-й байт(dispLow):

F5h.

4-й байт(dispHigh):

78h

5-й байт(dataLow):

E4h

6-й байт(dataHigh):

F8h

Машинный код команды: C7 87 F5 78 E4 F8

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BX – база, 078f5h – смещение относительно базы.

Правый операнд – непосредственная, 0f8e4h – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+078f5h.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=19*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 80 6D F4 8C DB) ==============

Задание: 81 80 6D F4 8C DB

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –AND (r/m <- r/m&data), поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

1000 0000b =80h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0F46Dh);

000 – reg

001 – reg/mem, mod=10: левый операнд – BX+SI+disp

3-й байт(dispLow):

6D

4-й байт(dispHigh):

F4

5-й байт(dataLow):

8C

6-й байт(dataHigh):

DB

Мнемоника команды: AND [word BX+SI+0F46Dh], 0DB8Ch

Адрессация операндов:

левый – базово-индексная со смещением, где BX – база, SI– индекс, 00F46Dh – 16-ти разрядное смещение.

правый – непосредственная, 0DB8Ch – непосредственное значение

Комментарий к команде: M(DS: BX+SI+0F46Dh) <- M(DS: BX+SI+0F46Dh)& 0DB8Ch

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA= BX+SI+disp16.

По таблице 11 находим, что Tиа=11, тогда nТ=17+11=28 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=28*10-8=0,28 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для встановлення значення в одиницю бітів №1,4,6,7 акумулятора AL використаємо логічну операцію або (OR).

Синтаксис: OR AL, data8

Допустимо, що AL= XXXX XXXX, а маска data8=1101 0010;

Виконання інструкції:

X

X

X

X

X

X

X

X

1

1

0

1

0

0

1

0

1

1

X

1

X

X

1

X

Як, бачимо, в наслідок виконання логічної операції АБО біти акумулятора під номерами 1, 4, 6, 7 були встановлені в одиницю.

================ №4 Сформувати … номер переривання 73 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Таблиця переривань (IDT) знаходиться в сегменті коду, починається з нульових адрес (старші 10 розрядів рівні 0). Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 73-го переривання молодші 10 розрядів фізичної адреси знаходимо як 73*4 = 152D = 0010011000В. Таким чином повна 20-и розрядна фізична адреса обробника 73-го переривання має вигляд: 00000000000010011000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Синтаксис: SBB AL, data8

Алгоритм роботи інструкції: AL: AL-data8-1

Оскільки дія віднімання виконується через дію додавання, але з переходом від’ємних чисел з двійкової системи в систему додаткову систему чисел.

|data10|→data2

data2

+1

Алгоритм переходу від двійкової до додаткової системи:

Виконаємо інструкцію:

95D→01011111b→10100000b+1→10100001b

14D→00001110b→11110001b+1→11110010b

1D→00000001b→11111110b+1→11111111b

+

1

0

1

0

0

0

0

1

+

AL

1

1

1

1

0

0

1

0

data8

1

1

0

0

1

0

0

1

1

AL*

+

1

0

0

1

0

0

1

1

+

AL*

1

1

1

1

1

1

1

1

1

1

1

0

0

1

0

0

1

0

AL

Виконаємо перехід до десяткової системи:

110010010b={1+4+8+32+64}=109D

Врахувавши значення флага CF=1, отримаємо -109D.

  1. sub [si + 0f346h], 0a65dh | 81 A9 43 DB 7D F2

============= №1 Ассемблированиеsub [si + 0f346h], 0a65dh ===============

Комментарий к команде: M(SI +0f346h) ← M(SI +0f346h) – 0a65dh

1-й байт(код операции):

из табл. комманд, № 8 находим КОП 10000001b=81h, w=1, т. к. длина операнда 16 бит, s=0, т.к. длина второго операнда = 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0d9feh);

100 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=SI+disp= SI+0f346h.

Получаем второй байт: 10101100 =ACh.

3-й байт (dispLow)

46h

4-байт (dispHigh)

f3h

5-й байт(dataLow):

65h.

6-й байт(dataHigh):

0ah

Машинный код команды: 81 AC F3 46 65 0A

Длина команды: 4 байта.

Способы адресации операндов:

Левый операнд – базовая, где SI – база, 0d9feh – смещение относительно базы.

Правый операнд – непосредственная, 0a65dh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=SI+0a65h.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=19*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 A9 43 DB 7D F2) ==============

Задание: 81 A9 43 DB 7D F2

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=81h –AND (r/m <- r/m&data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

1010 1001b=A9h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0db43h);

001 – reg/mem, mod=10: левый операнд – BX+DI+disp16

3-й байт(dispLow):

43

4-й байт(dispHigh):

DB

5-й байт(dataLow):

7D

6-й байт(dataHigh):

F2

Мнемоника команды: AND [word BX+DI+0db43h], 0f27dh

Адрессация операндов:

левый – базово-индексная, где BX – база, DI - индекс 0db43h – смещение

правый – непосредственная, 0f27dh – непосредственное значение

Комментарий к команде: M(BX:DI+0db43h) <- M(BX:DI+0db43h)& 0f27dh

Размещение команды в памяти:

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=8+9=17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,17 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для інвертування бітів двійкового числа використовується операція складання за модулем 2. В мові асемблера їй відповідає команда XOR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно інвертувати біти 2-й,3-й,5-й,6-й) то маска буде мати вигляд 01111100. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL, 01111100:

X X X X X X X X

0 1 1 1 1 1 0 0

X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої інвертовані відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 75 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і

внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 75*4 = 300D = 0100101100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000100101100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -100 буде віднято 12, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -100-12 можна замінити операцією -100+(-12). Для цього треба представити число -100 в додатковому коді: записуємо модуль цього числа в двійковій формі: 46D= 01100100B; інвертуємо отриманий результат: 11010001В; додаємо до отриманої комбінації одиницю:

10011011

1

10011100

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 10011100В = 1+2+32+64=99. До отриманого результату додаємо одиницю і отримуємо 100, а оскільки знаковий розряд = 1, то маємо -100. Переведення в додатковий код виконано вірно. Таким же чином переведемо -12 в додатковий код: 15D = 00001100B; інвертуємо: 11110011В; додаємо одиницю: 11110100B. Робимо перевірку: 11110001B = 1+2+8=11. До отриманого результату додаємо одиницю і отримуємо 12, а оскільки знаковий розряд = 1, то маємо -12. Виконуємо операцію додавання над числами в додатковому коді:

11010001

11110011

111000100

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

11000100

11111111

111000101

Переведемо отриманий результат з додаткового коду в десяткову форму: 111000101В = 2+8+16+32+1=61D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -61.

  1. sbb [bx + si + 056dbh], 0fd2ch | 81 B7 67 B9 CB 16

============ №1 Ассемблирование – sbb [bx + si + 056dbh], 0fd2ch ============

Задание: sbb [bx + si + 056dbh], 0fd2ch

Комментарий к команде: M(DS: bx + si + 056dbh) ← M(DS: bx + si + 056dbh) - 0fd2ch – СF

1-й байт(код операции):

находим КОП (#19) 10000011b=83h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=056dbh);

011 – reg: : поле reg содержит расширение КОП (1-й байт);

000 – reg/mem, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=bx+si+disp=bx+si+056dbh

Получаем второй байт: 10011000=98h.

3-й байт(младший байт смещения адреса первого операнда):

DBh.

4-й байт(старший байт смещения адреса первого операнда):

56h.

5-й байт(младший байт смещения адреса второго операнда):

2Ch.

6-й байт(старший байт смещения адреса второго операнда):

FDh.

Машинный код команды: 83 98 DB 56 2C FD

Длина команды: 6 байт.

Способ адресации операнда:

Левый операнд: базово - индексная со смещением, BX-база, SI-база, 056dbh -смещение относительно базы.

Правый операнд: непосредственная, 0fd2ch - непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+SI+056DBh.

Находим, что Tиа= 11, тогда nТ=17+11=28 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=28*10-8=0,28 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 B7 67 B9 CB 16) ==============

Задание: 81 B7 67 B9 CB 16

Длина команды: 6 байт

1-й байт(код операции):

1000 0001b=81h – AND (r/m <- r/m&data), поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

B7h=10110111, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение;

110 – reg:

111 – reg/mem: способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BX+disp

3-й байт(младший байт смещения адреса первого операнда):

67h.

4-й байт(старший байт смещения адреса первого операнда):

B9h.

5-й байт(младший байт смещения адреса второго операнда):

CBh.

6-й байт(старший байт смещения адреса второго операнда):

16h

Мнемоника команды: AND [word BX+0B967h], 016CBh

Коментарий к команде: M(ES:BX+0B967h) <- M(ES:BX+0B967h)& 016CBh

Адресация операндов:

Левый операнд : базовая, где BX – база, 0B967h – смещение

Правый операнд –непосредственная, 016CBh – непосредственное значение.

Размещение команды в памяти:

Время выполнения команды в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=BX+disp16.

Находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, де

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для встановлення бітів старшої тетради акумулятора AL в 1 використовується операція логічне «або». В мові асемблера їй відповідає команда OR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно встановити бітів старшої тетради акумулятора AL в 1, то маска буде мати вигляд 11110000. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду

OR AL, 11110000:

X X X X X X X X

1 1 1 1 0 0 0 0

1 1 1 1 X X X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, в якій страші біти тетради будуть «1», а інші біти не зміняться.

================ №4 Сформувати … номер переривання 32 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 79*4 = 316D = 0100111100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000100111100В

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -110 буде віднято 8, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -110-8 можна замінити операцією -110+(-8). Для цього треба представити число -8 в додатковому коді: записуємо модуль цього числа в двійковій формі: 8D= 00001000B; інвертуємо отриманий результат: 11110111В; додаємо до отриманої комбінації одиницю:

11110111

1

1 1111000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11111000В = 1+2+4=7. До отриманого результату додаємо одиницю і отримуємо 8, а оскільки знаковий розряд = 1, то маємо -8. Переведення в додатковий код виконано вірно. Таким же чином переведемо -110 в додатковий код: 110D = 01101110B; інвертуємо:10010001В; додаємо одиницю: 10010010B. Робимо перевірку: 10010010B = 1+4+8+32+64=109. До отриманого результату додаємо одиницю і отримуємо 110, а оскільки знаковий розряд = 1, то маємо -110. Виконуємо операцію додавання над числами в додатковому коді:

11111000

10010010

1 10001010

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

10001010

11111111

1 10001001

Переведемо отриманий результат з додаткового коду в десяткову форму: 110001001В = 1+2+4+16+32+64=119D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -119

  1. add [bp + si + 045cbh], 0cdadh | 81 BC 9F 4B CD DB

============ №1 Ассемблирование - add [bp + si + 045cbh], 0cdadh ============

Комментарий к команде: M(DS:bp + si + 045CB) += 0xCDAD

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 1000 0001b=81h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=045cbh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

111 – reg/mem: поле reg/mem =010, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=BP+disp.

3-й байт(dispLow):

CB.

4-й байт(dispHigh):

45

5-й байт(dataLow):

AD

6-й байт(dataHigh):

CD

Машинный код команды: 81 82 CB 45 AD CD

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где BP – база, 045cbh – смещение относительно базы.

Правый операнд – непосредственная, 0cdadh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

0x81

0x82

0xCB

0x45

0xAD

0xCD

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=BP+SI+4.

По таблице 6 находим, что для базовой адресации Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 82 CB DD AC CD) =============

Задание: 81 82 CB DD AC CD

Длина команды: 6 байт.

1-й байт(код операции):

1000 0001b=0x81 –ADD, тк в 2 байте reg=000 (r/m += data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000010b=0x82, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0xDDCB);

000 – reg

010 – reg/mem, mod=10: левый операнд – BP+disp

3-й байт(dispLow):

CB

4-й байт(dispHigh):

DD

5-й байт(dataLow):

AC

6-й байт(dataHigh):

CD

Мнемоника команды: ADD word [bp+si+0xDDCB], 0xCDAC

Адрессация операндов:

левый – базовая, где BP – база, DDCB – смещение

правый – непосредственная, CDAC – непосредственное значение

Комментарий к команде: M(ES:bp+si+0xDDCB) = M(ES:bp+si+0xDDCB) + 0xCDAC

Размещение команды в памяти:

81

82

CB

DD

AC

CD

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=BP+SI+disp16.

По таблице 6 находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для скмидування в 0 бітів двійкового числа використовується операція АБО. В мові асемблера їй відповідає команда OR. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для обнулення. Оскільки необхіднообнулити парні біти( тобто 0-й,2-й,4-й,6-й) то маска буде мати вигляд 10101010. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду OR AL,10101010:

X X X X X X X X OR 1 0 1 0 1 0 1 0 = X 0 X 0 X 0 X 0

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої обнулено відносно вихідної комбінації.

================ №4 Сформувати … номер переривання 81 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 81-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 81*4 = 144D = 0001 0100 0100В. Таким чином повна 20-и розрядна фізична адреса обробника 81-ого переривання має вигляд:0000 0001 0100 0100В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -115 буде віднято 4, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -115-4 можна замінити операцією -115+(-4). Для цього треба представити число -4 в додатковому коді: записуємо модуль цього числа в двійковій формі: 4= 0000 0100; інвертуємо отриманий результат: 1111 1011В; додаємо до отриманої комбінації одиницю:

1111 1100

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 1111 1100В = 1+2=3. До отриманого результату додаємо одиницю і отримуємо 4, а оскільки знаковий розряд = 1, то маємо -4. Переведення в додатковий код виконано вірно.

Таким же чином переведемо -115 в додатковий код: 115D = 0111 0011B; інвертуємо: 1000 1100В; додаємо одиницю: 1000 1101B. Робимо перевірку: 1000 1101B = 64+32+16+2=114. До отриманого результату додаємо одиницю і отримуємо 115, а оскільки знаковий розряд = 1, то маємо -115. Виконуємо операцію додавання над числами в додатковому коді:

1111 1100 +

1000 1101 =

1 1000 1001

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

1000 1001 +

1111 1111 =

1 1000 1000

Переведемо отриманий результат з додаткового коду в десяткову форму:

1000 1000В = 1+4+8+16+32+1+1=120D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -120.

23. test [si + 0db5ah], 0ffffh | F7 84 9F DB FF FF

============== №1 Ассемблированиеtest [si + 0db5ah], 0ffffh ===============

Комментарий к команде: M(DS:si+0db5ah) ←0ffffh

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 11110111b=F7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0ffffh);

000 – reg: поле reg содержит расширение КОП (1-й байт);

100 – reg/mem: поле reg/mem =100

Получаем второй байт: 10000100=84h.

3-й байт(dispLow):

5ah.

4-й байт(dispHigh):

dbh

5-й байт(dataLow):

ffh

6-й байт(dataHigh):

ffh

Машинный код команды: f7 84 5a db ff ff

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базовая, где si – база, 0db5ah – смещение относительно базы.

Правый операнд – непосредственная, 0ffffh – непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: EA=si+0db5ah.

По таблице 11 находим, что для базовой адресации Tиа=9, тогда nТ=10+9=19 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=19*10-8=0,19 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (F7 84 9F DB FF FF) ==============

Задание: : F7 84 9F DB FF FF

Длина команды: 6 байт.

1-й байт(код операции):

1111 0111b=f7h – test (r/m <- r/m&data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт):

10000100 b=84h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение

000 –

100 – reg, mod=10: левый операнд – si-disp

3-й байт(dispLow):

9f

4-й байт(dispHigh):

db

5-й байт(dataLow):

ff

6-й байт(dataHigh):

ff

Мнемоника команды: test [word si-2461h], ffffh

Адрессация операндов:

левый – базовая, где sI – база, 2461h – смещение

правый – непосредственная, ffffh – непосредственное значение

Размещение команды в памяти:

Время выполнения в тактах:

nТ=(n+Tиа)=8+Tиа, где Tиа – время вычисления эффективного адреса: EA=SI-disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=8+9=17 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=17*10-8=0,17 мкс, где

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для того щоб скинути біти у 0, використаемо команду AND.

Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число(маска). Оскільки необхідно сбросити 1,3,5 біти то маска буде мати вигляд 11101010. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду XOR AL,11101010:

X X X X X X X X

1 1 1 0 1 0 1 0

Х Х Х 0 Х 0 Х 0

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, 1,3,4 біти якої скинуті у 0

================ №4 Сформувати … номер переривання 85 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 30*4 = 120D = 0001111000В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000001111000В.

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -10 буде віднято 48, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -10-48 можна замінити операцією -10+(-48). Для цього треба представити число -48 в додатковому коді: записуємо модуль цього числа в двійковій формі: 48D= 00110000 B; інвертуємо отриманий результат: 11001111В; додаємо до отриманої комбінації одиницю: 11010000

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11010000В = 1+2+4+8+32=47. До отриманого результату додаємо одиницю і отримуємо 48, а оскільки знаковий розряд = 1, то маємо -48. Переведення в додатковий код виконано вірно. Таким же чином переведемо -10 в додатковий код: 10D = 00001010B; інвертуємо: 11110101В; додаємо одиницю: 11110110B. Робимо перевірку: 11110110B = 1+8=9. До отриманого результату додаємо одиницю і отримуємо 10, а оскільки знаковий розряд = 1, то маємо -10.

Виконуємо операцію додавання над числами в додатковому коді:

11010000

11110110

1 11000110

Віднімемо 1 від результату: 111000110

Переведемо отриманий результат з додаткового коду в десяткову форму: 111000110В =2+8+16+32 =58D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -58.

  1. xor [di + 0b2c3h], 0ff14h | 81 B5 A3 B2 14 FF

============== №1 Ассемблирование – xor [di + 0b2c3h], 0ff14h ===============

Задание: xor [di + 0b2c3h], 0ff14h

Комментарий к команде: M(DS: DI+034C0h) ← M(DS: DI+034C0h) xor 0ff14h

1-й байт(код операции):

находим КОП 10000001b=81h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт):

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0b2c3h);

110 – reg: : поле reg содержит расширение КОП (1-й байт);

101 – reg/mem, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=DI+disp=DI+0b2c3h

Получаем второй байт: 10110101=B5h.

3-й байт(младший байт смещения адреса первого операнда):

C3h.

4-й байт(старший байт смещения адреса первого операнда):

B2h.

5-й байт(младший байт смещения адреса второго операнда):

14h.

6-й байт(старший байт смещения адреса второго операнда):

ffh.

Машинный код команды: 81 B5 C3 B2 14 FF

Длина команды: 6 байт.

Способ адресации операнда:

Левый операнд: базовая, где DI-база, b2c3h - смещение.

Правый операнд: непосредственная, 0ff14h - непосредственный 16-и битный операнд.

Размещение команды в памяти:

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+0b2c3h.

Находим, что Tиа= 9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, где

tТ=1/fТ=1/100000000=10-8.

=============== №2 Дизассемблирование – (81 B5 A3 B2 14 FF) ==============

Задание: 81 B5 A3 B2 14 FF

Длина команды: 6 байти

1-й байт(код операции):

1000 0001b=81h – AND (r/m <- r/m&data), поле w=1, т.е. операнд 16-ти разрядный.

2-й байт(постбайт):

B5h=10110101, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0b2a3h);

110 – reg:

101 – reg/mem: способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=DI+disp

3-й байт(младший байт смещения адреса первого операнда):

a3h.

4-й байт(старший байт смещения адреса первого операнда):

B2h.

5-й байт(младший байт смещения адреса второго операнда):

14h.

6-й байт(старший байт смещения адреса второго операнда):

ffh

Мнемоника команды: AND [word DI+0b2a3h], 0ff14h

Коментарий к команде: M(ES:DI+0b2a3h) <- M(ES:DI+0b2a3h)& 0ff14h

Адресация операндов:

Левый операнд : базовая, где DI – база, 0b2a3h – смещение

Правый операнд –непосредственная, 0ff14h – непосредственное значение.

Размещение команды в памяти:

Время выполения команды:

Время выполнения команды в тактах:

nТ=(n+Tиа)=17+Tиа, где Tиа – время вычисления эффективного адреса: EA=DI+disp16.

Находим, что Tиа=9, тогда nТ=17+9=26 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=26*10-8=0,26 мкс, де

tТ=1/fТ=1/100000000=10-8.

================ №3 Навести команду мікропроцесора x86… ===============

Для скидання бітів числа в нуль використовується операція логічне «і». В мові асемблера їй відповідає команда AND. Першим операндом команди буде 8-и бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно скинути в нуль 2, 4, 6-ий біти, то маска буде мати вигляд 10101011. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду

AND AL, 10101011:

X X X X X X X X

1 0 1 0 1 0 1 1

X 0 X 0 X 0 X X

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, в якій 2, 4, 6-ий біти будуть нулями, а інші біти неп зміняться.

================ №4 Сформувати … номер переривання 87 ================

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 30-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 87*4 = 384D = 0101011100В. Таким чином повна 20-и розрядна фізична адреса обробника 30-ого переривання має вигляд: 00000000000101011100В

============= №5 Виконати функцію … команди SBB AL, data8… ============

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -5 буде віднято 50, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -5-50 можна замінити операцією -5+(-50). Для цього треба представити число -50 в додатковому коді: записуємо модуль цього числа в двійковій формі: 50D= 00110010B; інвертуємо отриманий результат: 11001101В; додаємо до отриманої комбінації одиницю:

11001101

1

1 1001110

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11001110В = 1+16+32=49. До отриманого результату додаємо одиницю і отримуємо 50, а оскільки знаковий розряд = 1, то маємо -50. Переведення в додатковий код виконано вірно. Таким же чином переведемо -5 в додатковий код: 5D = 00000101B; інвертуємо: 11111010В; додаємо одиницю: 11111011B. Робимо перевірку: 11111011B = 4. До отриманого результату додаємо одиницю і отримуємо 5, а оскільки знаковий розряд = 1, то маємо -5. Виконуємо операцію додавання над числами в додатковому коді:

11001110

11111011

1 11001001

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

11001001

11111111

1 11001000

Переведемо отриманий результат з додаткового коду в десяткову форму: 111001000В = 1+2+4+16+32+1=56D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -56

Білет 11

  1. Зробити ручне ассемблерування (компіляцію) команди: mov [bx + si + 0c5fch], 0d3aeh та отримати її машинний код. Привести коментар до вказаної команди; назвати способи адресації операндів, що в ній використовуються; розрахувати час виконання команди при fT=10 МГц та обсяг пам’яті, яка використовується зберігання машинного коду команди; навести розташування команди у пам’яті (сегмент, зміщення).

Відповідь:

Комментарий к команде: M(DS:BX+SI+ 0c5fch) ←0d3aeh

1-й байт(код операции):

из табл. комманд, № 7 находим КОП 11000111b=C7h, w=1, т. к. длина операнда 16 бит.

2-й байт(постбайт): md000 r/m

10 – mod: поле mod=10, т.к. при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0c5fch);

000 – reg: поле reg содержит расширение КОП (1-й байт);

000 – reg/mem: поле reg/mem =111, т.к. способ вычисления адреса левого(первого) операнда в сегменте данных: ЕА=(BX)+(SI)+disp16= BX+SI+ 0c5fch.

Получаем второй байт: 10000000=80h.

3-й байт(dispLow):fch.

4-й байт(dispHigh):c5h

5-й байт(dataLow):aeh

6-й байт(dataHigh):d3h

Машинный код команды: C7 80 FC C5 AE D3

Длина команды: 6 байта.

Способы адресации операндов:

Левый операнд – базово-индексная, где BX – база, SI - индекс, 0c5fch – смещение .

Правый операнд – непосредственная, 0d3aeh – непосредственный 16-и битный операнд.

Время выполнения команды

Время выполнения в тактах:

nТ=(n+Tиа)=10+Tиа, где Tиа – время вычисления эффективного адреса: ЕА=(BX)+(SI)+disp16.

По таблице 11 находим, что для базовой адресации Tиа=11, тогда nТ=10+11=21 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=21*10-8=0,21мкс, где

tТ=1/fТ=1/100000000=10-8.

  1. Виконати ручне дизасемблерування наведеного шістнадцяткового машинного коду команди: C7 87 E3 B6 C5 D3 та отримати мнемокод команди; Привести коментар до вказаної команди; назвати способи адресації операндів, що в ній використовуються; розрахувати час виконання команди при fT=10 МГц та обсяг пам’яті, яка використовується для зберігання машинного коду команди; навести розташування команди у пам’яті (сегмент, зміщення).

Задание: C7 87 E3 B6 C5 D3

Длина команды: 6 байт.

1-й байт(код операции):

1100 0111b= C7h – MOV (r/m <- data), поле w=1, т.е. операнд 16-ми разрядный.

2-й байт(постбайт): md000 r/m

1000 0111b=87h, где

10 – mod: при вычислении эффективного адреса в команде используется 16-ти разрядное смещение(disp16=0b6e3h);

000 – reg

111 – reg/mem, mod=10: левый операнд – (BX) + disp16

3-й байт(dispLow):E3

4-й байт(dispHigh):B6

5-й байт(dataLow):C5

6-й байт(dataHigh):D3

Мнемоника команды: MOV [BX+0b6e3h], 0D3C5h

Адрессация операндов:

левый – базовая, где BX – база, 0b6e3h – смещение

правый – непосредственная, 0D3C5h – непосредственное значение

Комментарий к команде: M(DS:bx+0b6e3h) <- 0D3C5h

Время выполнения

Время выполнения в тактах:

nТ=(n+Tиа)= 10+ТИА, где Tиа – время вычисления эффективного адреса: EA=DX+disp16.

По таблице 11 находим, что Tиа=9, тогда nТ=10+9=19 тактов.

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

Tk=(n+Tиа)*tТ=nТ*tТ=19*10-8=0,19 мкс, где

tТ=1/fТ=1/100000000=10-8.

  1. Навести команду мікропроцесора ix86 та сформувати 8-розрядне число (data = 8 біт), за допомогою якого парні біти акумулятора AL можна встановити в “1”. Інші біти AL залишити без змін. Відповідь пояснити.

Для встановлення бітів двійкового числа в “1” використовується операція логічне ”АБО”. В мові асемблера їй відповідає команда OR. Першим операндом команди буде 8-ми бітний регістр AL, другим – безпосереднє число, маска для інвертування. Оскільки необхідно встановити парні біти( тобто 0-й,2-й,4-й,6-й) то маска буде мати вигляд 01010101. Нехай в регістрі AL записана наступна комбінація: ХХХХХХХХ. Виконаємо команду OR AL,01010101:

X X X X X X X X

0 1 0 1 0 1 0 1

X 1 X 1 X 1 X 1

Як бачимо в наслідок виконання команди в регістр AL буде поміщена комбінація, парні біти якої встановлені в “1”.

  1. Сформувати 20-розрядну фізичну адресу входу в таблицю адрес переривань, якщо номер (тип) переривання дорівнює 63. Відповідь пояснити.

Мікропроцесор іх86 має векторну (адресну) систему переривань із зовнішніми і внутрішніми джерелами запитів. Кожне джерело має свій “тип” – номер “входу” у таблицю векторів (адрес) оброблювачів переривань, за яким МП знаходить відповідну підпрограму обслуговування переривання. Таблиця векторів має 256 входів з номерами від 0D до 255 D і займає перші 1024 байти пам'яті – по чотири байти на кожен тип запиту (256х4 = 1024). Оскільки таблиця переривань знаходиться починаючи з нульових адрес в сегменті коду то старші 10 розрядів фізичної адреси представляють собою нулі. Молодші 10 розрядів фізичної адреси входу в таблицю переривань визначаються зсувом на 2 розряди вліво(множення на 4) номеру переривання. Так для 63-ого переривання молодші 10 розрядів фізичної адреси знаходимо як 63*4 = 252D = 0011111100В. Таким чином повна 20-и розрядна фізична адреса обробника 63-ого переривання має вигляд: 00000000000011111100В.

  1. Виконати функцію МП-ра ix86 та отримати результат виконання команди SBB AL,data8, якщо перед виконанням команди операнди, які являють собою числа зі знаком мають наступні значення: AL = -65, data8 = 26, CF = 1. Відповідь пояснити.

Команда SBB виконує віднімання значення правого операнда від лівого з урахуванням позики(прапорця СF) і результат поміщає в лівий операнд. В даному випадку від -65 буде віднято 26, а потім віднято 1. Результат буде записаний в регістр AL. Операцію -65-26 можна замінити операцією -65+(-26). Для цього треба представити число -26 в додатковому коді: записуємо модуль цього числа в двійковій формі: 26D= 00011010B; інвертуємо отриманий результат: 11100101В; додаємо до отриманої комбінації одиницю:

11100101

1

11100110

Зробимо перевірку: в додатковому коді значущими розрядами є нульові тобто 11100110В = 1+8+16=25. До отриманого результату додаємо одиницю і отримуємо 26, а оскільки знаковий розряд = 1, то маємо -26. Переведення в додатковий код виконано вірно. Таким же чином переведемо -65 в додатковий код: 65D = 01000001B; інвертуємо: 10111110В; додаємо одиницю: 10111111B. Робимо перевірку: 10111111B = 64. До отриманого результату додаємо одиницю і отримуємо 65, а оскільки знаковий розряд = 1, то маємо -65. Виконуємо операцію додавання над числами в додатковому коді:

11100110

10111111

110100101

Врахуємо СF: виконаємо віднімання СF від отриманого результату:

110100101

11111111

110100100

Переведемо отриманий результат з додаткового коду в десяткову форму: 110100100В = 1+2+8+16+64+1=92D. Оскільки знаковий біт встановлений в 1, то отриманий результат від’ємний, тобто -92.

19

  1. Зробити ручне ассемблерування (компіляцію) команди: mov [di + 0b6aeh], 0c2cbh та отримати її машинний код. Привести коментар до вказаної команди; назвати способи адресації операндів, що в ній використовуються; розрахувати час виконання команди при fT=10 МГц та обсяг пам’яті, яка використовується зберігання машинного коду команди; навести розташування команди у пам’яті (сегмент, зміщення).