
- •Лабораторна робота №4-1 Організація взаємозв'язку програм мовою Асемблера з програмами мовою Паскаль
- •Перше заняття
- •Друге заняття
- •Лабораторна робота №4-2
- •1) Оголошення зовнішніх асемблерних процедур
- •2) Опис глобальних змінних
- •1) Директива завдання набору допустимих команд процесора
- •2) Директива public
- •3) Модель пам’яті
- •6) Локальні параметри
- •7) Повернення значень з асемблерної процедури
- •8) Організація повернення з підпрограми
- •9) Поле операндів директиви end
- •1) Створення проекту
- •2) Створення *.Asm файлу
- •3) Налагодження програми
- •Перше заняття
- •Друге заняття
- •Варіанти завдань
- •Додаткові експерименти
Перше заняття
Кожний студент повинен розробити на мові Асемблера процедуру згідно з варіантом завдання і розмістити її в початковому модулі разом з процедурою BigShowN або в окремому файлі, зі структурою, аналогічною файлу bigshown.asm. Процедура повинна відповідати спеціальним вимогам для її виклику з програми на мові C++. В усіх модулях на мові Асемблера необхідно розмістити директиву Title з зазначенням групи та прізвища студента.
Процедура на мові Асемблера створюється для виконання операції над даними цілого беззнакового типу великої розрядності. В оперативному запам'ятовуючому пристрої дані такого типу займають k комірок, де k - довільне значення. Нехай A -адреса даних такого типу. Тоді адреси комірок пам'яті та нумерацію двійкових розрядів надвеликого числа можна подать наступним чином
-
A+k-1
...
A+i-1
...
A+1
A
bk*8-1 b(k-1)*8
...
bi*8-1 b(i-1)*8
...
b15 b8
b7 b0
Значення B такого числа визначається стандартно:
В мові C++ такий тип даних не підтримується. Для подання в мові C++ даних надвеликого цілого беззнакового типу доцільно використовувати байтові масиви.
Перевірити працездатність програми testxxxx мовою Паскаль.pas, де хххх - номер варіанту.
У файлі testxxxx.рrn перед групом команд ПЕОМ, які сформовані транслятором на основі чергового рядка Паскаль-програми testxxxx.pas, записати цей Паскаль-рядок. Інформація про початкові адреси рядків береться з файлу testxxxx.map із структури сегмента кодів.
Друге заняття
Таким чином, для виконання лабораторної роботи необхідно розробити програму на мові C++, яка повинна відповідати вимогам для зв’язку з асемблерними процедурами, містити визначення байтових масивів та їх початкове заповнення, виклики процедури BigShowN для відображення початкових даних, виклики розробленої асемблерної процедури та виклики процедури BigShowN для відображення результатів. Перед викликом процедури BigShowN необхідно задати на мові C++ виведення на екран текстових коментарів.
Асемблерна процедура повинна виконувати ту чи іншу елементарну операцію (залежно від варіанту) з надвеликими цілими додатніми числами, які розміщуються в байтових масивах. Тобто, байтовий масив використовується для вмісту ОДНОГО надвеликого цілого беззнакового числа.
Переконатись в правильності функціонування модифікованої програми testxxxx.pas шляхом порівняння результатів виведення на екран немодифікованої та модифікованої програми.
Варіанти завдань
Розробити функцію bool FBig2Add(byte* M1, byte* M2, short len), де M1,M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1+М2. Функції FBig2Add присвоюється значення False в разі переповненя і True при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big3sAdd(byte* M1, byte* M2, byte* M3, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2+М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Extract(byte* M1, byte* M2, short len, short ibeg, short iend), де M1, M2 –надвеликі цілі додатні числа (байтові масиви довжиною len), ibeg, iend – номера двійкових розрядів, такі, що len*8-1 iend ibeg. Операція – виділити із числа M1 розряди з ibeg по iend включно та одержане таким чином число присвоїти M2. В старші розряди числа M2 занести 0.
Розробити функцію void Big3Add(byte* M1, byte* M2, byte* M3, byte* Carry, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2+М3. Змінній байтового типу Carry присвоюється значення 1 в разі переповненя і 0 при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool FBig3Add(byte* M1, byte* M2, byte* M3, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2+М3. Функції FBig3Add присвоюється значення False в разі переповненя і True при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big2sSub(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1-М2. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big2Sub(byte* M1,byte* M2,byte* Carry, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1-М2. Змінній байтового типу Carry присвоюється значення 1 при наявності позики і 0 при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool FBig2Sub(byte* M1, byte* M2, short len), де M1,M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1-М2. Функції Fbig2Sub присвоюється значення False в разі наявності позики і True при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big3sSub(byte* M1, byte* M2, byte* M3, byte* Carry, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2-М3. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big3Sub(byte* M1, byte* M2, byte* M3, byte* Carry, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2-М3. Змінній байтового типу Carry присвоюється значення 1 при наявності позики і 0 при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool FBig3Sub(byte* M1, byte* M2, byte* M3, short len), де M1, M2, М3 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М2-М3. Функції Fbig3Sub присвоюється значення False в разі наявності позики і True при її відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для віднімання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Biggr(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – якщо М1 > М2, то значення Biggr – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Biggreq(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – якщо М1 ≥ М2, то значення Biggreq – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Bigeq(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – якщо М1 = М2, то значення Bigeq – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Bigne(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція - якщо М1 М2, то значення Bigne – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Bigles(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – якщо М1 < М2, то значення Bigles – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію bool Bigleseq(byte* M1, byte* M2, short len), де M1,M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – якщо М1 М2, то значення Bigleseq – True, інакше – False. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для порівняння останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void BigShlCount(byte* M1, short len, short count), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), count – кількість розрядів зсуву. Операція – лінійний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів втрачаються, а в count молодших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void BigShrCount(byte* M1, short len, short count), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), count – кількість розрядів зсуву. Операція – лінійний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів втрачаються, а в count старших розрядів заноситься 0. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void BigRolCount(byte* M1, short len, short count), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), count – кількість розрядів зсуву. Операція – циклічний зсув вліво (в сторону старших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count старших розрядів поступають на місце молодших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void BigRorCount(byte* M1, short len, short count), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), count – кількість розрядів зсуву. Операція – циклічний зсув вправо (в сторону молодших розрядів) на кількість двійкових розрядів, яка задана параметром count. При цьому count молодших розрядів поступають на місце старших розрядів. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то при необхідності для останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void BigZeroShl(byte* M1, short* cnt, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), cnt – кількість розрядів зсуву. Операція – лінійний зсув вліво (в сторону старших розрядів) до тих пір, поки у len*8-1 розряді не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 розряд len*8-1 дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.
Розробити функцію void BigZeroShr(byte* M1, short* cnt, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), cnt – кількість розрядів зсуву. Операція – лінійний зсув вправо (в сторону молодших розрядів) до тих пір, поки в молодшому розряді числа не з'явиться одиничка. Кількість зсувів записується в параметр cnt. Якщо в початковому значенню числа М1 молодший розряд дорівнює 1, то зсуви не виконуються, а в параметр cnt записується нуль.
Розробити функцію void BigShl(byte* M1, byte* Carry, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), Carry – адреса змінної типу byte. Операція – лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому в змінну Carry заноситься значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.
Розробити функцію void BigShr(byte* M1, byte* Carry, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), Carry – адреса змінної типу byte. Операція – лінійний зсув вправо (в сторону молодших розрядів) на один розряд. При цьому в змінну Carry заноситься значення молодшого розряду числа M1, а в старший розряд числа M1 заноситься 0.
Розробити функцію byte FcBigShl(byte* M1, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len). Операція – лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FcBigShl приймає значення len*8-1 розряду числа M1, а в молодший розряд числа M1 заноситься 0.
Розробити функцію bool FBigShl(byte* M1, short len), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len). Операція – лінійний зсув вліво (в сторону старших розрядів) на один розряд. При цьому функція FBigShl приймає значення False, якщо len*8-1 розряд числа M1 до зсуву дорівнює 1 і True в протилежному випадку. В молодший розряд числа M1 при зсуві заноситься 0.
Розробити функції void BigSetBit(byte* M1, short len, short number) та void BigClrBit(byte* M1, short len, short number), де M1 – надвелике ціле додатнє число (байтовий масив довжиною len), number – номер двійкового розряду числа М1, починаючи з 0. Операція – записати одиничку в розряд number для процедури BigSetBit і 0 для процедури BigClrBit.
Розробити функцію void Big2sAdd(byte* M1, byte* M2, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1+М2. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.
Розробити функцію void Big2Add(byte* M1, byte* M2, byte* Carry, short len), де M1, M2 – надвеликі цілі додатні числа (байтові масиви довжиною len). Операція – М1=М1+М2. Змінній байтового типу Carry присвоюється значення 1 в разі переповненя і 0 при його відсутності. Повинні використовуватись команди для 32-розрядних даних. Якщо значення len не кратно 4, то для додавання останніх байт використовувати команди для 8-розрядних даних.