Курсовая Взаимосвязь языков C и ассемблера
Работа добавлена на сайт bukvasha.net: 2015-10-25Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Раздел 5: Курсовая программа
5.1 Постановка задачи
В курсовой требовалось написать программу, вычисляющую значение многочлена n-ой степени по вектору размерности n коэффициентов многочлена и по некой переменной х, задаваемые пользователем. Необходимо было реализовать многомодульную связь (два модуля: на С и на ассемблере), а также выразить наглядно связь ассемблера с языком С.
5.2 Блоксхема программы
Программа реализовывалась по следующей блоксхеме:
Очевидно, что была реализована связь в обе стороны.
5.3 Модуль на С++
/*Это часть на С++, есть еще на ассемблере*/
#include<iostream.h>
extern "C" void vvod();/*ассемблерная процедура*/
extern "C" void mnogochlen(int *vec);/*функция в С*/
int m;
extern int *vect;/*вектор коэффициентов, объявленный*/
/*внешней переменной*/
main()
{
cout<<"\n Введите степень многочлена:"<<endl;
cin>>m;
vvod();/*Вызов ассемблерной процедуры*/
return 0;
}
extern "C"/*Начало функции на С*/
{
void mnogochlen(int *vect)
{
int i,g,x;
int fact,summa;
summa=0;
cout<<"\n Введите значение переменной:"<<endl;
cin>>x;
for(i=m;i>=0;i--)/*Вычисление ответа*/
{
fact=1;
for(g=0;g<=i;g++)
{
fact=fact*x;
}
summa=summa+vect[i]*fact;
}
cout<<"ответ:"<<summa<<endl;
cout<<"Ну вот и все!"<<endl;
}
}
5.4 Модуль на ассемблере
MODEL small
dataseg
so db 'введите вектор коэффициентов','$'
extrn _m:word, _vec:word; Внешние аргументы
m2 dw 0
codeseg
extrn _mnogochlen:proc; функция из С++
public _vvod; местная процедура
proc _vvod near
push bp
mov bp,sp
push di;Сохранение значений этих регистров
push si;необходимо, т.к. они используются С++
MOV ah,09h ;начало ввода вектора перестановок
MOV dx,offset so
INT 21h
mov si,0
MOV cx,[_m]
l1: MOV ah,02h
MOV dl,'>'
INT 21h
MOV di,0
m1 : MOV ah,08h
INT 21h
CMP al,13
JE exit
CMP al,'9'
JA m1
CMP al,'0'
JB m1
MOV ah,02h
MOV dl,al
INT 21h
SUB al,'0'
XOR ah,ah
MOV m2,ax
MOV ax,di
MOV bx,10
MUL bx
ADD ax,m2
MOV di,ax
JMP m1
exit: MOV [_vec[si]],di
ADD si,2;Данные типа слово, прибавляем 2
MOV di,0
mov ah,02h
mov dl,' '
int 21h
mov dl,13
int 21h
mov dl,10
int 21h
LOOP l1
mov sp,bp
pop di;извлечение сохраненных регистров
pop si;перед возвратом в С++
MOV ax,offset [_vec]
PUSH ax
call _mnogochlen; Вызов функции С++
ADD sp,4;Удаление элементов из стека
POP bp;адрес возврата
ret
endp _vvod
end
5.5 Анализ проведенной работы
При работе в многомодульном режиме главные трудности возникают в использовании регистров. Из-за несохранения системных регистров, используемых С++, программа может просто “повиснуть”. Также следовало сделат выбор - какой модуль сделать главным. Но практика показывает, что следует производить вызов языков низкого уровня из высокого, а не наоборот. В общем, все трудности были преодолены и программа появилась в свет.