Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

M_Asm2009LS

.pdf
Скачиваний:
17
Добавлен:
23.02.2016
Размер:
2.34 Mб
Скачать

3) Додаємо одиницю і одержимо зображення від’ємного числа – 91 у доповняльному коді. Для даних розміром байт рис. 10 (у шістнадцятковій формі – А5h), для даних розміром слово – рис. 11 (у шістнадцятковій формі – FFА5h) та даних розміром подвійне слово – рис. 12 (у шістнадцятковій формі –

FFFFFFА5h).

Біти 7 6 5 4 3 2 1 0 Число 1 0 1 0 0 1 0 1

Рис. 10. Форма 8-бітового доповняльного коду числа -91

Біти

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Число

1

1

1

1

1

1

1

1

1

0

1

0

0

1

0

1

Рис. 11. Форма зображення 16-бітового доповняльного коду числа -91

Біти

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Число

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

Біти

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Число

1

1

1

1

1

1

1

1

1

0

1

0

0

1

0

1

Рис. 12. Форма зображення 32-бітового доповняльного коду числа -91

Аналогічно цілі дані зберігаються в загальних регістрах. Приклад. Число 91 в регістрі АХ.

Біти

1

1

1

1

1

1

9

8

7

6

5

4

3

2

1

0

 

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

АХ

0

0

0

0

0

0

0

0

0

1

0

1

1

0

1

1

 

 

 

 

00

 

 

 

 

 

 

5B

 

 

 

 

 

 

 

AH

 

 

 

 

 

 

AL

 

 

 

Рис. 13. Форма зображення числа 91в регістрі АХ

 

 

Приклад. Число -91 в регістрі АХ.

 

 

 

 

 

 

 

Біти

1

1

1

1

1

1

9

8

7

6

5

4

3

2

1

0

 

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

АХ

1

1

1

1

1

1

1

1

1

0

1

0

0

1

0

1

 

 

 

 

FF

 

 

 

 

 

 

A5

 

 

 

 

 

 

 

AH

 

 

 

 

 

 

AL

 

 

 

Рис.14. Форма зображення числа -91 в регістрі АХ

21

На відміну від зображення в регістрах, цілі числа, що займають поле оперативної пам’яті розміром у слово, подвійне слово або почетверенне слово, зберігаються в послідовних байтах, адреси яких зростають. Отже, число розміром у слово зображується так, що молодші 8 бітів числа розміщуються в молодшому байті слова, а старші 8 бітів − у наступному байті зі старшою (більшою) адресою. Наприклад, число 91 (005bh) розміром у слово зберігається в оперативній пам’яті так:

 

5b

 

00

 

 

а число –91

в полі пам’яті розміром у слово зберігається в пам’яті

так:

 

 

 

 

 

a5

 

FF

 

Число розміром у подвійне слово зображується так, що в молодшому байті розміщуються молодші 8 бітів числа, а в найстаршому байті розміщуються найстарші 8 бітів числа. Наприклад, число 305419896, яке в шістнадцятковій системі числення дорівнює 12345678h, зберігається в оперативній пам’яті у вигляді

78

56

34

12

а число –91 в полі оперативної пам’яті розміром у подвійне слово зберігатиметься так:

a5

FF

FF

FF

4. Команда пересилки даних MOV

Команда MOV пересилає дані з джерела у приймач розміром байт, слово або подвійне слово в залежності від типу операндів.

Загальний вигляд команди

MOV dst,src; dst=(src),

де src – джерело, dst – приймач, (src) – вміст джерела. Після крапки з комою вказано алгоритм виконання команди – в приймач пересилається вміст джерела.

Надалі використовуватимемо такі позначення:

reg – загальний регістр (припустиме явне задання розміру у вигляді reg8, reg16, reg32);

mem – комірка пам’яті (можливе явне задання розміру у вигляді mem8, mem16, mem32);

imm – безпосереднє значення в команді (з можливими розмірами imm8, imm16, imm32);

sreg – сегментний регістр CS, DS, SS, ES, GS, FS;

reg/mem – регістр або комірка пам’яті (явне задання розміру має вигляд reg/mem8, reg/mem16, reg/mem32).

22

Допустимі форми команди MOV:

MOV reg,imm ;завантаження довільної сталої в регістр MOV reg/mem, imm ;завантаження довільної сталої в регістр

або пам’ять

