Міністерство освіти і науки
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Звіт
з лабораторної роботи № 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
Результат виконання програми
/
/
/
/
Висновок
Я оволодів навичками створення програм, частини яких написані різними мовами програмування та засвоїв правила взаємодії між програними модулями різних мов програмування.