Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
5
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

5. Приклади використання бітових команд

Приклад 1. Обчислити значення факторіала р = n! = 1*2*3*...*n. Відомо, що 0! = 1. Негативним значення n бути не може (за правилами математики). Вихідний код asm-модуля може мати такий вигляд:

format pe

jmp start

n dw 6

p dw?

start:

mov cx,[n] ; кількість повторень

mov si,1

mov ax, si

jcxz @@Exit ; if cx=0 then Exit

@@begin:;========== початок циклу

mul si ; <dx: ax> = <ax>*si

inc si

;==== вихід з циклу

loop @@begin

@@Exit:

mov [p], ax

ret

Мітки з префіксом @@ вважаються локальними. Якщо компілятор зустріне мітку з таким же ім'ям, він просто при компіляції привласнить їй інше ім'я (звичайно ці мітки одержують наприкінці імені номер, що збільшується на одиницю — усі дуже просто!).

Приклад 2. Обчислити значення суми чисел натурального ряду: s = 1+2+3+...+n. Обчислення закінчити, як тільки значення суми стане рівним деякому числу до або не будуть перебрані всі n чисел. Вихідний код модуля може мати такий вигляд:

format pe

jmp start

n dw 10

k dw 7

s dw?

start:

mov cx,[n] ; кількість повторень

xor ax, ax

xor si, si

jcxz @@Exit ; if cx=0 then Exit

@@begin:;=======ПОЧАТОК циклу ==============

inc si

add ax, si

cmp ax,[k]

;==Вихід з циклу, якщо <ax>=k або <cx>=0

loopNE @@begin

@@Exit:

mov [s], ax

ret

6. Завдання на лабораторну роботу.

При рішенні прикладів і завдань необхідно:

а) скласти алгоритм рішення задачі

б) напроти відповідних елементів алгоритму записати команди асемблера

в) скласти програму (format pe) і відкомпілювати, при необхідності виправити синтаксичні помилки.

г) перевірити виконання програми в дебагері OllyDbg, при наявності помилок виправити текст програми і повторити дії по п. г)

д) змінити заголовок програми для компіляції модуля (format coff), додати відповідні зміни для одержання працездатного модуля для стикування з програмою на C++ (див. лабораторну роботу №2).

е) створити консольний проект на С++, додати отриманий модуль, скомпілювати додаток (див. лабораторну роботу №2).

ж) перевірити правильність роботи програми на різних наборах вхідних даних.

з) оформити звіт і зробити осмислені висновки по суті розв'язуваної задачі.

Завдання 1. Порахувати вираження відповідно до варіанта.

1) 2)

3) 4)

5) 6)

7) 8)

9) 10)

11) 12)

13) 14)

15) 16)

17) 18)

19) 20)

21) 22)

23) 24)

Завдання 2. Знайти значення по формулі Програма повинна забезпечувати аналіз переповнення або неприпустимих операцій (наприклад, ділення на 0). При виникненні переповнення подальші дії не виконуються, у результат записується число FFFFFFFF. Результат записати в осередок розміром подвійне слово (dd). Усі числа зі знаком. При діленні залишок відкидається.

N

Формула

X

Y

Z

W

U

J

K

1

((X-Y)*Z-W/U+J)/K

dw

dw

dw

db

dw

db

dw

2

((X*Z-W*U/(J+K))/Y

db

db

dw

db

db

dw

dw

3

(X-Y*Z-W/(U+J))+K

db

dw

db

db

dw

db

dw

4

(X*Y-Z+(W-U)*J)/K

db

dw

dw

db

dw

db

db

5

((X-Y)/Z-(W*U+J))-K

dw

dw

dw

db

db

db

dw

6

((X+Y)/(Z-W/U-J))*K

db

dw

dw

db

dw

db

dw

7

(X*Y+Z*W-U/J)/K

db

dw

dw

db

db

db

db

8

(X+Y)*(Z-W/U+J)-K

db

db

dw

db

dw

db

dw

9

X/Y-Z/W+U*J-K

dw

dw

db

db

dw

db

db

10

(X-Y*Z-W/U+J)/K

db

db

dw

db

dw

db

dw

11

(X/Y)*Z-W/(U+J)/K

db

dw

db

db

db

db

dw

12

((X+Y)/Z-W*U+J)/K

db

dw

dw

db

dw

db

dw

13

((X-Y-(Z-W)/U+J)*K

dw

dw

dw

db

db

db

db

14

X/Y-Z/W+U*J-K

db

dw

dw

db

dw

db

dw

15

X*Y+(Z-W)/(U+J)*K

db

db

dw

db

dw

db

db

16

(X-Y)*(Z-W)/U+J*K

dw

dw

dw

db

dw

db

dw

17

X/Y-Z/W+U*J/K

db

dw

dw

dw

dw

db

dw

18

(X*Y/Z-W*U/J)*K

dw

dw

dw

db

dw

db

dw

19

X/Y*Z-W/U*J+K

db

dw

dw

db

dw

dw

dw

20

((X-Y)*Z-W*U-J)/K

db

dw

dw

db

dw

db

dw

21

((X+Y)*Z/W/U+J)*K

dw

dw

dw

db

dw

db

dw

22

((X-Y)*(Z-W)/U-J)/K

db

dw

dw

db

dw

db

dw

23

((X*Y/Z-(W-U)/J)*K

dw

dw

dw

db

dw

db

dw

24

(X-Y)*(Z-W/U+J)+K

dw

dw

db

dw

dw

db

dw

25

(X-Y+Z)*W-(U+J)*K

db

dw

dw

db

dw

db

dw

26

(X*Y/Z-W/U+J)*K

dw

dw

dw

db

dw

dw

db

27

((X+Y)/Z-W/(U+J))*K

db

dw

dw

db

dw

db

dw

29

(((X*Y)-Z/W)/U+J)*K

db

db

dw

db

dw

db

dw

30

((X-Y)*Z-W/U+J)*K

db

dw

dw

db

dw

db

db

Завдання 3. Для будь-якої задачі з лабораторної роботи №4 (арифметичні команди) підрахувати таблицю значень функції, якщо один з параметрів змінюється від –x/2 до x/2.

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