MOV reg/mem, reg ;пересилка з регістра в регістр або пам’ять MOV reg, reg/mem ;пересилка в регістр з регістра або пам’яті MOV sreg, reg16 ;завантаження сегментного регістра MOV reg/mem16, sreg ;збереження сегментного регістра

Наведемо деякі особливості команди MOV.

1.Тільки за допомогою MOV (і стекових команд) можна завантажувати і зберігати сегментні регістри.

2.За допомогою команди MOV не можна завантажити сталу в сегментний регістр. Як проміжний потрібно використовувати один із загальних регістрів.

3.Якщо в команді вказано один з акумуляторів (AL|AX|EAX), то довжина команди зменшується на одиницю.

4.У P-режимі команда завантаження будь-якого сегментного регістра зумовлює записування в тіньовий регістр адреси сегмента з відповідного дескриптора. Це призводить до збільшення часу виконання команди.

5.Виконуючи команду MOV SS, src, процесор забороняє переривання на час виконання наступної команди, оскільки припускається, що наступна команда завантажуватиме регістр

SP/ESP.

5. Команди додавання та віднімання

Команди додавання та віднімання виконують операції зі знаковими або беззнаковими цілими числами розміром у байт, слово або подвійне слово. Для виконання операцій додавання та віднімання є такі команди: ADD, ADC, INC, SUB, SBB та DEC.

Команди додавання двох чисел ADD і додавання з перенесенням ADC мають такий загальний вигляд:

ADD dst,src; dst = (dst)+(src); ADC dst,src; dst = (dst)+(src)+(cf).

Команда ADD забезпечує додавання вмісту приймача – (dst) і вмісту джерела – (src). Результат записується в приймач dst. У команді ADC, окрім вказаної дії, до молодшого біта суми додається значення прапорця перенесення cf. Обидві команди встановлюють нові значення прапорців cf, zf, af, pf, sf, of.

До команд додавання відносять також команду INC інкремента:

INC dst; dst = (dst)+1.

23

Ця команда еквівалентна команді ADD dst,1, за винятком того, що не впливає на прапорець cf.

Команди віднімання двох чисел SUB і віднімання з позичанням SBB мають такий загальний вигляд:

SUB dst,src; dst = (dst)−(src); SBB dst,src; dst = (dst)−(src)−(cf).

Команда SUB віднімає джерело від приймача і різницю записує в приймач. Команда SBB, окрім цієї дії, з молодшого біта різниці віднімає значення прапорця cf. Обидві команди встановлюють нові значення прапорців cf, zf, af, pf, sf, of.

До команд віднімання відносять також команду DEC декремента:

DEC dst; dst = (dst)−1.

Ця команда еквівалентна команді SUB dst,1 за винятком того, що не впливає на прапорець cf.

Команда зміни знаку NEG має такий вигляд:

NEG dst; dst = 0−(dst).

Виконання команди NEG зводиться до інвертування кожного біта (dst), а потім інкрементується результат. Команда впливає на прапорці. Прапорець cf = 1, якщо операнд ненульовий, інакше – cf =0. Прапорці zf, pf, sf, of встановлюються у відповідності до результату.

Якщо операнд має найменше від’ємне значення (наприклад, –128 для 8-бітового операнда), то його величина не змінюється, але прапорці of і cf установлюються рівними 1.

Команда порівняння СМР має загальний вигляд

CMP dst,src; (dst)−(src)

і виконується за алгоритмом команди SUB, за винятком того, що результат віднімання нікуди не записується. Стан прапорців після команди порівняння можна перевірити за допомогою команд умовного переходу і з’ясувати результат порівняння.

6. Обчислення цілих арифметичних виразів

Програмування обчислення арифметичних виразів мовою асемблера у порівнянні з програмуванням виразів мовами вищого рівня є достатньо рутинним, але, з іншого боку, можна одержати найбільш ефективний код.

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

по-перше, правильно задати формат команди та операнди dst і src, якщо вони необхідні;

по-друге, задати тип операндів, який може бути визначений явно або неявно. Виникає необхідність визначати тип операндів, які

24

знаходяться в пам’яті, якщо їх адреси задаються неявно. В окремих випадках тип операнда визначається транслятором за типом іншого операнда. Найкраще для визначення типу використовувати оператори явного перетворення, до яких відносять:

BYTE PTR – перетворення до типу байт;

