100 likes | 287 Views
Интерфейс на Асемблер и С. Използват се два начина: Извикване на асемблерна подпрограма от програма на С. Поставяне на асемблерни инструкции директно в програмата на С.
E N D
Интерфейс на Асемблер и С • Използват се два начина: • Извикване на асемблерна подпрограма от програма на С. • Поставяне на асемблерни инструкции директно в програмата на С. • Неудобство: асемблерният код трябва да бъде във формат, който използва компилатора. Borland изисква MASM формат. Няма компилатор за NASM формат. • Асемблерни подпрограми • За директен достъп до хардуерни компоненти • За оптимизация (бърза и ефективна обработка)
Интерфейс на Асемблер и С • Асемблерни подпрограми - някои съображения при използването им: • Регистри • С предполага, че подпрограмата подържа: EBX, ESI, EDI, CS, DS, SS, ES и трябва да ги възстановява преди връщане. • Етикети • Повечето С компилатори изискват _f(ако f е функция или глобална променлива) • Параметри • Според С параметрите на функциите се поставят в стека в обратен ред.
Интерфейс на Асемблер и С • Адреси на локални променливи • Намирането на адреса от сегмента за данни или стековия се прави от свързващия редактор. • Изчисляването на адреса на локална променлива или параметър, намиращи се в стека се извършва от инструкцията lea (Load Effective Address) • Връщани стойности • Използва се регистър EAX (при по-къси стойности, последните се разширяват). ;ако на функция се предава адреса на х (намира се в стека ebp-8) lea eax, [ebp-8] EAXможе да се постави в стека
Интерфейс на Асемблер и С • Извикване на С функции от асемблер • Асемблерният код има достъп до С функции. ;извикване на scanf за четене на цяло число от асемблер ;сегмент данни a dd,0 ;сегмент код . . . lea eax, [ebp-16] push eax push dword a call _scanf add esp, 8 . . . EAXще съдържа връщаната от scanf стойност
Асемблер и C++ - илюстрация на графична програма • Да се съставят клас елипса. Да се предефинира операцията << за визуализиране на обекта елипса в графичен режим,като се използват асемблерни модули (включени във функции на С) за преминаване в графичен режим, изчертаване на точка и изчакване до натискане на клавиш.
Асемблер и C++ - илюстрация на графична програма #include <iostream.h> #include<stdlib.h> #include <math.h> void setgraph()//преминаване в графичен режим { _asm { xor ah,ah //;за функция 00h, INT 10H mov al,12h //;за установяване на графичен режим int 10h //;640х480 16 цвята } } void setpix(int x, int y, int col) //изчертаване на точка { _asm { mov bx,0h mov cx,x mov dx,y mov al,byte ptr col mov ah,0ch int 10h } }
Асемблер и C++ - илюстрация на графична програма void wait() //изчакване натискане на клавиш { _asm { mov ah,08h //;функция 08h, INT 21H int 21h //;чака натискане на клавиш } } class elips { float x,y; int col; int a,b; public: elips(); ~elips() { cout << “destruktor” << endl; } friend ostream &operator << (ostream &t, elips &tmp); }; elips::elips() { do { cout << “vavedi x i y koordinati na centara na elipsata:” cin >> x >> y; }while(x<0 || x>640 || y<0 || y>480);
Асемблер и C++ - илюстрация на графична програма do { cout << “vavedi cviat na elipsa:” cin >> col; }while(col<0 || col>16); do { cout << “vavedi goliama (a) i malka (b) osi na elipsa:” cin >> a >> b; }while(a<0 || a>x/2 || b<0 || b>y/2); } ostream &operator << (ostream &t, elips &tmp) { int a1,b1; setgraph(); for(float i=0;i<360;i+=0.1) { a1 = (tmp.a)*cos(i); b1 = (tmp.b)*sin(i); setpix((tmp.a) – a1,(tmp.b) - b1, tmp.col); setpix((tmp.a) + a1,(tmp.b) + b1, tmp.col); } wait(); return t; }
Асемблер и C++ - илюстрация на графична програма void main() { elips *e = new elips(); cout << e; delete e; }