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

гос / sp-lect (1)

.pdf
Скачиваний:
18
Добавлен:
16.02.2016
Размер:
2.59 Mб
Скачать

db2 + db2 + db2 +1

+

 

db2 × db2

=

dw + dw + dw +1

+

dw × dw

 

dw + dw

 

dd - 2 ×dw- dw2

dw

dd -dd

- dd

 

 

 

 

 

=

dd

+

dq

= dw + dd = dd

 

 

 

 

 

dw

 

 

 

 

 

 

 

 

dd

 

 

 

 

 

 

 

 

.486

 

 

 

 

 

 

 

 

 

 

 

.model flat, stdcall

 

 

 

 

 

.data

 

 

 

 

 

 

 

 

 

 

 

x

 

 

db

 

2

 

 

 

 

 

y

 

 

db

 

3

 

 

 

 

 

z

 

 

db

 

4

 

 

 

 

 

u

 

 

dw

 

5

 

 

 

 

 

vdw 5

w

dd

71

.data?

 

 

result

dd

?

.code

 

 

start:

 

 

;отримуємо по черзі х та у в квадраті та зберігаємо ці

;значення в ркгістрах для того щоб не обчислювати їх ще раз

;при розрахунку чисельника другого дробу

=dw + dd = dw dd

mov al,x

mul al

; AX=AL*AL = x^2

mov si,ax

; й зберегли квадрат х в SI

mov al,y

; AL=y

mul al

; AX=AL*AL = y^2

mov di,ax

; й зберегли квадрат y в DI

mov al,z

; отримуємо z в квадраті

mul al

; результат в AX

mov bx,ax

; звільняємо AX, який буде потім потрібний

add bx,si

; додаємо до z в квадраті х в квадраті

add bx,di

; та у в квадраті і додаємо 1

inc bx

; BX = x^2+y^2+z^2+1

;далі потрібно буде розраховувати x^2*y^2 (чисельник другого дробу)

;розрахуємо x^2*y^2, скориставшись тим, що квадрати х та у зараз в SI і DI

;і збережемо результат для подальшого використання

mov ax,si

; множимо квадрати х та у

mul di

; DX:AX = SI*DI = x^2*y^2

xchg dh,dl

; збираємо результат

bswap edx

; в парі DX:AX

mov dx,ax

; в єдине 32-розрядне в EBX

mov ax,bx

; і готуємося до ділення x^2+y^2+z^2+1

mov ebx,edx

; EBX = x^2*y^2

cwd ; розширюємо x^2+y^2+z^2+1 до подвійного слова,

; так як далі потрібно ділити на слово. Таким чином DX:AX = x^2+y^2+z^2+1

mov si,u

; завантажуємо в SI і (E)DI значення u і v які будуть

movzx edi,v

; використовуватися в подальших обчисленнях

mov cx,si

; отримуємо в СX

add cx,di

; u+v

div cx

; ділимо DX:AX на CX (x^2+y^2+z^2+1)/(u+v)

movzx ecx,ax

; і зберігаємо результат ділення в ECX, так як його

 

; доведеться додавати до 32-розрядного другого доданка

mov ax,si

; отримуємо в DX:AX квадрат u

mul ax

; DX:AX = AX*AX = u^2

xchg dh,dl

; робимо його єдиним 32-х розрядним

bswap edx

; числом в ЕDХ, так як його доведеться

mov dx,ax

; віднімати від 32-розрядного w

lea edx,[ edx+edi*2] ; отримуємо в EDX 2v + u^2

mov esi,w

; вирахуємо результат з w

sub esi,edx

; ESI = (w - (2v + u^2))

mov eax,ebx

; x^2*y^2

cdq

; розширюємо його до EDX:EAX і ділимо

div esi

; EAX = (x^2*y^2) / (w - 2v - u^2)

add eax,ecx ; зберігаємо результат

mov result,eax

ret

end start

3.5.1.3 Логічні команди

Виконання логічних команд, однойменних елементарним логічним функціям алгебри логіки NOT (заперечення або інверсія), AND (конюнкція), OR (диз'юнкція), XOR (виключна диз'юнкція або сума за модулем два) зводиться до виконання попарних (побітових) операцій над відповідними бітами операндів, у відповідність із таблицями істинності логічних функцій.

