Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Вимоги до програмиПрограму скласти на мові асемблера з явною адресацією операндів для введення, налагодження і виконання в середовищі сервісної програми debug.com. Вихідні, проміжні і результуючі дані розмістити в пам'яті ЕОМ, починаючи з чергового за програмою параграфом. Результуюче значення виразу, що дорівнює , вивести на екран.
4.4.3. Розробка алгоритму і програми
а) Розподіл пам'яті Коефіцієнти A, B, C, D і результат Y - це змінні величини, значення яких повинні бути розміщені в комірках пам'яті з чергового параграфа, що йде за програмою, яка робить обчислення. Для написання програми нам знадобиться 16 машинних команд. Якщо кожна з цих команд програми буде мати довжину навіть по чотири байти (16*4=64d=40h), а сама програма буде розташована в кодовому сегменті, починаючи із зміщення 0100h, то очікувана адреса першої вільної комірки пам'яті повинна бути: 0100h+40h=0140h.
Так як при завантаженні налагоджувача debug.com вміст CS дорівнює DS,.то в оперативній пам’ті, починаючи з адреси DS:0140, необхідно буде розташувати чисельні значення вихідних, проміжних і результуючих даних таким чином: DS: 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 014A 014B 014C 014D байт байт мбайт сбайт байт байт мбайт сбайт мбайт сбайт мбайт сбайт мбайт сбайт
В и х і д н і д а н і. П р о м і ж н і д а н і Р е з у л ь т у ю ч і д а н і A B C D Znam Chis Остача Частка
б) Розробка алгоритму і програми.
4.4.4. Робота в середовищі налагоджувача 1) Створимо середовище налагоджувача debug.com: F:\912\91205>debug.com, переглянемо вміст регістрів МП. AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0100 NV UP EI PL NZ NA PO NC 1DB6:0100 0F DB 0F 2) Введемо в мнемокодах асемблера команди програми, починаючи з адреси CS:0100: {Адреса 1-іх} { К о м а н д и } { Довжина } {байт команд} {п р о г р а м и} { команди } -a cs:100 1DB6:0100 mov al, [0141] {3 байта} 1DB6:0103 add al, [0144] {4 байта} 1DB6:0107 imul byte ptr [0141] {4 байта} 1DB6:010B mov [0146], ax {3 байта} 1DB6:010E mov al, [0144] {3 байта} 1DB6:0111 cbw {1 байт} 1DB6:0112 add ax, [0142] {4 байта} 1DB6:0116 mov [0148], ax {3 байта} 1DB6:0119 mov al, [0140] {3 байта} 1DB6:011C neg al {2 байта} 1DB6:011E cbw {1 байт} 1DB6:011F imul word ptr [0148] {4 байта} 1DB6:0123 idiv word ptr [0146] {4 байта} 1DB6:0127 add ax, 00FC {3 байта} 1DB6:012A mov [014C], al {3 байта} 1DB6:012D mov [014A], dx {4 байта} 1DB6:0131 int 20 {2 байта} 3) Переглянемо вміст 33h=51d байт пам'яті, починаючи з байта CS: 0100, диасемблюючи (інтерпретуючи) їхні шістнадцяткові коди в мнемонічні команди мови асемблера: -u cs:100 L 33 {Адреса 1-іх} {Коди машиних} { К о м а н д и } { Код операції} {байт команд} {команд в 16с/ч} {п р о г р а м и} { к о м а н д и } 1DB6:0100 A04101 MOV AL, [0141] A0 1DB6:0103 02064401 ADD AL, [0144] 02 1DB6:0107 F62E4101 IMUL BYTE PTR [0141] F6 1DB6:010B A34601 MOV [0146], AX A3 1DB6:010E A04401 MOV AL, [0144] A0 1DB6:0111 98 CBW 98 1DB6:0112 03064201 ADD AX, [0142] 03 1DB6:0116 A34801 MOV [0148], AX A3 1DB6:0119 A04001 MOV AL, [0140] A4 1DB6:011C F6D8 NEG AL F6 1DB6:011E 98 CBW 98 1DB6:011F F72E4801 IMUL WORD PTR [0148] F7 1DB6:0123 F73E4601 IDIV WORD PTR [0146] F7 1DB6:0127 05FC00 ADD AX, 00FC 05 1DB6:012A A34C01 MOV [014C], AX A3 1DB6:012D 89164A01 MOV [014A], DX 89 1DB6:0131 CD20 INT 20 CD 4) Визначимо призначення двійкових розрядів у декількох створених машинних командах (користуємось таблицею простору первинних і вторинних кодів операцій процесора 80x86 - стор.18-19).
Код опер. w адрес-млад. адрес-старш.
Код оп. d w mod reg r/m адрес-мол. адрес-старш
Код оп. d w mod imul r/m адрес-мол. адрес-старш
Код опер. w дані дані (w=1)
Код оп. d w mod idiv r/m адрес-мол. адрес-старш
Код опер. w mod reg r/m адрес-мол. адрес-старш
Код операції
Код операції Тип переривання
5) Введемо з комірки DS:0140 значення коефіцієнтів A, B, C, D і код символу * рівний 2A (на плановане місце замість розташування проміжних і результуючих даних): -e ds:0140 20 fb b0 01 fa 2a 2a 2a 2a 2a 2a 2a 2a 2a
6) Переглянемо вміст 14 байт пам'яті створеної області вихідних і інших даних: -d ds:0140 L е шістнадцяткові з н а ч е н н я символьні значення 1DB6:0140 20 FB B0 01 FA 2A 2A 2A-2A 2A 2A 2A 2A 2A....*********
7) Переглянемо вихідний дамп пам'яті (4E байт) перед виконанням програми: -d cs:100 L 4е 1DB6:0100 A0 41 01 02 06 44 01 F6 2E 41 01 A3 46 01 A0 44. A... D... A..F..D 1DB6:0110 01 98 03 06 42 01 A3 48 01 A0 40 01 F6 D8 98 F7....B..H..@..... 1DB6:0120 2E 48 01 F7 3E 46 01 05 FC 00 A3 4C 01 89 16 4A. H..>F..... L... J 1DB6:0130 01 CD 20 8E C2 AC 8A D0 00 00 4E AD 8B C8 46 8A......... N... F. 1DB6:0140 20 FB B0 01 FA 2A 2A 2A 2A 2A 2A 2A 2A 2A....********* Виділені тут групи байтів і одиничні байти являють собою машинні команди і вихідні дані нашої програми.
8) Виконаємо трасування введеної програми
8-1) Переглянемо вміст регістрів МП і переконаємося, що CS: IP вказують на першу команду програми: -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0100 NV UP EI PL NZ NA PO NC 1DB6:0100 A04101 MOV AL, [0141] DS: 0141=FB
8-2) Виконаємо першу машинну команду A02001, тобто mov al, [0120], де [0120]=12h. -t AX=00FB BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0103 NV UP EI PL NZ NA PE NC 1DB6:0103 02064401 ADD AL, [0144] DS:0144=FA Бачимо, що AX містить тепер 00FBh, IP=0103 вказує на перший байт другої команди 02064401, тобто add al, [0144], а вміст комірки DS: 0144 = FA = – 6 d.
8-3) Послідовно набираючи команду налагоджувача t і аналізуючи після кожної виконаної машинної команди вміст регістрів МП, порівнюємо очікувані й одержувані проміжні і кінцеві результати роботи програми:-t AX=00F5 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0107 NV UP EI NG NZ AC PE CY 1DB6:0107 F62E4101 IMUL BYTE PTR [0141] DS: 0141=FB Дійсно: (– 5) + (– 6) = – 11 або FB + FA = F5 -t AX=0037 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=010B NV UP EI PL NZ NA PE NC 1DB6:010B A34601 MOV [0146], AX DS: 0146=2A2A Дійсно: (– 11) * (– 5) = 55 або 0037h -t AX=0037 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=010E NV UP EI PL NZ NA PE NC 1DB6:010E A04401 MOV AL, [0144] DS:0144=FA -t AX=00FA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0111 NV UP EI PL NZ NA PE NC 1DB6:0111 98 CBW -t AX=FFFA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0112 NV UP EI PL NZ NA PE NC 1DB6:0112 03064201 ADD AX, [0142] DS: 0142=01B0 -t AX=01AA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0116 NV UP EI PL NZ NA PE CY 1DB6:0116 A34801 MOV [0148], AX DS:0148=2A2A Дійсно: (– 6) + 432 = 426 або FFFA + 01B0 = 01AA -t AX=01AA BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0119 NV UP EI PL NZ NA PE CY 1DB6:0119 A04001 MOV AL, [0140] DS: 0140=20 -t AX=0120 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011C NV UP EI PL NZ NA PE CY 1DB6:011C F6D8 NEG AL -t AX=01E0 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011E NV UP EI NG NZ NA PO CY 1DB6:011E 98 CBW Дійсно: 0 – 32 = – 32 або E0 -t AX=FFE0 BX=0000 CX=0000 DX=FF49 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=011F NV UP EI NG NZ NA PO CY 1DB6:011F F72E4801 IMUL WORD PTR [0148] DS: 0148=01AA
-t AX=CAC0 BX=0000 CX=0000 DX=FFFF SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0123 NV UP EI NG NZ NA PE NC 1DB6:0123 F73E4601 IDIV WORD PTR [0146] DS: 0146=0037 Дійсно: (– 32) * 426 = – 13 632 або – 3540h = FFFF CAC0 -t AX=FF09 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0127 NV UP EI PL NZ NA PO CY 1DB6:0127 05FC00 ADD AX, 00FC Дійсно: (– 13 632) div 55 = – 247 або – F7h = FF09 (– 13 632) mod 55 = – 47 або – 2Fh = FFD1 -t AX=0005 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=012A NV UP EI PL NZ AC PE CY 1DB6:012A A34C01 MOV [014C], AX DS: 014C=2A2A Дійсно: (– 247) + 252 = 5 або (– F7h = FF09) + 00FC = 0005 -t AX=0005 BX=0000 CX=0000 DX=FFD1 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=012D NV UP EI PL NZ AC PE CY 1DB6:012D 89164A01 MOV [014A], DX DS: 014A=2A2A -t AX=0005 BX=0000 CX=004E DX=FFD1 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1DB6 ES=1DB6 SS=1DB6 CS=1DB6 IP=0131 NV UP EI PL NZ AC PE CY 1DB6:0131 CD20 INT 20 -g Program terminated normally -q 8-4) Переглянемо вихідний дамп пам'яті (4E байт) після виконання програми: -d cs:100 L 4е 1DB6:0100 A0 41 01 02 06 44 01 F6 2E 41 01 A3 46 01 A0 44. A... D... A..F..D 1DB6:0110 01 98 03 06 42 01 A3 48 01 A0 40 01 F6 D8 98 F7....B..H..@..... 1DB6:0120 2E 48 01 F7 3E 46 01 05 FC 00 A3 4C 01 89 16 4A. H..>F..... L... J 1DB6:0130 01 CD 20 8E C2 AC 8A D0 00 00 4E AD 8B C8 46 8A......... N... F. 1DB6:0140 20 FB B0 01 FA 2A 37 00 AA 01 D1 FF 05 00....*7....... Вміст слів за адресами CS:014C і CS:014A (або DS:014C і DS:014A) змінено на значення: 0005 і FFD1 = –2Fh = –47d.
Завдання. Розробити програму на асемблері для обчислення значення виразу відповідно до індивідуального завдання. Всі значення змінних задатив пам’яті, результат обчислення переглянути за допомогою налагоджувача (виводити на екран не треба).
Література 1. Абель П. Язык Ассемблера для IBM PC и программирования: Пер. с англ. - М.:Высш. шк., 1992 р. (Стр. 17 - 50); 2. Нортон П., Соухэ Д. Язык ассемблера для IBM PC: Пер. с англ. - М.:Финансы и статистика, 1992 г. (Стр. 36 - 69); 3. Числові значення коефіцієнтів. 4.
5. 6. 7.
|