Взаимосвязь языков C и ассемблера (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




Случайные файлы

Файл
102774.rtf
37699.doc
162431.rtf
47486.rtf
9661.doc




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.