Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНА РОБОТА 4.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
297 Кб
Скачать
☆

Перше заняття

  1. Скопіювати програми L4-2000.pas та Bigshow.asm в окремий робочий каталог. Ознайомитись з їх призначенням і вмістом.

  2. Протранслювати за допомогою tasm (або masm) програму мовою Асемблера Bigshow.asm. У програмі мовою Паскаль L4-2000.pas відкоригувати (при необхідності) шлях до файлу Bigshow.obj у директиві L. Відкомпілювати Паскаль-програму (разом з підключеним файлом Bigshow.obj) та перевірити її працездатність.

  3. Вивчити правила взаємозв’язку окремо скомпільованих програм мовою Асемблера та мовою Паскаль (див. Теоретичні відомості);

  4. Розробити алгоритм реалізації операції з надвеликими цілими додатними числами згідно варіанта завдання (табл. ).

Друге заняття

Розробити програму мовою Паскаль і програму мовою Асемблера згідно варіанта завдання та наступних вимог:

  1. Програма мовою Паскаль повинна:

  • відповідати вимогам зв’язку з асемблерними процедурами;

  • містити визначення байтових масивів та їх початкове заповнення;

  • містити виклики процедури BigShow для відображення початкових даних,

  • містити виклик розробленої асемблерної процедури з відповідними параметрами;

  • містити виклики процедури BigShow для відображення результатів;

  • перед викликом процедури BigShow у Паскаль програмі забезпечити виведення на екран текстових повідомлень (коментарів).

  1. Програма мовою Асемблера повинна:

  • розміщуватися в початковому асемблерному модулі;

  • містити процедуру відображення BigShow.asm і власну асемблерну процедуру, що виконує ту чи іншу елементарну операцію (згідно варіанта) з надвеликими цілими додатними числами, які розміщуються у байтових масивах. Тобто, один байтовий масив Паскаль програми використовується для вмісту ОДНОГО надвеликого цілого беззнакового числа.

  • щоб уможливити виклик власної асемблерної процедури з програми мовою Паскаль, вона повинна відповідати спеціальним вимогам (див. Теоретичні відомості);

  • на початку модуля мовою Асемблера розмістіти директиву Title із зазначенням групи та прізвища студента;

  1. Використати процедуру BigShow.asm для відображення і перевірки коректності роботи розробленої програми на різних тестових наборах значень байтових масивів.

  2. Додаткові експерименти:

  • визначити, чи може програмний модуль мовою Асемблера, який об’єднується з Паскаль програмою, мати додаткові логічні сегменти з довільними іменами;

  • визначити порядок передачі до функції значення типу String.

