- •Лабораторна робота №4-1 Організація взаємозв'язку програм мовою Асемблера з програмами мовою Паскаль
- •Перше заняття
- •Друге заняття
- •Лабораторна робота №4-2
- •1) Оголошення зовнішніх асемблерних процедур
- •2) Опис глобальних змінних
- •1) Директива завдання набору допустимих команд процесора
- •2) Директива public
- •3) Модель пам’яті
- •6) Локальні параметри
- •7) Повернення значень з асемблерної процедури
- •8) Організація повернення з підпрограми
- •9) Поле операндів директиви end
- •1) Створення проекту
- •2) Створення *.Asm файлу
- •3) Налагодження програми
- •Перше заняття
- •Друге заняття
- •Варіанти завдань
- •Додаткові експерименти
Перше заняття
Скопіювати програми L4-2000.pas та Bigshow.asm в окремий робочий каталог. Ознайомитись з їх призначенням і вмістом.
Протранслювати за допомогою tasm (або masm) програму мовою Асемблера Bigshow.asm. У програмі мовою Паскаль L4-2000.pas відкоригувати (при необхідності) шлях до файлу Bigshow.obj у директиві L. Відкомпілювати Паскаль-програму (разом з підключеним файлом Bigshow.obj) та перевірити її працездатність.
Вивчити правила взаємозв’язку окремо скомпільованих програм мовою Асемблера та мовою Паскаль (див. Теоретичні відомості);
Розробити алгоритм реалізації операції з надвеликими цілими додатними числами згідно варіанта завдання (табл. ).
Друге заняття
Розробити програму мовою Паскаль і програму мовою Асемблера згідно варіанта завдання та наступних вимог:
Програма мовою Паскаль повинна:
відповідати вимогам зв’язку з асемблерними процедурами;
містити визначення байтових масивів та їх початкове заповнення;
містити виклики процедури BigShow для відображення початкових даних,
містити виклик розробленої асемблерної процедури з відповідними параметрами;
містити виклики процедури BigShow для відображення результатів;
перед викликом процедури BigShow у Паскаль програмі забезпечити виведення на екран текстових повідомлень (коментарів).
Програма мовою Асемблера повинна:
розміщуватися в початковому асемблерному модулі;
містити процедуру відображення BigShow.asm і власну асемблерну процедуру, що виконує ту чи іншу елементарну операцію (згідно варіанта) з надвеликими цілими додатними числами, які розміщуються у байтових масивах. Тобто, один байтовий масив Паскаль програми використовується для вмісту ОДНОГО надвеликого цілого беззнакового числа.
щоб уможливити виклик власної асемблерної процедури з програми мовою Паскаль, вона повинна відповідати спеціальним вимогам (див. Теоретичні відомості);
на початку модуля мовою Асемблера розмістіти директиву Title із зазначенням групи та прізвища студента;
Використати процедуру BigShow.asm для відображення і перевірки коректності роботи розробленої програми на різних тестових наборах значень байтових масивів.
Додаткові експерименти:
визначити, чи може програмний модуль мовою Асемблера, який об’єднується з Паскаль програмою, мати додаткові логічні сегменти з довільними іменами;
визначити порядок передачі до функції значення типу String.
4-1.5. Варіанти завдань
Розробити процедуру Big2sAdd(var M1,M2;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних.. Вважати, що М1 і М2 знаходяться в різних сегментах.
Розробити процедуру Big2Add(var M1,M2,Carry;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Змінній байтового типу Carry присвоюється значення 1 в разі переповненя і 0 при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 знаходяться в одному сегменті.
Розробити функцію FBig2Add(var M1,M2;len:word):Boolean, де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Функції FBig2Add присвоюється значення False в разі переповненя і True при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і Carry знаходяться в одному сегменті
Розробити процедуру Big3sAdd(var M1,M2,М3;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2+М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і М3 знаходяться в різних сегментах.
Розробити процедуру Big3Add(var M1,M2,М3,Carry;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2+М3. Змінній байтового типу Carry присвоюється значення 1 в разі переповненя і 0 при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2,М3 і Carry знаходяться в одному сегменті.
Розробити функцію FBig3Add(var M1,M2,М3;len:word):Boolean, де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2+М3. Функції FBig3Add присвоюється значення False в разі переповненя і True при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2,М3 знаходяться в одному сегменті.
Розробити процедуру Big2sSub(var M1,M2;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. . Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних.. Вважати, що М1 і М2 знаходяться в різних сегментах.
Розробити процедуру Big2Sub(var M1,M2,Carry;len:word), де M1,M2 надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. Змінній байтового типу Carry присвоюється значення 1 при наявності позики і 0 при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1, М2 i Carry знаходяться в одному сегменті.
Розробити функцію FBig2Sub(var M1,M2;len:word):Boolean, де M1,M2 надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. Функції Fbig2Sub присвоюється значення False в разі наявності позики і True при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1, М2 знаходяться в одному сегменті.
Розробити процедуру Big3sSub(var M1,M2,М3;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2-М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і М3 знаходяться в різних сегментах.
Розробити процедуру Big3Sub(var M1,M2,М3,Carry;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2-М3. Змінній байтового типу Carry присвоюється значення 1 при наявності позики і 0 при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2,М3 і Carry знаходяться в одному сегменті.
Розробити процедуру FBig3Sub(var M1,M2,М3;len:word):Boolean, де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2-М3 Функції Fbig3Sub присвоюється значення False в разі наявності позики і True при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2,М3 знаходяться в одному сегменті.
Розробити функцію Biggr(var M1,M2;len:word):Boolean, де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 > М2 то значення Biggr - True, інакше -False . Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити функцію Biggreq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 ≥ М2 то значення Biggreq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити функцію Bigeq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 = М2 то значення Bigeq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити функцію Bigne (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 М2 то значення Bigne - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити функцію Bigles (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 < М2 то значення Bigles - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити функцію Bigleseq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 М2 то значення Bigleseq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.
Розробити процедуру BigShlCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - лінійний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів втрачаються, а в count молодших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.
Розробити процедуру BigShrCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - лінійний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів втрачаються, а в count старших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.
Розробити процедуру BigRolCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - циклічний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів поступають на місце молодших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.
Розробити процедуру BigRorCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - циклічний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів поступають на місце старших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.
Розробити процедуру BigZeroShl(var M1,cnt;len: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), cnt - кількість розрядів зсуву - змінна типу word. Операція - лінійний зсув вліво (в сторону старших розрядів) до тих пір поки в len*8-1 розряді не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 розряд len*8-1 дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.
Розробити процедуру BigZeroShr(var M1,cnt;len: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), cnt - кількість розрядів зсуву. Операція - лінійний зсув вправо (в сторону молодших розрядів) до тих пір поки в молодшому розряді числа не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 молодший розряд дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.
Розробити процедуру BigShl(var M1,Carry;len:word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), Carry - змінна типу byte. Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому в змінну Carry заноситься значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.
Розробити процедуру BigShr(var M1,Carry;len:word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), Carry - змінна типу byte. Операція - лінійний зсув вправо (в сторону молодших розрядів) на один розряд. При цьому в змінну Carry заноситься значення молодшого розряду числа M1, а в старший розряд числа M1 заноситься 0.
Розробити функцію FcBigShl(var M1;len:word):Byte, де M1 - надвелике ціле додатнє число (байтовий масив довжиною len). Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FcBigShl приймає значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.
Розробити функцію FBigShl(var M1;len:word):Boolean, де M1 - надвелике ціле додатнє число (байтовий масив довжиною len). Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FBigShl приймає значення False, якщо len*8-1 розряд числа M1 до зсуву дорівнює 1 і True в протилежному випадку. В молодший розряд числа M1 при зсуві заноситься 0.
Розробити процедури BigSetBit(var M1;len,number: word) та BigClrBit(var M1;len,number: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len)., number - номер двійкового розряду числа М1, починаючи з 0. Операція - записать одиничку в розряд number для процедури BigSetBit і 0 для процедури BigClrBit.
Розробити процедуру Extract(var M1,M2;len,ibeg,iend:word), надвеликі цілі додатні числа (байтові масиви довжиною len), ibeg,iend - номера розрядів, такі, що len*8-1 iend ibeg. Операція - виділить із числа M1 розряди з ibeg по iend включно та одержане таким чином число присвоїть M2. В старші розряди числа M2 занести 0.
4-1.6. Контрольні запитання
Чому поле операндів директиви END в модулі мовою Асемблера повинно бути порожнім?
Які імена логічних сегментів повинна мати програма мовою Асемблера для забезпечення зв’язку з програмами мовами високого рівня?
За якою адресою оперативної пам’яті (більшою чи меншою) буде розташований перший фактичний параметр для процедури, яка визивається Паскаль програмою?
Чи можливий в програмі мовою Асемблера виклик процедур мовою Паскаль?
До яких змінних програми мовою Паскаль можливий доступ в програмі мовою Асемблера і як він забезпечується?
Яка програма (та що викликає чи та яку викликають) відповідає в Паскалі за відновлення вмісту покажчика стеку – вмісту регістра SP?
