
- •Лабораторна робота №4-1 Організація взаємозв'язку програм мовою Асемблера з програмами мовою Паскаль
- •Перше заняття
- •Друге заняття
- •Лабораторна робота №4-2
- •1) Оголошення зовнішніх асемблерних процедур
- •2) Опис глобальних змінних
- •1) Директива завдання набору допустимих команд процесора
- •2) Директива public
- •3) Модель пам’яті
- •6) Локальні параметри
- •7) Повернення значень з асемблерної процедури
- •8) Організація повернення з підпрограми
- •9) Поле операндів директиви end
- •1) Створення проекту
- •2) Створення *.Asm файлу
- •3) Налагодження програми
- •Перше заняття
- •Друге заняття
- •Варіанти завдань
- •Додаткові експерименти
Лабораторна робота №4-2
Організація взаємозв'язку програм мовою Асемблера з програмами мовою С++
Мета роботи – ознайомлення з організацією взаємозв'язку програм мовою Асемблера з програмами мовою C++, вивчення методів опрацювання складних структур даних.
4-2.1 Зміст роботи
Робота виконується на двох заняттях. На першому занятті студенти, використовуючи приклади програм у файлах lab4.cpp та bigshown.asm, вивчають правила взаємозв'язку програм мовою Асемблера і мовою C++. Шляхом модифікації програми з файлу lab4.cpp ознайомлюються з машинною структурою різних типів даних, також з індивідуальним варіантом завдання по реалізаціїї елементарних операцій з надвеликими цілими числами, які застосовуються у сучасній комп’ютерній криптографії для електронного цифрового підпису та при створенні віртуальних захищених каналів у відкритих комп'ютерних мережах.
На другому занятті студенти складають мовою С++ програму, що містить виклик самостійно реалізованої мовою Асемблера підпрограми для виконання елементарної операції з надвеликими числами, а також виклик асемблерної процедури Bigshow для відображення тестових даних і результатів виконання операції.
4-2.2 Теоретичні відомості
4-2.2.1. Правила взаємозв'язку програм мовою Асемблера і мовою С++
Взаємозв’язок програм мовою високого рівня і програм мовою Асемблера здійснюється двома методами:
вставками асемблерного тексту в текст програми мовою високого рівня;
використання окремо скомпільованих асемблерних процедур, які мовою високого рівня об'являються як зовнішні (external).
З першим методом студенти знайомились в лабораторній роботі №2-2. Завданням даної лабораторної роботи є створення зовнішніх для С++ програми асемблерних процедур. Для його вирішення необхідно перш за все з’ясувати наступні питання:
як передати параметри в асемблерну процедуру;
як звернутися до цих параметрів в асемблерній процедурі;
як повернути результат роботи асемблерної процедури у програму мовою С++.
Крім того, необхідно знати, яким спеціальним додатковим вимогам мають вдовольняти програми як мовою C++, так і мовою Асемблера.
Загальні принципи організації зв’язку С++ – Асемблер нагадують розглянуті в лабораторній роботі 4-1 правила Паскаль – Асемблер, проте є і відмінності, і додаткові можливості. Стандартні можливості зв’язку надаються при організації зв’язку в стилі С, решта може залежати від компілятора С++ в обраному середовищі програмування. У даній лабораторній роботі передбачається робота в інтегрованому середовищі Visual Studio та відповідно з компілятором Visual С++.
Розглянемо основні принципи організації зв’язку С++ – Асемблер.
1) Передавання параметрів з програми мовою С++ в асемблерну процедуру
Передавання параметрів в асемблерну процедуру здійснюється через стек (як і у випадку мови Паскаль). Проте, на відміну від Паскаля, параметри С++ функцій передаються в стек у зворотному порядку. Тобто, перед безпосереднім викликом функції її параметри заносяться в стек, починаючи з останнього й закінчуючи першим параметром. Може записуватися значення параметра чи його адреса. Далі в стек записується адреса повернення та здійснюється сам виклик.
2) Доступ до переданих з програми мовою С++ параметрів в асемблерній процедурі
Для доступу до параметрів, що знаходяться у стеку, в асемблерній процедурі використовується базовий регістр стеку EBP(BP). Оскільки у програмах широко використовується виклик одних процедур з інших, попередній вміст цього регістра необхідно зберегти, а потім записати в нього вміст покажчика стеку регістра ESP (настроївши, таким чином, його на останні записані в стек дані):
push EBP
mov EBP, ESP
Після цього доступ до параметрів у стеку здійснюється за зміщенням відносно вмісту регістра EBP. Тобто, для адресації будь-якого аргументу можна використати адресний вираз [EBP+зміщення], що визначає місце розташування аргумента в стеку.
Збережений вміст регістра EBP(BP) має відновлюватися по закінченню роботи процедури. Тому наприкінці асемблерної процедури повинна бути команда
рop EBP
Після повернення з асемблерної процедури вміст покажчика стеку ESP повинен відновлюватися – приймати значення, яке було перед записом цих параметрів у стек та викликом функції. Таке очищення стеку (вивільнення його від параметрів) здійснюється С++ функцією, а не асемблерною процедурою. Інші (не С) конвенції можуть вимагати очищення стеку від асемблерної процедури).
Тоді закінчення асемблерної процедури виглядатиме наступним чином:
рop EBP
ret const
де const – розмір параметрів процедури у байтах.
3) Повернення результату з асемблерної процедури у програму мовою С++
Повернення результату асемблерної процедури (значення С++ функції) здійснюється через регістр-акумулятор. Тому перед поверненням з процедури отриманий результат необхідно туди помістити.
4-2.2.2. Вимоги до програми мовою C++