Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lr_2n.doc
Скачиваний:
2
Добавлен:
27.08.2019
Размер:
81.92 Кб
Скачать

Лабораторна робота №2.

Створення простих програм на асемблері з допомогою програми debug.

  1. Мета роботи: вивчення можливостей безпосереднього програмування та виконання команд процесора І8086 з використанням програми debug.

  2. Короткі теоретичні відомості

Програма debug входить як стандартна у склад операційних систем фірми Microsoft, в інших ОС існують її аналоги. Вона призначена для створення та відлагодження простих програм, безпосереднього виконання команд процесора та зміни значень у його регістрах без необхідності додаткової трансляції.

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

    1. Основні команди debug:

-----------------------------------------------

Позначення:

address — це XXXX або XXXX:XXXX або segreg:XXXX

range — це address, address або addr L byte_count

value — це XXXX

port — це XX

Команди:

? вивід списку команд

Q вихід з програми

H value1 value2 додавання і віднімання двох 16-х чисел (максимальний розмір операнда – слово)

A [address] ввід асемблерних команд, починаючи з адреси address. Enter — для завершення.

D [range] вивід вмісту пам’яті за вказаним діапазоном адрес

R [register] перегляд вмісту регістра (-ів) та його зміна

E address [list] перегляд значення у пам’яті за адресою address та зміна його на послідовність значень list

T [=address] [value] виконання value команд програми починаючи з адреси address (при цьому цикли, підпрограми виконуються покроково)

G [=address] [addresses] виконання програми до адреси address або починаючи з адреси, заданої в CS:IP, з зупинкою в addresses

L [address] зчитує файл, ім’я якого задано командою N за адресою, заданою в address або в CS:100

W [address] записує файл, ім’я якого задано командою N за адресою, заданою в address або в CS:100. Кількість байт, що записується, задається в BX:CX

N [pathname] [arglist] задає ім’я файлу для L та W

P [=address] [number] виконання number команд програми починаючи з адреси address (при цьому цикли, підпрограми виконуються за один крок)

U [range] відображає вказаний у range діапазон як команди асемблера

* Команди і їх параметри можуть набиратись як великими так і маленькими буквами.

** Всі числа у debug — шістнадцяткові. Букву h після числа не пишуть.

    1. Завершення роботи програми

Найпростіший спосіб коректно завершити роботу програми — викликати переривання DOS з номером 20h. Це здійснюється за допомогою команди

INT 20

У програмі debug після виконання цієї команди має появитись повідомлення:

Program terminated normally

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

    1. Приклад програми

Нехай нам потрібно створити програму, що обчислює дискримінант квадратного рівняння ax2+bx+c=0, де відповідні коефіцієнти у двійковому вигляді задаються у реґістрах ax, bx, cx, а дискримінант передається через реґістр dx. Запишемо формули, за якими проводяться обчислення:

Таким чином нам потрібно виконати множення (квадрат числа – це також множення числа саме не себе) і віднімання. Найбільш відповідні команди асемблера—це imul та sub.

Найпростіша форма команди множення, з якою може працювати debug, домножує слово в ax на операнд:

imul bx ; домножує bx на ax і результат заносить у ax.

Алгоритм обчислення дискримінанта може бути таким:

  1. зберегти ax

  2. bxax

  3. bx * axax

  4. axdx

  5. відновити ax

  6. ax*4ax

  7. ax * cxax

  8. dx-axdx

Якщо використати команду обміну xchg та замінити множення на 4 зсувом на два біти вліво, то можна дещо оптимізувати даний алгоритм:

  1. ax зсунути вліво на 2 біти

  2. ax * cxax

  3. обміняти ax і bx

  4. ax * axax

  5. axdx ;тепер у dx знаходиться b2, а у bx—4ac

  6. dx-bx->dx

За даним алгоритмом складаємо програму:

shl ax,1 ;debug сприймає лише стандартні команди 8086

shl ax,1

imul cx

xchg ax, bx

imul ax

mov dx, ax

sub dx, bx ;тепер дискримінант у dx

int 20 ;нормальне завершення програми

Запустимо debug, перейдемо в режим асемблювання командою

a 100 (програма стандартно починається за адресою 100),

далі наберемо текст програми, вкінці натиснувши “Enter”. Введемо командами r ax, r bx, r cx коефіцієнти рівняння.

Перевіривши правильність вводу програми командою u 100, отримаємо:

-u100

1C8E:0100 D1E0 SHL AX,1

1C8E:0102 D1E0 SHL AX,1

1C8E:0104 F7E9 IMUL CX

1C8E:0106 87C3 XCHG AX,BX

1C8E:0108 F7E8 IMUL AX

1C8E:010A 89C2 MOV DX,AX

1C8E:010C 29DA SUB DX,BX

1C8E:010E CD20 INT 20

1C8E:0110 45 ………………

і виконаємо програму командою g 10e (перевірити, чи ip=100 і якщо ні, то встановити).

В реґістрі dx перевіримо результат.

Щоб записати програму у файл потрібно в cx записати довжину програми (в даному випадку 16), командою n задати ім’я файлу:

n sqroot.com

і командою w записати програму.

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