0% au considerat acest document util (0 voturi)
62 vizualizări5 pagini

SMP Lab 5

Documentul prezintă modul de creare a unui proiect în limbaj de asamblare sub Visual Studio, includerea de funcții C în codul asamblator și utilizarea codului asamblator în proiecte C/C++. Sunt oferite exemple de programe care ilustrează conceptele prezentate.

Încărcat de

Andrei Stelea
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
62 vizualizări5 pagini

SMP Lab 5

Documentul prezintă modul de creare a unui proiect în limbaj de asamblare sub Visual Studio, includerea de funcții C în codul asamblator și utilizarea codului asamblator în proiecte C/C++. Sunt oferite exemple de programe care ilustrează conceptele prezentate.

Încărcat de

Andrei Stelea
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 5

Laborator 5 Programarea microprocesoarelor pe 32 bii MASM & Visual Studio

Scrierea unui proiect n limbaj de asamblare sub Visual Studio 2010


Asamblorul MASM este parte a mediului de dezvoltare Visual Studio. Cu toate acestea Visual Studio nu pune la dispoziia programatorului un ablon (template) de proiect specific MASM. Pentru a realiza un proiect n limbaj de asamblare trebuie urmai urmtorii pai: Se selecteaz New Project / Other Language / Visual C++ / Empty Project ; se alege numele proiectului i calea unde urmeaz a fi salvat. n Solution Explorer se face click-dreapta pe numele proiectului i se acceseaz Build Customization; se selecteaz opiunea de masm i se d OK. Se face click-dreapta n Solution Explorer pe Source Files i se selecteaz Add / New Item / Text File (.txt); numele noului fiier trebuie s fie .asm (main.asm de exemplu). n fiierul main.asm se completeaz urmtorul schelet (structur minimal obligatorie): .model flat .code main proc ret main endp end n Solution Explorer se face click-dreapta pe numele proiectului i se acceseaz Linker / Advanced / Entry Point i se completeaz numele procedurii principale din program (n cazul exemplului anterior main).

Exemplu de program: .386 .model flat .data num1 sdword ? num2 sdword ? .code main proc mov num1,5 mov eax,num1 mov num2,eax

Sisteme cu microprocesoare ret main endp end

http://smp.aii.pub.ro

Sarcin de lucru: Rulai exemplul precedent pas cu pas (Debug/Step Into sau F11) i vizualizai coninutul registrelor i a memoriei (Debug/Windows). Plecnd de la exemplul anterior scriei un program care s realizeze nmulirea a dou matrice.

Includerea unor funcii sau proceduri C n limbaj de asamblare


Pentru a simplifica anumite operaii cu perifericele din sistem (citirea de la tastatur, afiarea pe ecran) muli autori apeleaz n limbaj de asamblare la diverse biblioteci de funcii predefinite (de exemplu irvine.inc sau HLA library). n cazul n care utilizm MASM sub Visual Studio o soluie mult mai elegant pentru aceste operaii este invocarea unor funcii ale limbajului C. Acest lucru este posibil utiliznd directivele PROTO i INVOKE: label PROTO [distance] [langtype] [,[parameter]:tag] INVOKE label [,arguments] Exemplu de program (Hello World!): .386 .model flat, c .stack 100h printf PROTO arg1:Ptr Byte .data msg1 byte "Hello World!",0Ah,0 .code main proc INVOKE printf, ADDR msg1 ret main endp end Pentru a putea accesa funcia printf este necesar s indicm mediului de dezvoltare includerea bibliotecii msvcrt.lib care conine funcia. Acest lucru se face prin click-dreapta pe numele proiectului / Properties / Linker / Input / Additional Dependencies i adugarea msvcrt.lib . Exemplu de program (scanf & printf):

Sisteme cu microprocesoare

http://smp.aii.pub.ro

.386 .model flat, c .stack 100h printf PROTO arg1:Ptr Byte, printlist:VARARG scanf PROTO arg2:Ptr Byte, inputlist:VARARG .data in1fmt byte "%d",0 msg1fmt byte 0Ah,"%s%d",0Ah,0Ah,0 msg1 byte "The number is: ",0 number sdword ? .code main proc INVOKE scanf, ADDR in1fmt, ADDR number INVOKE printf, ADDR msg1fmt, ADDR msg1, number ret main endp end

Sarcin de lucru: Rulai cele dou exemple precedente i nelegei modul de funcionare. Completai sarcina de lucru precedent (program nmulire dou matrice) prin adugarea prii de interaciune cu utilizatorul (se vor citi de la tastatur: dimensiunea matricelor, matricele i se va afia matricea rezultat).

Utilizarea limbajului de asamblare n proiecte C/C++


Codul scris n limbaj de asamblare poate fi inclus n proiecte scrise n limbaje de nivel nalt, de exemplu n proiecte C/C++. Exist dou variante pentru a face acest lucru: intercalarea de cod assembler n funciile scrise n C/C++ utiliznd directiva _asm sau scrierea unor obiecte n limbaj de asamblare pe care le vom utiliza n programele scrise n limbaje de nivel nalt. Exemplu de program (iniializarea i afiarea unui vector n C): #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { int vect[10]; for(int i=0; i<10; i++) { vect[i]=i; } for(int i=0; i<10; i++) { printf("vect[%d]=%d\n",i,vect[i]); } getchar(); return 0; }

Sisteme cu microprocesoare

http://smp.aii.pub.ro

Sarcin de lucru: nlocuii primul ciclu for din exemplul anterior cu urmtoarea secven de instruciuni n asamblare i observai modul de execuie. Comparai codul de asamblare generat de compilatorul de C fa de codul dat ca exemplu. _asm { MOV ECX,10 LEA EDI, vect MOV EBX,10 SUB EBX,ECX MOV [EDI],EBX ADD EDI,4 LOOP BUCLA

BUCLA:

} Exemplu program (inversarea unui ir de caractere apel procedur limbaj asamblare): Program C (proiect consol / Empty Project) #include <stdio.h> extern "C" void Reverse(char *); char chararray[17] = "So what is this?"; int main() { printf ("%s \n", chararray); Reverse (chararray); printf ("%s\n", chararray); getchar(); return 0; } Program ASM .586 .model flat, C .stack 1024 .code public Reverse Reverse proc uses esi, arraychar:ptr mov esi,arraychar mov eax,0 push eax .repeat mov al,[esi]

Sisteme cu microprocesoare push eax inc esi .until byte ptr [esi] == 0 mov esi,arraychar .while eax != 0 pop eax mov [esi],al inc esi .endw ret Reverse endp end Sarcin de lucru:

http://smp.aii.pub.ro

Rulai exemplul precedent i ncercai s rspundei la urmtoarele ntrebri: La ce este folosit stiva n procedura Reverse? Ce reprezint cuvintele cheie .repeat, .until, .while, .endw?

S-ar putea să vă placă și