|
Приклад розбиття програми на зовнішні процедури
Нижче наведено код програми на Асемблері для обчислення суми елементів вектора. NAME PROG SSTACK SEGMENT DB 128 DUP (?) SSTACK ENDS DATA SEGMENT MAS DW 1,3,1,2,1 N DW 5 Y DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:SSTACK START PROC FAR PUSH SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX CALL MAIN CALL OUTPUT RET START ENDP MAIN PROC SUB AX, AX MOV CX, 5 LEA SI, MAS MET: ADD AX, [SI] ADD SI, 2 LOOP MET MOV Y,AX RET MAIN ENDP OUTPUT PROC MOV AX, Y ADD AL, 48 MOV DL, AL MOV AH, 06h INT 21h RET OUTPUT ENDP CODE ENDS END START Розіб’ємо цю програму на три процедури: головну процедуру START, процедуру MAIN - для визначення суми, процедуру OUTPUT - для виведення результату обчислень. В процедурі START будуть визначатися всі змінні і здійснюватись виклики решти процедур. Процедура MAIN отримує від процедури START початкові дані для обчислень і повертає їй результат обчислень. Процедура OUTPUT отримує від процедури START значення результату для виведення його на екран дисплея. З урахуванням вказаних вище умов головна процедура буде мати такий вигляд: NAME PROG1 EXTRN MAIN:NEAR, OUTPUT:NEAR PUBLIC MAS, N, Y SSTACK SEGMENT DB 128 DUP (?) SSTACK ENDS DATA SEGMENT MAS DW 1,3,1,2,1 N DW 5 Y DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:SSTACK START PROC FAR PUSH SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX CALL MAIN CALL OUTPUT RET START ENDP CODE ENDS END START Зовнішня процедура MAIN матиме вигляд: NAME PROG2 EXTRN MAS:WORD, N:WORD, Y:WORD PUBLIC MAIN SSTACK SEGMENT DB 128 DUP (?) SSTACK ENDS CODE SEGMENT PUBLIC ASSUME CS:CODE, SS:SSTACK MAIN PROC NEAR SUB AX, AX MOV CX, 5 LEA SI, MAS MET: ADD AX, [SI] ADD SI, 2 LOOP MET MOV Y,AX RET MAIN ENDP CODE ENDS END Зовнішня процедура OUTPUT буде такою: NAME PROG3 EXTRN Y:WORD PUBLIC OUTPUT SSTACK SEGMENT DB 128 DUP (?) SSTACK ENDS CODE SEGMENT PUBLIC ASSUME CS:CODE, SS:SSTACK OUTPUT PROC MOV AX, Y ADD AL, 48 MOV DL, AL MOV AH, 06h INT 21h RET OUTPUT ENDP CODE ENDS END
Порядок виконання роботи
1. Вивчити теоретичну частину лабораторної роботи. 2. Для заданого приклада розбити вхідну програму на зовнішні процедури і виконати трансляцію окремо для кожної процедури. 3. За допомогою компонувача TLINK створити єдиний завантажувальний модуль. Дослідити різні рівні роботи компонувача. 4. Сформувати розширену карту завантаження і здійснити її аналіз з урахуванням типів об’єднання і типів вирівнювання логічних сегментів. Лабораторна робота № 8 Математичний співпроцесор Тема: Знайомство з архітектурою математичного співпроцесора. Вивчення форматів даних та системи команд для управління математичним співпроцесором. Програмування мовою Асемблер із використанням математичного співпроцесора.
Теоретичні відомості
2.8.1 Архітектура математичного співпроцесора
Математичний співпроцесор (МС) призначений для виконання операцій над числами з фіксованою та плаваючою комою. Завдяки математичному співпроцесору можна досягти високої точності і швидкодії при різноманітних математичних обчисленнях, при роботі з машинною графікою, при виконанні статистичних та інженерних розрахунків, при використанні засобів мультимедіа і т.д. Математичний співпроцесор може працювати лише разом із головним процесором, оскільки в ньому відсутній механізм вибірки команд. Перший математичний співпроцесор 8087 працював у перших моделях ІВМ РС. Згодом були розроблені математичні співпроцесори 80287 та 80387. У процесорах Intel 80486 та Pentium наявний вбудований співпроцесор, що є одним з модулів головного процесора, але з програмної точки зору вони залишились повністю сумісними з 80387. В загальному випадку МС х87 можна розглядати як архітектурне розширення центрального процесора, тобто до загальних регістрів процесора додаються вісім 80-розрядних арифметичних регістри стека і блок регістрів стану та управління. Блок регістрів стану та управління складається з таких 16-розрядних регістрів: - слово стану SWR (Status Word Register); - слово управління CWR (Control Word Register); - ознаки; - покажчик команд; - покажчик даних. Група арифметичних регістрів частіше використовується в режимі стеку, тобто операнди зчитуються у порядку, оберненому до порядку запису. Але підтримуються всі форми команд, що виконують запис і зчитування для конкретних регістрів. З регістрами стеку пов’язаний 3-бітовий покажчик стеку ST, що визначає регістр, який в даний момент є вершиною стеку (рис.10). Нумерація регістрів завжди починається від вершини стеку.
Рисунок 10 – Схема зв’язку покажчика стеку з регістрами співпроцесора
При завантаженні даних в арифметичний регістр вміст покажчика стеку попередньо зменшується на одиницю (ST ← ST-1) і вказує номер регістра, в який здійснюється завантаження. При добуванні даних з регістру вміст покажчика стеку автоматично збільшується на одиницю (ST ← ST+1). З кожним з арифметичних регістрів пов’язаний регістр тегів, в якому є 2-бітове поле, значення якого залежить від вмісту регістра ST(i) (рис.11). Математичний співпроцесор має у своєму складі: - блок обробки мантиси; - блок обробки порядку; - ПЗП констант, який зберігає 7 відомих констант: +0.0; +1.0; π; ln2; lg2; log210; log2e.
Рисунок 11 – Значення полів тегів
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|