Біти

 

Функція

 

 

 

 

 

 

bi1

bi2

bi1 OR bi2

bi1 AND bi2

bi1 XOR bi2

 

 

 

 

 

0

0

0

0

0

 

 

 

 

 

0

1

1

0

1

 

 

 

 

 

1

0

1

0

1

 

 

 

 

 

1

1

1

1

0

 

 

 

 

 

bi1 й bi2 - i-ті біти 1-го й 2-го операнду Приклад

A=

01101011b

A=

01101011b

A=

01101011b

B=

11001001b

B=

11001001b

B=

11001001b

A OR B =

11101011b

A AND B = 01001001b A XOR B = 10100010b

 

 

 

 

 

 

Мнемоніка

 

NOT операнд

 

 

 

 

 

 

Алгоритм

 

Замінити усі нульові біти операнда на одиничні й навпаки

 

 

 

 

 

Операнд

 

r8/r16/r32/r64/m8/m16/m32/m64

 

 

 

 

 

 

 

 

RFLAGS

 

не впливає

 

 

 

 

 

 

 

 

Мнемоніка

 

AND операнд , маска

 

 

 

 

Призначення

Скидання бітів або груп бітів операнда згідно з маскою

 

 

 

 

 

Алгоритм

 

операнд ← операнд & маска

 

 

 

 

 

 

 

Операнди

 

r-im, m-im, r-r, r-m, m-r

 

 

 

 

 

 

 

 

 

RFLAGS

OF=CF=0, а SF, ZF, PF відповідно до результату операції. AF не

 

визначений

 

 

Мнемоніка

TEST операнд , маска

 

 

Призначення

Перевірка значень певних бітів або груп бітів операнду

 

 

Алгоритм

Побітова конюнкція операнда і маски без збереження

 

результату операції (тільки встановлення прапорців RFLAGS)

 

 

Операнди

r-im, m-im, r-r, r-m, m-r

 

 

RFLAGS

OF=CF=0, а SF, ZF, PF відповідно до результату операції. AF не

 

визначений

 

 

Мнемоніка

OR операнд , маска

 

 

Призначення

Встановлення бітів або груп бітів операнда згідно з маскою

 

 

Алгоритм

Побітова дизюнкція операнда та маски

 

 

Операнд

r-im, m-im, r-r, r-m, m-r

 

 

RFLAGS

OF=CF=0, а SF, ZF, PF відповідно до результату операції. AF не

 

визначений

Мнемоніка

XOR операнд , маска

 

 

Призначення

Перевірка, встановлення, інверсія бітів або груп бітів операнда

 

відповідно з маскою

 

 

Алгоритм

Побітова сума за модулем 2 операнда та маски

 

 

Операнд

r-im, m-im, r-r, r-m, m-r

 

 

RFLAGS

OF=CF=0, а SF, ZF, PF відповідно до результату операції. AF не

 

визначений

3.5.1.4 Команди зрушення

Команди зрушення поділяються на декілька підгруп

Рисунок 3.15

Ознакою за якою виконується розподіл на підгрупи виступає те, що використовується у якості біта, що заповнює «вакантне» місце. Для всіх команд зрушення прапор CF завжди встановлюється рівним біту, що останнім вийшов за межі операнда.

3.5.1.4.1Команди логічного зрушення

Вкомандах логічного зрушення бітом-заповнювачем виступає 0.

Мнемоніка SHL|SHR операнд , кількість

Призначення Логічне зрушення операнда вліво|вправо на вказану кількість бітів

Алгоритм

SHL

CF

0

 

SHR

0

CF

Операнд

r-im, m-im, r-CL, m-CL. В операнді, що визначає кількість

 

зрушень враховуються лише 5 молодших бітів (6 в 64-х бітному

 

режимі)

RFLAGS

Прапор CF завжди рівний біту, що останнім вийшов за межі

 

операнда. Зрушення на 1 змінює значення прапора OF: SHL

 

