You are on page 1of 5

Міністерство освіти і науки України

Національний університет “Львівська політехніка”


Кафедра ЕОМ

Звіт
з лабораторної роботи № 1
з дисципліни: “Системне програмування”
на тему: «ЗМІШАНЕ ПРОГРАМУВАННЯ НА МОВАХ С/C++ ТА
АСЕМБЛЕР»

Виконав: ст. гр КІ-39


Гаврильців В.Р.
Перевірив:
старший викладач
Козак Н. Б.

Львів 2022
Мета роботи: оволодіти навиками створення програм, частини яких
написані різними мовами програмування. Засвоїти правила взаємодії між
програмними модулями.

Завдання до лабораторної роботи № 1

Завдання:
1. Створити дві програми. Перша програма реалізує взаємовиклики C – ASM
та здійснює обчислення виразу, згідно варіанту. Програма повинна
складатися з кількох модулів, передача параметрів між якими здійснюється
через стек. Константа передається через спільну пам’ять.
Основний модуль – створюється мовою С. Він повинен забеспечувати:
• Ввід даних з клавіатури;
• Виклик підпрограм обчислення виразу;
• Вивід на екран результату обчислення виразу.
Модуль безпосередніх обчислень – здійснює всі обчислення виразу.
Створюється мовою Assembler.и
2. Друга програма реалізує взаємовиклики C – ASM – C та здійснює
обчислення виразу згідно варіанту. Програма повинна складатися з кількох
модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С. Він повинен забезпечувати:
• Ввід даних з клавіатури;
• Виклик підпрограм обчислення виразу;
Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран
результату обчислення виразу викликом стандартної функції printf().
Створюється мовою Assembler.
Варіант 5
№ Вираз К
5 Х = B4 - A2 * 2 - E2 + K 505
Хід роботи
Код програми 1
main.c

#include <stdio.h>

const int K = 0x505;

extern int calc(int, short, short);


extern int calc1(int, short, short);

int main()
{
short A = 0;
int B = 0;
short E = 0;
int res = 0;
int C = 0;
printf("A = ");
scanf_s("%hd", &A);
printf("B = ");
scanf_s("%d", &B);
printf("E = ");
scanf_s("%hd", &E);
printf("\nA = %hd B = %d E = %hd K = 1285\n", A, B, E);
res = calc1(B, A, E);
printf("Res: %d\n", res);
C = B - A * 2 - E + K;
printf("C = %d", C);
return 0;
}

calc.asm:

.386
.model flat, c
EXTRN K: dword
.code
calc proc
; +16 - short E
; +12 - short A
; + 8 - int B
; X = B4 - A2 * 2 - E2 + K
push ebp
mov ebp, esp
mov eax, 0
mov edx, 0
mov ecx, 0
mov edx, dword ptr [ebp + 8]
movsx eax, word ptr [ebp + 12]
sal eax, 1
sub edx, eax
add edx, K
movsx ecx, word ptr [ebp + 16]
sub edx, ecx
mov eax, edx
pop ebp
ret
calc endp
end
Результат роботи програми 1

Код програми 2
.386
.model flat, c
printf PROTO C, : VARARG

EXTRN K: dword

.data
mess db "calc1.asm Result: %d", 10 ,0
.code
calc1 proc
; +16 - short E
; +12 - short A
; + 8 - int B
; X = B4 - A2 * 2 - E2 + K
push ebp
mov ebp, esp
mov eax, 0
mov edx, 0
mov ecx, 0
mov edx, dword ptr [ebp + 8]
movsx eax, word ptr [ebp + 12]
sal eax, 1
sub edx, eax
add edx, K
movsx ecx, word ptr [ebp + 16]
sub edx, ecx
mov eax, edx
push eax
invoke printf, offset mess, eax
pop eax
pop ebp
ret

calc1 endp
end
Результат роботи програми 2

Перевірка:
A = -1000, B =1000, D = -1000, K = 1285
X = 1000 – (-1000) * 2 – (-1000) + 1285 = 5285

Висновок: на цій лабораторній роботі я оволоділа навичками створення


програм, частини яких написані різними мовами програмування, а також
засвоїла правила взаємодії між програмними модулями.

You might also like