Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
до вступної лабораторної роботи
по курсу “Системного програмування
Мета: Оволодіти навиками створення програм, частини яких написані різними мовами програмування Засвоїти правила взаємодії різних модулів
Теоретична частина:
Труднощі опису зв'язку програм мовою C і асемблерних програм полягає в тому, що різні версії мови C мають різні угоди про зв'язки і для більш точної інформації варто користатися посібником з наявної версії мови C.
Більшість версій мови C забезпечують передачу параметрів через стек у зворотній (у порівнянні з іншими мовами) послідовності. Звичайно доступ, наприклад, до двох параметрів, переданих через стек, здійснюється в такий спосіб.
Деякі версії мови C розрізняють великі і малі букви, тому ім'я асемблерного модуля повинне бути представлено в тому ж символьному регістрі, який використовують для посилання C-програми.
У деяких версіях мови C потрібно, щоб асемблерні програми, що змінюють регістри DI і SI, записували їхній вміст у стек при вході і відновлювали ці значення зі стека при виході.
Ассемблерні програми повинні повертати значення, якщо це необхідно, у регістрі AX (одне слово) чи в регістро парі DX:AX (два слова).
Для деяких версій мови C, якщо ассемблерна програма встановлює прапор DF, те вона повинна скинути його командою CLD перед поверненням.
Хід роботи:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
;_A1 dw 1111h
;_A2 dw 1111h
;_B db 11h
;_C db 1
;_D dw 1
;_E db 1
_K dw 2513h
;_Temp1 dw 00h
;_Temp2 dw 00h
;_X dw
.CODE
_papa PROC
PUBLIC _papa
EXTRN _A:word,_B:byte,_C:byte,_D:byte,_E:word,_X:word,_Temp1:word,_Temp2:word
mov ax,@data
mov ds,ax
mov al,_D
mov ah,0
cmp _D,0
jge sd
mov ah,0FFh
sd: mov bx,_E
add ax,bx
mov bx,_K
sub ax,bx
mov dx,00
mov bl,_C
mov bh,0
cmp _C,0
jge sk
mov bh,0FFh
sk: imul bx
mov _Temp2,ax
mov ax,_A
idiv _B
mov bx, 0
mov bl,al
mov _B,al
cmp _B,0
jge sll
mov bh,0FFh
sll: add bx,_Temp2
mov _X,bx
ret
_papa ENDP
_my_calk PROC
PUBLIC _my_calk
EXTRN _ero:PROC
call near ptr _ero
ret
_my_calk ENDP
End
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
extern short papa(void);
extern void my_calk(void);
void ero(void);
unsigned char C[2],B[2],D[2];
short X,Temp1,Temp2,A,E;
int main()
{
X=0;
printf ("\nX=A/B+C*(D+E-K)\n");
printf("B=");
scanf("%d",&B);
printf("D=");
scanf("%d",&D);
printf("C=");
scanf("%d",&C);
printf("A=");
scanf("%d",&A);
printf("E=");
scanf("%d",&E);
//X=A/B+C[0]*(D-E[0]+K);
papa();
my_calk();
getch();
return 0;
}
void ero()
{
printf ("A/B+C*(D+E-K)=%d\n",X);
}
Висновок: На даній лабораторній роботі я навчилася оволодівати навиками створення програм, частини яких написані різними мовами програмування і засвоїла правила взаємодії різних модулів.