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

Лабораторна робота №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++