SMP Lab 5
SMP Lab 5
Exemplu de program: .386 .model flat .data num1 sdword ? num2 sdword ? .code main proc mov num1,5 mov eax,num1 mov num2,eax
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.
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).
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?