Міністерство освіти і науки, молоді та спорту України
Національний університет “Львівська політехніка”
/
Кафедра ЕОМ
Лабораторна робота №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 тощо).
.
Завдання:
Створити дві програми. Прша програма реалізує взаємовиклики С – ASM та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С.
Він повинен забезпечувати:
ввід даних з клавіатури;
виклик підпрограми обчислення виразу;
вивід на екран результату обчислення виразу.
Модуль безпосередніх обчислень – здійснює всі обчислення виразу. Створюється мовою Assembler.
Друга програма реалізує взаємовиклики С – ASM – С та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С.
Він повинен забезпечувати:
ввід даних з клавіатури;
виклик підпрограми обчислення виразу;
Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран результату обчислення виразу викликом стандартної функції printf() . Створюється мовою Assembler.
Варіант №22 :
22
X=K-B1-C1-D2/2+4*B1
45781022
Виконання роботи :
Коди програм :
# include <stdio.h>
extern "C" int calc(char B, char C, short D, int K);
int K = 0x45781022;
char B,C;
short D;
int Result;
void main()
{
printf("Please enter your numbers \n");
printf("B = ");
scanf("%d",&B);
printf("C = ");
scanf("%d",&C);
printf("D = ");
scanf("%d",&D);
Result = calc(B,C,D,K);
printf("Result = %ld", Result);
}
.586
.model flat
public _calc
.data
.code
_calc proc
push ebp
mov ebp,esp
mov eax,[ebp+16]
shr eax,01
mov ebx,[ebp+8]
shl ebx,02
sub ebx,eax
sub ebx,[ebp+12]
sub ebx,[ebp+8]
mov eax,[ebp+20]
add eax,ebx
pop ebp
ret
_calc endp
END
/
# include <stdio.h>
extern "C" int calc(char B, char C, short D, int K);
int K = 0x45781022;
char B,C;
short D;
int Result;
void main()
{
printf("Please enter your numbers \n");
printf("B = ");
scanf("%d",&B);
printf("C = ");
scanf("%d",&C);
printf("D = ");
scanf("%d",&D);
Result = calc(B,C,D,K);
}
.586
.model flat,C
public calc
.data
PrintRezult BYTE "Result is %d",10,13,0
.code
printf PROTO printlist: VARARG
calc proc
push ebp
mov ebp,esp
mov eax,[ebp+16]
shr eax,01
mov ebx,[ebp+8]
shl ebx,02
sub ebx,eax
sub ebx,[ebp+12]
sub ebx,[ebp+8]
mov eax,[ebp+20]
add eax,ebx
invoke printf, ADDR PrintRezult, eax
pop ebp
ret
calc endp
END
/
Висновок : на даній лабораторній роботі я оволодів навиками створення програм, частини яких написані різними мовами програмування. Засвоїв правила взаємодії різних модулів