WORD PTR – перетворення до типу слово;

DWORD PTR – перетворення до типу подвійне слово. Наприклад.

INC WORD PTR avar ; avar комірка розміром в слово;

DEC BYTE PTR [SI] ; SI містить зміщення комірки розміром

убайт.

по-третє, при програмуванні арифметичних виразів необхідно враховувати стан прапорців після виконання команд, оскільки при виконанні арифметичних операцій можливе виникнення різних особливих ситуацій, наприклад переповнення або ділення на нуль, які називаються винятками або винятковими ситуаціями.

Розвязування задач за тематикою заняття

Задача 1. Описати символьний рядок “Hello world !”. Розв’язування. Описати символьний рядок можна такими

способами

mystring db ‘ Hello world !’

або

mystring db ‘ ‘,’H’,’e’,’l’,’l’,’o’,’ ‘,‘w’,’o’,’r’,’l’,’d’,’ ! ‘.

Задача 2. Описати вектор, який складається з n (n=100) елементів

розміром

подвійне

слово

із

заданим початковим значенням a

(a=250h).

 

 

 

 

Розв’язування.

 

 

 

N

= 100

; або

N equ 100

A

equ 250h

; або

A

= 250h .

vector dd N Dup( A )

Задача 3. Описати матрицю M (n*n), яка складається з елементів розміром у 8 байтів із заданим початковим значенням. Розв’язування.

N = 10

ELEMENT = 12.45e4 ; або ELEMENT = 124500

Mdq N * N Dup( ELEMENT ).

Задача 4. Знайти об’єктний код фрагмента сегмента даних у шістнадцятковій системі числення

25

a dw 403fh c dw 256 d dd 300.

Розв’язування. Сталі 256 та 300 переведемо у шістнадцяткову систему числення, тобто

a dw 403fh

 

c dw 256

; = 0100h

d dd 300

; = 0000012ch.

У пам’яті комп’ютера дані розміром у слово і більше розміщуються в сусідніх байтах у порядку зростання адрес, причому адреса слова, подвійного слова – це адреса молодшого байта поля, виділеного для цих даних. Об’єктний код має вигляд:

3f 40 00 01 2c 01 00 00.

Задача 5. Розробитии процедуру для обчислення виразу: f = ((a+1)+(c-d)+(d-1))+5-b,

де a = 657, b = 265, c = 738, d = 273.

Розв’язування.

Data

Segment

para 'code'

a

dw

657

b

dw

265

c

dw

738

d

dw

273

f

dw

?

Data

Ends

 

Code

Segment

para 'code'

Assume CS:Code,DS:Data, ES:Nothing

Main Proc far

;.................... Основна програма.....................................

push DS

 

sub AX,AX

 

push AX

 

mov AX,Data

 

mov DS,AX

 

call Calc

 

retf

 

Main Endp

 

Calc Proc near

; Процедура обчислення виразу.

mov AX,a

; Записати в регістр AX число а.

inc AX

; Збільшити вміст регістра AX на 1.

mov CX,c

; Записати в регістр CX число с.

sub CX,d

; Відняти d від вмісту регістра CX

26

 

 

mov DX,d

; Записати в регістр DX число d.

 

dec DX

; Зменшити вміст регістра DX на 1.

 

add AX,CX

; Додати до вмісту регістра AX

 

add AX,DX

; вміст регістрів CX і DX.

 

add AX,5

; Додати 5 до вмісту регістра AX.

 

sub AX,b

; Відняти b від вмісту регістра AX.

 

mov f,AX

; Записати вміст регістра AX в f

 

ret

; Повернення з процедури.

Calc

Endp

; Директива кінця процедури.

Code

Ends

 

 

End Main

 

Завдання для самостійної роботи

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

2.Описати вектор, що складається з N елементів типу T, матрицю розмірності (N*N) елементів типу R.

 

 

 

 

N

 

T

 

 

 

R

 

 

 

1

 

10

слово

 

подвійне слово

 

 

 

2

 

13

байт

 

слово

 

 

 

 

 

 

3

 

11

подвійне слово

байт

 

 

 

 

 

 

4

 

12

4 байти

 

6 байтів

 

 

 

 

 

5

 

24

8 байтів

 

слово

 

 

 

 

 

 

6

 

12

10 байтів

 

подвійне слово

 

 

 

7

 

13

слово

 