4-1.5. Варіанти завдань

  1. Розробити процедуру Big2sAdd(var M1,M2;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних.. Вважати, що М1 і М2 знаходяться в різних сегментах.

  1. Розробити процедуру Big2Add(var M1,M2,Carry;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Змінній байтового типу Carry присвоюється значення 1 в разі переповненя і 0 при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 знаходяться в одному сегменті.

  1. Розробити функцію FBig2Add(var M1,M2;len:word):Boolean, де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1+М2. Функції FBig2Add присвоюється значення False в разі переповненя і True при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і Carry знаходяться в одному сегменті

  1. Розробити процедуру Big3sAdd(var M1,M2,М3;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2+М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і М3 знаходяться в різних сегментах.

  1. Розробити процедуру 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 знаходяться в одному сегменті.

  1. Розробити функцію 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 знаходяться в одному сегменті.

  1. Розробити процедуру Big2sSub(var M1,M2;len:word), де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. . Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використать команди для 8 - розрядних даних.. Вважати, що М1 і М2 знаходяться в різних сегментах.

  1. Розробити процедуру Big2Sub(var M1,M2,Carry;len:word), де M1,M2 надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. Змінній байтового типу Carry присвоюється значення 1 при наявності позики і 0 при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1, М2 i Carry знаходяться в одному сегменті.

  1. Розробити функцію FBig2Sub(var M1,M2;len:word):Boolean, де M1,M2 надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М1-М2. Функції Fbig2Sub присвоюється значення False в разі наявності позики і True при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1, М2 знаходяться в одному сегменті.

  1. Розробити процедуру Big3sSub(var M1,M2,М3;len:word), де M1,M2,М3 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - М1=М2-М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використать команди для 8 - розрядних даних. Вважати, що М1,М2 і М3 знаходяться в різних сегментах.

  1. Розробити процедуру 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 знаходяться в одному сегменті.

  1. Розробити процедуру 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 знаходяться в одному сегменті.

  1. Розробити функцію Biggr(var M1,M2;len:word):Boolean, де M1,M2 - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 > М2 то значення Biggr - True, інакше -False . Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити функцію Biggreq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 ≥ М2 то значення Biggreq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити функцію Bigeq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 = М2 то значення Bigeq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити функцію Bigne (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1  М2 то значення Bigne - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити функцію Bigles (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 < М2 то значення Bigles - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити функцію Bigleseq (var M1,M2;len:word):Boolean, де M1,M2 - - надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1  М2 то значення Bigleseq - True, інакше - False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використать команди для 8 - розрядних даних. Вважати, що М1 і М2 знаходяться в одному сегменті.

  1. Розробити процедуру BigShlCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - лінійний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів втрачаються, а в count молодших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.

  1. Розробити процедуру BigShrCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - лінійний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів втрачаються, а в count старших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.

  1. Розробити процедуру BigRolCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - циклічний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів поступають на місце молодших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.

  1. Розробити процедуру BigRorCount(var M1;len,count: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), count - кількість розрядів зсуву. Операція - циклічний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів поступають на місце старших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використать команди для 8 - розрядних даних.

  1. Розробити процедуру BigZeroShl(var M1,cnt;len: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), cnt - кількість розрядів зсуву - змінна типу word. Операція - лінійний зсув вліво (в сторону старших розрядів) до тих пір поки в len*8-1 розряді не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 розряд len*8-1 дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.

  1. Розробити процедуру BigZeroShr(var M1,cnt;len: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), cnt - кількість розрядів зсуву. Операція - лінійний зсув вправо (в сторону молодших розрядів) до тих пір поки в молодшому розряді числа не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 молодший розряд дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.

  1. Розробити процедуру BigShl(var M1,Carry;len:word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), Carry - змінна типу byte. Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому в змінну Carry заноситься значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.

  2. Розробити процедуру BigShr(var M1,Carry;len:word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len), Carry - змінна типу byte. Операція - лінійний зсув вправо (в сторону молодших розрядів) на один розряд. При цьому в змінну Carry заноситься значення молодшого розряду числа M1, а в старший розряд числа M1 заноситься 0.

  1. Розробити функцію FcBigShl(var M1;len:word):Byte, де M1 - надвелике ціле додатнє число (байтовий масив довжиною len). Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FcBigShl приймає значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.

  1. Розробити функцію FBigShl(var M1;len:word):Boolean, де M1 - надвелике ціле додатнє число (байтовий масив довжиною len). Операція - лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FBigShl приймає значення False, якщо len*8-1 розряд числа M1 до зсуву дорівнює 1 і True в протилежному випадку. В молодший розряд числа M1 при зсуві заноситься 0.

  1. Розробити процедури BigSetBit(var M1;len,number: word) та BigClrBit(var M1;len,number: word), де M1 - надвелике ціле додатнє число (байтовий масив довжиною len)., number - номер двійкового розряду числа М1, починаючи з 0. Операція - записать одиничку в розряд number для процедури BigSetBit і 0 для процедури BigClrBit.

  1. Розробити процедуру 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. Контрольні запитання

  1. Чому поле операндів директиви END в модулі мовою Асемблера повинно бути порожнім?

  2. Які імена логічних сегментів повинна мати програма мовою Асемблера для забезпечення зв’язку з програмами мовами високого рівня?

  3. За якою адресою оперативної пам’яті (більшою чи меншою) буде розташований перший фактичний параметр для процедури, яка визивається Паскаль програмою?

  4. Чи можливий в програмі мовою Асемблера виклик процедур мовою Паскаль?

  5. До яких змінних програми мовою Паскаль можливий доступ в програмі мовою Асемблера і як він забезпечується?

  6. Яка програма (та що викликає чи та яку викликають) відповідає в Паскалі за відновлення вмісту покажчика стеку – вмісту регістра SP?