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