подвійне слово

 

 

 

8

 

11

байт

 

4 байти

 

 

 

 

 

9

 

12

6 байтів

 

8 байтів

 

 

 

 

 

10

 

45

слово

 

10 байтів

 

 

 

 

 

11

 

13

подвійне слово

слово

 

 

 

 

 

 

12

 

11

10 байтів

 

байт

 

 

 

 

 

 

13

 

12

слово

 

6 байтів

 

 

 

 

 

14

 

24

байт

 

слово

 

 

 

 

 

 

15

 

12

6 байтів

 

подвійне слово

 

3. Знайти об’єктний код фрагмента даних

 

 

 

 

 

1

A dw 2101h

11

a dd 30618

21

 

a dd 5a57h

 

 

 

 

b dd 307h

 

b dd

dbh

 

 

b dd 1e5h

 

 

 

 

c dd 15409

 

c dw 6b0ch

 

 

c dw 16851

 

27

2

a dd 2462h

12

a dd 3166

22

a dd 11adh

 

b dd

369

 

b dw 31h

 

b dw 197h

 

c dw 5115

 

c dd 1671h

 

c dd 25009

3

a dd 21745

13

a dw 30568

23

a dd 14aeh

 

b dw

240

 

b dd 244h

 

b dd e4h

 

c dd 37d2h

 

c dd 4154h

 

c dw 27503

4

a dd 70ah

14

a dd 12731

24

a dw 6d71h

 

b dd

707

 

b dw 38bh

 

b dd 747

 

c dw

363

 

c dd 157fh

 

c dd 21777

5

a dd bbdh

15

a dw 2e5ah

25

a dd 23223

 

b dd

86h

 

b dd 207h

 

b dw 8fh

 

c dw 19712

 

c dd 3698

 

c dd 219ch

6

a dw 13224

16

a dd 442h

26

a dd 56b0h

 

b dd 349h

 

b dd 10ah

 

b dd 817

 

c dd 1e01h

 

c dw 18897

 

c dw 18006

7

a dw 20440

17

a dd abch

27

a dw 155bh

 

b dd

833

 

b dd fdh

 

b dd c4h

 

c dd 5bah

 

c dw 22992

 

c dd 12064

8

a dd 7199h

18

a dw 6d76h

28

a dw 27775

 

b dw 1e8h

 

b dd 602

 

b dd 619

 

c dd 9139

 

c dd 11246

 

c dd 36adh

9

a dd 7a65h

19

a dd 1feh

29

a dd 3931

 

b dd 522

 

b dd 169h

 

b dw 1fbh

 

c dw 2774

 

c dw 28044

 

c dd 629ch

1

a dd 18255

20

a dd 30349

30

a dd 10869

0

b dw 366h

 

b dw 296h

 

b dw 796

 

c dd 2ba7h

 

c dd 3115h

 

c dd 50bfh

4.Розробити процедуру для обчислення виразу:

 

Вираз

Значення змінних

1

a=a+c-(d-(b+8)+(a+b+c+d)-9)-b+c

a=51 b=22 c=5ah d=48h

2

a=b+b-(d-(c-1-(a+c+d-1)+5))-a+b

a=30 b=44h c=63h d=88

3

a=b-c-(c+(1+9-(b+c+d+1-1)-b))+c

a=3ch b=40h c=12 d=5eh

4

a=(b+b-(c+(d+7+a)-c)+c)+d+1-a+b

a=2ah b=33 c=4ch d=43h

5

a=b-d+(c-d+1-((a-c-d)+1-1)+b)+b

a=6ch b=72h c=32h d=19

6

a=b-(c+c-1-(4-(a+b-c)+d))+8+a+c

a=71 b=2ah c=4bh d=68h

7

a=(a+c-(d-(1+1+b-c))-c)+1+1+b+b

a=31h b=73 c=14 d=67

8

a=a+c+(d-(1+b+(a+c)+c))-1-5-b+b

a=13h b=24 c=1eh d=5bh

9

a=a-(b+d-(1+1+a-(c+c)+d-5)+b)+c

a=37h b=39 c=6bh d=2eh

10

a=b-(c-d-(b+(5-a+c))-d+1+1)-a+c

a=34h b=93 c=3eh d=97

28

11

a=(a+b+(d-(1+1)+a)-c-d+1)+7-b-c

a=31h b=64 c=56 d=15h