встановлює його в 1, якщо після зсуву старший біт змінився

 

(тобто старші два біти початкового числа не були однаковими), і

 

в 0, якщо старший біт залишився тим же. SHR встановлює OF в

 

значення старшого біта початкового числа. Для зсувів на

 

декілька бітів значення OF не визначено. Прапори SF, ZF, PF

 

встановлюються відповідно до результату, AF не визначений.

3.5.1.4.2 Команди арифметичного зрушення

Логічне зрушення вліво/вправо на 1 двійковий розряд без знакового числа еквівалентно збільшенню/зменшенню числа в 2 рази. Логічне зрушення вправо

SAL|SAR операнд , кількість

знакового числа може призвести до зміни його знакового розряду негативне число може перетворитися на позитивне. Для виконання швидкого множення/ділення на 2k в систему команд додано команди арифметичного зрушення.

Мнемоніка

Призначення Арифметичне зрушення операнда вліво|вправо на вказану кількість бітів

Алгоритм

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Операнд

r-im, m-im, r-CL, m-CL. В операнді, що визначає кількість

 

зрушень враховуються лише 5 молодших бітів (6 в 64-х бітному

 

режимі)

 

 

RFLAGS

Аналогічно команді SHL|SHR за винятком того, що при зсуві на

 

1 біт значення прапора OF завжди встановлюється у нульове

Команда арифметичного зрушення вліво SAL має той самий машинний код, що і команда логічного зрушення вліво SHL.

3.5.1.4.3 Команди циклічного зрушення

На відміну від команд логічного та арифметичного зрушення, команди циклічного зрушення не призводять до втрат бітів операнда вони тільки змінюють їх порядок.

Мнемоніка

ROL|ROR операнд , кількість

 

 

Призначення

Циклічне зрушення операнда вліво|вправо на вказану кількість

 

бітів

 

 

Алгоритм

ROL

 

CF

ROR

CF

Операнд

r-im, m-im, r-CL, m-CL. В операнді, що визначає кількість

 

зрушень враховуються лише 5 молодших бітів (6 в 64-х бітному

 

режимі)

RFLAGS

Прапор CF завжди рівний біту, що останнім вийшов за межі

 

операнда, прапор OF визначений тільки для зсувів на 1: він

встановлюється, якщо змінилося значення самого старшого біта,

іскидається, якщо старший біт не змінився. Прапори SF, ZF, AF

іPF не змінюються.

3.5.1.4.4Команди циклічного зрушення через прапор CF

Мнемоніка

RCL|RCR операнд , кількість

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Призначення

Циклічне зрушення операнда вліво|вправо через прапор CF на

 

вказану кількість бітів

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Алгоритм

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Операнд

r-im, m-im, r-CL, m-CL. В операнді, що визначає кількість

 

зрушень враховуються лише 5 молодших бітів (6 в 64-х бітному

 

режимі)

RFLAGS Аналогічно командам ROL|ROR

3.5.1.4.5 Команди подвійного зрушення

Команди подвійного зрушення у комбінації з іншими командами та команди RCL|RCR дозволяють виконувати операції над числами, що перевищують апаратно підтримувані процесором типи даних.

Мнемоніка

 

SHLD|SHRD приймач , джерело, кількість

 

 

 

Призначення

Логічне зрушення подвійного слова у приймачі вліво|вправо на

 

 

 

вказану кількість бітів

 

 

 

 

 

 

Алгоритм

 

1. Зрушити подвійне слово у приймачі логічним зрушенням

 

 

 

вліво|вправо на один біт, одночасно встановлюючи значення

 

 

 

молодшого|старшого

біта

приймача

значенням

 

 

 

старшого|молодшого біта джерела та зрушуючи вліво|вправо на

 

 

 

1 біт джерело.

 

 

 

 

 

 

 

2. Встановити

прапор

CF

в попереднє

значення

 

 

 

старшого|молодшого біта приймача.

 

 

 

 

 

3. Повторити попередні 2 дії вказану кількість разів.

 

 

 

 

4. Поновити початковий стан джерела.

 

 

 

 

 

 

Операнд

 

