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


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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

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

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

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

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

 

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

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

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

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

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

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

1DB6:0100 0F DB 0F

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

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

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

-a cs:100

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1DB6:0111 98 CBW 98

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

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

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

1DB6:011C F6D8 NEG AL F6

1DB6:011E 98 CBW 98

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

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

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

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

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

1DB6:0131 CD20 INT 20 CD

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

 

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

 

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

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

 

 

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

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

 

 

1111 01 1 0 00 101 110 0100 0001 0000 0001

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

 

 

0000 010 1 1111 1100 0000 0000

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

 

 

1111 01 1 1 00 111 110 0100 0110 0000 0001

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

 

1000 000 1 00 010 110 0100 1010 0000 0001

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

 

1001 1000

Код операції

 

1100 1101 0010 0000

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

 

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

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

 

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

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

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

 

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

1DB6:0100 A0 41 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.

a b c d a b c d a b c d a b c d
      -     -200             -9     -5   - -10
  -20     -10   -5     -30     -29   -6     -360   -4
    - - -13   -7   -12     -2 - -       -12   -18
  -2 -12   -4   -12   -17       -4   -3       - -23
      -7       -43   -8     -1234   -12     -6   -7
    -4         -5   -6     -45   -13     -65   -4
    -23   -7     -2   -18     -5   -24       -15 -100
    -6 - -8     -7   -34     -13   -7     -67   -7
    -6   -47                              

5.

6.

7.


<== предыдущая | следующая ==>
Расчет численности производственного персонала | Контрольная работа по дисциплине

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



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