12

a=(b+b-d+1+(5-(b-c))-d+1-9)+b-c

a=4ch b=44 c=85 d=2ch

13

a=b+(b-c+d+1+(a-(c-d)-d+1))-a+b

a=12 b=51 c=42h d=42

14

a=(a-b-d-(1+1)-b-(b-c+d)+5)+a+c

a=11 b=64h c=12 d=58h

15

a=b-(c-(a+d+9-(b-d)-c)-1)-4-a-b

a=6fh b=25 c=39 d=1ch

16

a=a-(c+(d+(d)+1-a+c+d+a-1)+b+b)

a=70 b=21 c=22h d=73

17

a=b-c-c+(1-(7+(b+b-c)-d)+3-a+b)

a=30 b=3eh c=2ah d=22

18

a=b+c-(c+d-(6-a)-(b-d-c+7)+b)+c

a=1dh b=38h c=74 d=3ah

19

a=a+((b+d-a-1)-(b-c)-c)+d-1-a+c

a=57h b=31h c=46 d=3fh

20

a=(b-b)+c+(5-1+(a-b)+d+1)+6+a+b

a=1bh b=5eh c=2ah d=15h

21

a=(b-c+(d-c-(1-a-b)+d+d))-1-b+b

a=70h b=83 c=50 d=16h

22

a=a-(b+(d+1+9+(b+b)+d+d)+1)-a-b

a=73 b=95 c=89 d=24h

23

a=a+b-(d-(1+(1+a)-c-c+1)+8)+a+b

a=36h b=39 c=43 d=33

24

a=a+b+(d-(d+2)+(a-c-d))+d-1-a+c

a=25h b=3eh c=29 d=82

25

a=b+c+c-((d+4-(a-c))+c)-d-1+b+b

a=30h b=62h c=24 d=17

26

a=(a+c-(c+(1-d))+b+b-c+1)+2-b+c

a=10 b=21h c=18h d=86

27

a=b-(b+c+(1-(1-a+b))-c-1-d)-b+b

a=33h b=54 c=83 d=38h

28

a=b+b-((d+d-(1-a)-b)+d+d-1)-b-c

a=70 b=5fh c=87 d=78

29

a=b+b-(c+(1+4-b)+(b+c+d)+1)+b+b

a=47 b=2dh c=58 d=48h

30

a=a+c+(d+a)-((1+a+b-d-d-8)+b)-b

a=37 b=81 c=58h d=43h

29

Лабораторна робота № 3 Цикли. Організація вкладених циклів. Команди передачі керування

Мета: вивчення механізму роботи з командами безумовних та умовних переходів. Розробка програм з розгалуженням та циклічних програм.

План заняття.

1.Команда безумовного переходу JMP. Типи адрес переходу SHORT, NEAR, FAR.

2.Команди умовних переходів.

3.Команди організації циклів LOOP, LOOPE|LOOPZ, LOOPNE|LOOPNZ.

4.Способи завантаження ефективної адреси.

5.Стекові передачі даних.

Теоретичні відомості

1. Команда безумовного переходу JMP. Типи адрес переходу SHORT, NEAR, FAR

Загальний вигляд команди

JMP мітка

Використовується в програмі для переходу як у межах поточного сегмента коду, так і поза його межі. Команда JMP у залежності від типу мітки змінює вміст або тільки одного регістра IP|EIP (IP або EIP), або двох регістрів CS і EIP|IP. Виконання команд безумовного переходу не впливає на стан прапорців. Команда має п’ять форм, три з яких передають керування в межах сегмента, а дві – передають керування між сегментами. В короткому (SHORT) переході двобайтова команда

JMP rel8

містить в другому байті зміщення, яке трактується як знакове ціле число. При виконанні команди значення зміщення додається (з розширенням знака до 16|32 бітів) до вмісту регістра IP|EIP, яке відповідає адресі команди, що знаходиться після команди JMP. Діапазон зміщень від − 128 до + 127. Якщо зміщення додатне, то здійснюється перехід вперед, а якщо від’ємне – назад.

Команда прямого переходу (NEAR) у межах поточного сегмента

JMP rel16|32

аналогічна попередній, але вона містить повне зміщення розміром 16 або 32 біти в залежності від атрибутів сегмента коду. Зміщення також трактується як знакове ціле число і додається до вмісту регістра

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]