ASM_R5 (Взаимосвязь языков C и ассемблера)
Описание файла
Документ из архива "Взаимосвязь языков C и ассемблера", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "ASM_R5"
Текст из документа "ASM_R5"
Раздел 5: Курсовая программа
5.1 Постановка задачи
В курсовой требовалось написать программу, вычисляющую значение многочлена n-ой степени по вектору размерности n коэффициентов многочлена и по некой переменной х, задаваемые пользователем. Необходимо было реализовать многомодульную связь (два модуля: на С и на ассемблере), а также выразить наглядно связь ассемблера с языком С.
5.2 Блоксхема программы
Программа реализовывалась по следующей блоксхеме:
Очевидно, что была реализована связь в обе стороны.
5.3 Модуль на С++
/*Это часть на С++, есть еще на ассемблере*/
#include
extern "C" void vvod();/*ассемблерная процедура*/
extern "C" void mnogochlen(int *vec);/*функция в С*/
int m;
extern int *vect;/*вектор коэффициентов, объявленный*/
/*внешней переменной*/
main()
{
cout<<"\n Введите степень многочлена:"< cin>>m; vvod();/*Вызов ассемблерной процедуры*/ return 0; } extern "C"/*Начало функции на С*/ { void mnogochlen(int *vect) { int i,g,x; int fact,summa; summa=0; cout<<"\n Введите значение переменной:"< 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<<"ответ:"< cout<<"Ну вот и все!"< } } 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