Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторної роботи № 2
з дисципліни: “Системне програмування”
на тему: “Змішане програмування на мовах C та Асемблер”
Мета лабораторної роботи
Оволодіти навичками створення програм, частини яких написані різними мовами програмування. Засвоїти правила взаємодії між програними модулями різних мов програмування.
Теоретичні відомості
Труднощі опису зв’язку програм написаних мовою C і асемблерних програм полягає в тому, що різні версії мови C мають різні угоди з виклику функцій та передавання їм параметрів. Для більш точної інформації варто користатися посібником з наявної версії мови C.
Індивідуальне завдання
1.	Створити дві програми. Перша програма реалізує взаємовиклики С – ASM та здійснює обчислення, заданого виразу, згідно варіанту (Табл. 2.3). Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек. Константа передається через спільну пам’ять.
Основний модуль – створюється мовою С. Він повинен забезпечувати:
•	ввід даних з клавіатури;
•	виклик підпрограми обчислення виразу;
•	вивід на екран результату обчислення виразу.
Модуль безпосередніх обчислень – здійснює всі обчислення виразу. Створюється  мовою Assembler.
2.	Друга програма реалізує взаємовиклики С – ASM – С та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох  модулів, передача параметрів між якими здійснюється через стек.
Основний модуль – створюється мовою С. Він повинен забезпечувати:
•	ввід даних з клавіатури;
•	виклик підпрограми обчислення виразу;
Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран результату обчислення виразу викликом стандартної функції printf() . Створюється мовою Assembler.
29.
X=K-B1*4+D2-F2/2
12A0C029
А, В, С, D, E, F - знакові цілі числа, довжиною в байтах, згідно з індексом, значення константи К подано у 16-му форматі.
Код програми
Перша програма (C – Asm)
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <conio.h>
extern "C" int calc(int, int, int); 
extern "C" const int K = 0x12A0C029;
void main()
{
	printf("X = %d - B * 4 + D - F / 2\n\nB = [-128; 127]\nD = [-32768; 32767]\nF = [-32768; 32767]\n\n", K);
	int B, D, F;
	do
	{
		printf("B = ");
		scanf("%d", &B);
	} while (B < -128 || B > 127);
	do
	{
		printf("D = ");
		scanf("%d", &D);
	} while (D < -32768 || D > 32767);
	do
	{
		printf("F = ");
		scanf("%d", &F);
	} while (F < -32768 || F > 32767);
	printf("\nC:   X = %d\nAsm: X = %d\n", K - B * 4 + D - F / 2, calc(B, D, F));
	_getch();
}
calc.asm
.686
.model flat, c
.data
	extrn K : dword
.code
calc proc
	push ebp
	mov ebp, esp
	mov al, byte ptr [ebp+8]
	cbw
	cwde
	sal eax, 2					; eax = B * 4
	mov edx, K
	sub edx, eax				; edx = K - B * 4
	mov ax, word ptr [ebp+12]
	cwde
	add eax, edx
	mov ebx, eax				; ebx = K - B * 4 + D
	mov ax, word ptr [ebp+16]
	cwde
	cdq
	mov ecx, 2
	idiv ecx					; eax = F / 2
	sub ebx, eax
	mov eax, ebx				; eax = K - B * 4 + D - F / 2
	pop ebp
	ret
calc endp
end
Друга програма (C – Asm – C)
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <conio.h>
extern "C" void calc(int, int, int); 
extern "C" const int K = 0x12A0C029;
void main()
{
	printf("X = %d - B * 4 + D - F / 2\n\nB = [-128; 127]\nD = [-32768; 32767]\nF = [-32768; 32767]\n\n", K);
	int B, D, F;
	do
	{
		printf("B = ");
		scanf("%d", &B);
	} while (B < -128 || B > 127);
	do
	{
		printf("D = ");
		scanf("%d", &D);
	} while (D < -32768 || D > 32767);
	do
	{
		printf("F = ");
		scanf("%d", &F);
	} while (F < -32768 || F > 32767);
	printf("\nC:   X = %d\n", K - B * 4 + D - F / 2);
	calc(B, D, F);
	_getch();
}
calc.asm
.686
.model flat, c
.data
	result db "Asm: X = %d", 13, 10, 0
	extrn K : dword
.code
	extrn printf : proc
calc proc
	push ebp
	mov ebp, esp
	mov al, byte ptr [ebp+8]
	cbw
	cwde
	sal eax, 2					; eax = B * 4
	mov edx, K
	sub edx, eax				; edx = K - B * 4
	mov ax, word ptr [ebp+12]
	cwde
	add eax, edx
	mov ebx, eax				; ebx = K - B * 4 + D
	mov ax, word ptr [ebp+16]
	cwde
	cdq
	mov ecx, 2
	idiv ecx					; eax = F / 2
	sub ebx, eax				; ebx = K - B * 4 + D - F / 2
	pop ebp
	push ebx
	push offset result
	call printf
	add esp, 8
	ret
calc endp
end
Результат виконання програми
/
/
/
/
Висновок
Я оволодів навичками створення програм, частини яких написані різними мовами програмування та засвоїв правила взаємодії між програними модулями різних мов програмування.