r-r-im, r-r-CL, r-m-im, r-m-CL

 

 

 

 

 

RFLAGS

 

Прапори SF, ZF, PF встановлюються усіма зсувами відповідно

 

 

 

до результату в приймачі, значення AF та OF не визначено

 

 

 

 

Основне призначення логічних команд полягає у виконанні операцій над

окремими бітами або групами бітів у межах операнду:

 

1.

Для встановлення в 1, або скидання в 0 заданих бітів:

 

 

а)

and eax,7FFFFFFFh

; скинути старший біт ЕАХ

 

 

б) or eax,80000001h

; встановити старший і молодший біти ЕАХ

2.

Для встановлення певного значення в групах заданих бітів:

 

 

а)

and eax,0FFFFFF0Fh

; скинути другу тетраду ЕАХ

 

 

 

or eax,20h

; і занести в неї 0010b

 

 

б)

and eax,0FFFFF47Fh

; скинути 7,8 і 9-й біти

 

and ebx, 000000FFh and ebx, 0000FFFFh xor dx, dx
xor bh, bh

 

or eax, 080h

; і занести в них 001b

3. Для перевірки значень окремих бітів або груп бітів

а)

test eax,80000000h

; старший біт ЕАХ = 1?

б)

test eax,3

; 2 молодші біти ЕАХ одиничні ?

в)

test eax,1

; в ЕАХ парне число ?

4.Для отримання нульового значення регістру краще використовувати команду XOR (рекомендовано Intel):

а) mov eax, 0 ; має довгий код, не впливає на RFLAGS б) sub eax, eax ; повільна й змінює RFLAGS

в) and eax, 0 ; швидка, має довгий код й змінює RFLAGS г) xor eax, eax ; швидка і коротка, змінює RFLAGS

5.Для розширення без знакового числа в будь-якому регістрі, наприклад, BL/BX/EBX можна скористатися логічними командами замість команд

CBW/CWD/CWDE/CDQ місце положення операнда яких фіксоване: ; без знакове розширення BL до BX

; без знакове розширення BL до EBX

; без знакове розширення BX до EBX

; без знакове розширення AX до DX:AX

6.Для локалізації окремих груп бітів для подальшої обробки використовуються логічні команди в комбінації із командами зрушення:

а) and eax,7

; тепер в ЕАХ/АХ/АL залишились 3 молодші біти

б) shr eax,16

; тепер в ЕАХ/АХ його старші 16 бітів

в) and eax,0F0h

; виділити значення старшої тетради ЕАХ

shr al, 4

; і перемістити в 4 молодші біти ЕАХ/АХ/АL

7.Для конкатенації 16-ти розрядних регістрів в єдиний 32-х розрядний регістр:

а) результат в EAX

mul bx

shl eax, 16

or ax, dx

ror eax,16

б) результат в EDX

mul bx shl edx, 16 or dx, ax

8. Для обміну значень старшої та молодшої половини 32-х розрядного (і не тільки) регістру можна використовувати команди ROR/ROL:

а)

ror ax, 8

; краще xchg al, ah

б)

ror eax,16

; xchg тут неможливо

9.Для виконання швидкого множення/ділення на 2k краще використовувати команди SHL/SHR/SAR:

а)

shl eax, 4

; eax*16 для числа як зі знаком, так і без знаку

б)

shr ebx, 1

; ebx/2 для числа без знаку

в)

sar ebx, 2

; ebx/4 для числа зі знаком

10. Для виконання операції над числами, що перевищують апаратно підтримувані процесором типи даних та/або припустимі операнди команд

а) sar edx, 1 ; edx:eax/2 rcr eax, 1

3.5.1.5 Команди передачі керування

Передача керування в програмі полягає у зміні значення регістру RIP, EIP або CS і EIP, що забезпечує вибірку на виконання не наступної команди, що іде за поточною виконуваною, а деякої іншої. До апаратних засобів, які забезпечують передачу керування в програмах належать регістри CS, EIP|RIP, SS, RSP і регістр прапорців RFLAGS. Програмна реалізація передачі керування в програмі може бути виконана за допомогою команд однієї із трьох груп:

Соседние файлы в папке гос