Міністерство освіти і науки, молоді та спорту України
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Лабораторна робота №2
з курсу
”Системне програмування ”
ЗМІШАНЕ ПРОГРАМУВАННЯ НА МОВАХ С ТА АСЕМБЛЕР
Львів 2012
Мета: оволодіти навиками створення програм, частини яких написані різними мовами програмування Засвоїти правила взаємодії різних модулів.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Труднощі опису зв'язку програм мовою 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.
Варіант:
14
X=A4-B1-K-D2/2+4*B1
614
Код програми: С-Assembler
main.cpp
//C
#include <stdio.h>
#include <conio.h>
//14 X=A4-B1-K-D2/2+4*B1 614
extern "C" int calc(void);
extern "C"
{
int A=0;
int B=0;
int D=0;
int K=1556; //Kconst = 614h = 1556dec
int Y=0;
};
int main()
{
printf("X=A4-B1-K-D2/2+4*B1 614\n");
printf("Enter your numbers:\n");
printf("A = ");
scanf("%d",&A);
printf("B = ");
scanf("%d",&B);
printf("D = ");
scanf("%d",&D);
calc();
printf("\nASM: Result = %d\n",Y);
getch();
return 0;
}
calc.asm
.386
.model flat,c
EXTRN A:SDWORD, B:SDWORD, D:SDWORD, K:SDWORD, Y:SDWORD
.data
rez1 dd 0
rez2 dd 0
rez3 dd 0
.code
calc PROC
mov eax,A
mov ebx,B
sub eax,ebx
mov ebx,K
sub eax,ebx
mov rez1,eax
mov edx,0
mov eax,D
mov ecx,2
div ecx
mov rez2,eax
mov eax,B
mov ecx,4
mul ecx
mov rez3,eax
mov eax,rez1
mov ebx,rez2
sub eax,ebx
mov ebx,rez3
add eax,ebx
mov Y,eax
calc ENDP
ret
END
Код програми: С-Assembler-C
main.cpp
//C
#include <stdio.h>
#include <conio.h>
//14 X=A4-B1-K-D2/2+4*B1 614
extern "C" int calc(void);
extern "C"
{
int A=0;
int B=0;
int D=0;
int K=1556; //Kconst = 614h = 1556dec
int Y=0;
};
int main()
{
printf("X=A4-B1-K-D2/2+4*B1 614\n");
printf("Enter your numbers:\n");
printf("A = ");
scanf("%d",&A);
printf("B = ");
scanf("%d",&B);
printf("D = ");
scanf("%d",&D);
calc();
getch();
return 0;
}
calc.asm
;14 X=A4-B1-K-D2/2+4*B1 614
.386
.model flat,c
EXTRN A:SDWORD, B:SDWORD, D:SDWORD, K:SDWORD, Y:SDWORD
printf proto C :VARARG
.data
rez1 dd 0
rez2 dd 0
rez3 dd 0
format db "X = %d\n"
.code
calc PROC
mov eax,A
mov ebx,B
sub eax,ebx
mov ebx,K
sub eax,ebx
mov rez1,eax
mov edx,0
mov eax,D
mov ecx,2
div ecx
mov rez2,eax
mov eax,B
mov ecx,4
mul ecx
mov rez3,eax
mov eax,rez1
mov ebx,rez2
sub eax,ebx
mov ebx,rez3
add eax,ebx
mov Y,eax
push eax
push offset format
call printf
add esp,8
calc ENDP
ret
END
Висновок: я оволодів навиками створення програм, частини яких написані різними мовами програмування .Засвоїв правила взаємодії різних модулів.