1 / 9

Интерфейс на Асемблер и С

Интерфейс на Асемблер и С. Използват се два начина: Извикване на асемблерна подпрограма от програма на С. Поставяне на асемблерни инструкции директно в програмата на С.

calum
Download Presentation

Интерфейс на Асемблер и С

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Интерфейс на Асемблер и С • Използват се два начина: • Извикване на асемблерна подпрограма от програма на С. • Поставяне на асемблерни инструкции директно в програмата на С. • Неудобство: асемблерният код трябва да бъде във формат, който използва компилатора. Borland изисква MASM формат. Няма компилатор за NASM формат. • Асемблерни подпрограми • За директен достъп до хардуерни компоненти • За оптимизация (бърза и ефективна обработка)

  2. Интерфейс на Асемблер и С • Асемблерни подпрограми - някои съображения при използването им: • Регистри • С предполага, че подпрограмата подържа: EBX, ESI, EDI, CS, DS, SS, ES и трябва да ги възстановява преди връщане. • Етикети • Повечето С компилатори изискват _f(ако f е функция или глобална променлива) • Параметри • Според С параметрите на функциите се поставят в стека в обратен ред.

  3. Интерфейс на Асемблер и С • Адреси на локални променливи • Намирането на адреса от сегмента за данни или стековия се прави от свързващия редактор. • Изчисляването на адреса на локална променлива или параметър, намиращи се в стека се извършва от инструкцията lea (Load Effective Address) • Връщани стойности • Използва се регистър EAX (при по-къси стойности, последните се разширяват). ;ако на функция се предава адреса на х (намира се в стека ebp-8) lea eax, [ebp-8] EAXможе да се постави в стека

  4. Интерфейс на Асемблер и С • Извикване на С функции от асемблер • Асемблерният код има достъп до С функции. ;извикване на scanf за четене на цяло число от асемблер ;сегмент данни a dd,0 ;сегмент код . . . lea eax, [ebp-16] push eax push dword a call _scanf add esp, 8 . . . EAXще съдържа връщаната от scanf стойност

  5. Асемблер и C++ - илюстрация на графична програма • Да се съставят клас елипса. Да се предефинира операцията << за визуализиране на обекта елипса в графичен режим,като се използват асемблерни модули (включени във функции на С) за преминаване в графичен режим, изчертаване на точка и изчакване до натискане на клавиш.

  6. Асемблер и 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 } }

  7. Асемблер и 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);

  8. Асемблер и 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; }

  9. Асемблер и C++ - илюстрация на графична програма void main() { elips *e = new elips(); cout << e; delete e; }

More Related