Professional Documents
Culture Documents
Лабораторна робота 1
Лабораторна робота 1
Звіт
з лабораторної роботи № 1
з дисципліни: “Системне програмування”
на тему: «ЗМІШАНЕ ПРОГРАМУВАННЯ НА МОВАХ С/C++ ТА
АСЕМБЛЕР»
Львів 2022
Мета роботи: оволодіти навиками створення програм, частини яких
написані різними мовами програмування. Засвоїти правила взаємодії між
програмними модулями.
Завдання:
1. Створити дві програми. Перша програма реалізує взаємовиклики C – ASM
та здійснює обчислення виразу, згідно варіанту. Програма повинна
складатися з кількох модулів, передача параметрів між якими здійснюється
через стек. Константа передається через спільну пам’ять.
Основний модуль – створюється мовою С. Він повинен забеспечувати:
• Ввід даних з клавіатури;
• Виклик підпрограм обчислення виразу;
• Вивід на екран результату обчислення виразу.
Модуль безпосередніх обчислень – здійснює всі обчислення виразу.
Створюється мовою Assembler.и
2. Друга програма реалізує взаємовиклики C – ASM – C та здійснює
обчислення виразу згідно варіанту. Програма повинна складатися з кількох
модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С. Він повинен забезпечувати:
• Ввід даних з клавіатури;
• Виклик підпрограм обчислення виразу;
Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран
результату обчислення виразу викликом стандартної функції printf().
Створюється мовою Assembler.
Варіант 5
№ Вираз К
5 Х = B4 - A2 * 2 - E2 + K 505
Хід роботи
Код програми 1
main.c
#include <stdio.h>
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