Баклавру - Курсовые и рефераты
Home Курсовые Программирование и компьютеры Взаимосвязь языков C и ассемблера
 
 

Взаимосвязь языков C и ассемблера

Файл: ASM_R5.doc ( 299520 байт )
Размер файла:299520 байт
Дата файла:12.05.1997 9:04:06
Длина текста:5653 байт
Другие части работы:  [ASM_R3.doc ( 18432 байт )]   [ASM_R4.doc ( 17408 байт )]   [ASM_R1.doc ( 15872 байт )]   [ASM_VV.doc ( 13824 байт )]   [ASM_R2.doc ( 12800 байт )]   [SODERJ.doc ( 10240 байт )]   [LITRA.doc ( 9216 байт )]   [TITUL.doc ( 7168 байт )] 
Раздел 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 Анализ проведенной работы

При работе в многомодульном режиме главные трудности возникают в использовании регистров. Из-за несохранения системных регистров, используемых С++, программа может просто “повиснуть”. Также следовало сделат выбор - какой модуль сделать главным. Но практика показывает, что следует производить вызов языков низкого уровня из высокого, а не наоборот. В общем, все трудности были преодолены и программа появилась в свет.

23

Другие части работы:  [ASM_R3.doc ( 18432 байт )]   [ASM_R4.doc ( 17408 байт )]   [ASM_R1.doc ( 15872 байт )]   [ASM_VV.doc ( 13824 байт )]   [ASM_R2.doc ( 12800 байт )]   [SODERJ.doc ( 10240 байт )]   [LITRA.doc ( 9216 байт )]   [TITUL.doc ( 7168 байт )] 

 
Top! Top!