МІНІСТЕРСТВО ОСВІТИ І НАУКИ, УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
Звіт
про виконання лабораторної роботи № 2
з курсу „ Системне програмування”
Змішанепрограмування на мовах С та Асемблер
Мета роботи:оволодітинавикамистворенняпрограм, частиниякихнаписанірізнимимовамипрограмуванняЗасвоїти правила взаємодіїрізнихмодулів.
Теоретичнівідомості
Труднощі опису зв'язку програм мовою C і асемблерних програм полягає в тому, що різні версії мови C мають різні угоди про зв'язки і для більш точної інформації варто користатися посібником з наявної версії мови C.
Більшістьверсіймови C забезпечують передачу параметрів через стек у зворотній (у порівнянні з іншимимовами) послідовності. Звичайно доступ, наприклад, до двохпараметрів, переданих через стек, здійснюється в такийспосіб:
PUSH EBP
MOV EBP,ESP
MOV EAX,[EBP+8]
MOV EDX,[EBP+12]
...
POP EBP
RET
Деяківерсіїмови C розрізняютьвеликі і малібукви, тому ім'яасемблерного модуля повинне бути представлено в тому ж символьному регістрі, якийвикористовують для посилання C-програми.
У деякихверсіяхмови C потрібно, щобасемблерніпрограми, щозмінюютьрегістри EDI і ESI, записувалиїхнійвміст у стек при вході і відновлювалицізначеннязі стека при виході.
Ассемблерніпрограмиповинніповертатизначення, якщоценеобхідно, у регістрі EAX (подвійне слово) чи в регістровійпарі EDX:EAX (8 слів).
Для деякихверсіймови C, якщоассемблернапрограмавстановлює прапор DF, те вона повинна скинутийого командою CLD перед поверненням.
Щобскомпонувати разом модулі C++ і Макро асемблера, повинні бути дотриманінаступні три умови:
У модулях Макро Асемблераповиннівикористовуватися угоди проімена, прийняті в C++.
C++ і Макро Асемблерповинніспільновикористовувативідповідніфункції й іменазмінних у формі, прийнятної для C++.
Для комбінуваннямодулів у виконуванупрограмупотрібновикористовуватиутіліту-компоновщик (TLINK, LINKтощо).
Поверненнязначень
Програми, яківикликаються з С++ і написані на Асемблеріможутьповертатизначення. Значенняфункційповертаються в такийспосіб:
тип щоповертає значения
Де перебуваєзначення, щоповертається
unsignedchar
EAX
char
EAX
enum
EAX
unsignedshort
EAX
short
EAX
unsignedint
EAX
int
EAX
unsignedlong
EAX
long
EAX
float
регістрвершини стека співпроцесора 8087 (ST(0))
double
регістрвершини стека співпроцесора 8087 (ST(0))
longdouble
регістрвершини стека співпроцесора 8087 (ST(0))
near*
EAX
Завдання
Створити програму, яка реалізовує обчислення, заданого виразу, згідно варіанту.
Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С.
Він повинен забезпечувати:
ввід даних з клавіатури;
виклик підпрограми обчислення виразу;
вивід на екран результату обчислення виразу.
Модуль безпосередніх обчислень – здійснює всі обчислення виразу і створюється мовою Assembler;
Відлагодити та протестувати програму. Результати роботи програми продемонструвати викладачу.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї, а також результатів її роботи.
Примітка. В лабораторній роботі використати взаємовиклики С – ASM – С. Для виводу результатів обчислень забезпечити виклик стандартної функції printf() із модуля ASM .
4
X=A4+C1-D4/5+K
45694
Код програми С – ASM
main.cpp
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
extern "C" int calc(int a, char c, int d);
extern "C" const int K;
int main()
{//X=A4+C1-D4/5+K 45694
int A,C,D;
cout << "X=A4+C1-D4/5+K.\n";
cout << "Please, enter your numbers:\n";
cout << "A4 = ";
cin >> A;
cout << "C1 = ";
cin >> C;
cout << "D4 = ";
cin >> D;
cout << endl << "Result(asm) = " << calc(A,C,D);
cout << endl << "Result(c++) = " << A+C-D/5+K;
getch();
return 0;
}
calc.asm
.386
.model flat
public _K
.data
_K dd 45694h
x dd 0
.code
_calc proc ;X=A4+C1-D4/5+K 45694
public _calc
push ebp
mov ebp,esp
mov ebx, [ebp+8];ebx ->A
add ebx, [ebp+12];ebx -> A+C
mov eax, [ebp+16];eax -> D
mov ch,5
div ch;eax -> D/5
sub ebx, eax; ebx -> A+C-D/5
add ebx, _K
mov eax, ebx
pop ebp
ret
_calc endp
END
Результат виконання програми
/
Код програми С – ASM – С
main.cpp
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
extern "C" void calc(int a, char c, int d);
extern "C" const int K;
int main()
{//X=A4+C1-D4/5+K 45694
int A,C,D;
cout << "X=A4+C1-D4/5+K.\n";
cout << "Please, enter your numbers:\n";
cout << "A4 = ";
cin >> A;
cout << "C1 = ";
cin >> C;
cout << "D4 = ";
cin >> D;
calc(A,C,D);
cout << endl << "Result(c++) = " << A+C-D/5+K;
getch();
return 0;
}
calc.asm
.386
.model flat
public _K
.data
_K dd 45694h
text db "Result(asm) = %d",0
x dd 0
.code
extern _printf:near
_calc proc ;X=A4+C1-D4/5+K 45694
public _calc
push ebp
mov ebp,esp
mov ebx, [ebp+8];ebx ->A
add ebx, [ebp+12];ebx -> A+C
mov eax, [ebp+16];eax -> D
mov ch,5
div ch;eax -> D/5
sub ebx, eax; ebx -> A+C-D/5
add ebx, _K
mov eax, ebx
pop ebp
push eax
push offset text
call _printf
add esp,8
ret
_calc endp
END
Результат виконання програми
/
Висновок:оволодів навиками створення програм,частини яких написані різними мовами програмування. Засвоїв правила взаємодії різних модулів.