Лабораторна робота №2.
Створення простих програм на асемблері з допомогою програми debug.
Мета роботи: вивчення можливостей безпосереднього програмування та виконання команд процесора І8086 з використанням програми debug.
Короткі теоретичні відомості
Програма debug входить як стандартна у склад операційних систем фірми Microsoft, в інших ОС існують її аналоги. Вона призначена для створення та відлагодження простих програм, безпосереднього виконання команд процесора та зміни значень у його регістрах без необхідності додаткової трансляції.
Також програма дозволяє переглядати та редагувати файли та сектори на диску у текстовому та 16-му представленні, коректувати роботу невеликих програм.
Основні команди 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 після числа не пишуть.
Завершення роботи програми
Найпростіший спосіб коректно завершити роботу програми — викликати переривання DOS з номером 20h. Це здійснюється за допомогою команди
INT 20
У програмі debug після виконання цієї команди має появитись повідомлення:
Program terminated normally
При виконанні програми в середовищі DOS, програма просто завершить свою роботу без видачі яких-небудь повідомлень.
Приклад програми
Нехай нам потрібно створити програму, що обчислює дискримінант квадратного рівняння ax2+bx+c=0, де відповідні коефіцієнти у двійковому вигляді задаються у реґістрах ax, bx, cx, а дискримінант передається через реґістр dx. Запишемо формули, за якими проводяться обчислення:
Таким чином нам потрібно виконати множення (квадрат числа – це також множення числа саме не себе) і віднімання. Найбільш відповідні команди асемблера—це imul та sub.
Найпростіша форма команди множення, з якою може працювати debug, домножує слово в ax на операнд:
imul bx ; домножує bx на ax і результат заносить у ax.
Алгоритм обчислення дискримінанта може бути таким:
зберегти ax
bxax
bx * axax
axdx
відновити ax
ax*4ax
ax * cxax
dx-axdx
Якщо використати команду обміну xchg та замінити множення на 4 зсувом на два біти вліво, то можна дещо оптимізувати даний алгоритм:
ax зсунути вліво на 2 біти
ax * cxax
обміняти ax і bx
ax * axax
axdx ;тепер у dx знаходиться b2, а у bx—4ac
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 записати програму.