RSS Feed

Use the stack , Luke !

December 23rd, 2007

Lucrez de foarte putin timp timp in ASM si , cum imi sta mie mai bine, imi place sa ma complic al naibii de tare cand rezolv o problema... de exemplu, azi m-am gandit la urmatoarea problema in ASM : se da un vector de numere intregi. Sa se scrie o functie in ASM care inverseaza elementele vectorului .
Ok . Bag in registrul eax adresa elementului curent, calculez cati bytes trebuie sa sar ca sa ajung la ultimul element, fac o bucla, sar la elementul al doilea, calculez cati bytes am nevoie sa sar la penultimul ... etc., nervi, pana la urma adaug un sub edx,ecx ... minune, merge. De ce? Nu ma mai intereseaza... Merge si atat. Iata minunatul cod:

C++:
  1. void inversare(int*,int)
  2. {
  3.     _asm
  4.     {
  5.         mov ecx,0
  6.         mov ebx,[ebp+12]
  7.         shr ebx,1
  8.         dec ebx
  9. bucla:
  10.         mov eax,[ebp+8]
  11.        
  12.         push ecx
  13.         shl ecx,2
  14.         add eax,ecx
  15.         pop ecx
  16.        
  17.         mov edx,[ebp+12]
  18.         dec edx
  19.         sub edx,ecx
  20.         sub edx,ecx
  21.         shl edx,2
  22.  
  23.         push eax
  24.         add eax,edx
  25.         mov edx,eax
  26.         pop eax
  27.  
  28.         push dword ptr [eax]
  29.         push dword ptr [edx]
  30.         pop dword ptr [eax]
  31.         pop dword ptr [edx]
  32.    
  33.         cmp ecx,ebx
  34.         jne continua
  35.         cmp ecx,ebx
  36.         je stop
  37. continua:
  38.          inc ecx
  39.          jmp bucla
  40. stop:
  41.     }
  42. }

Ok... , ma minunam si eu de cat de frumos e codul asta ... ma simteam mandru... USE THE STACK LUKE... mi-am adus aminte de Star Wars ... si de o mica chestie numite STIVA... care avea interesenta proprietate ca ultimul intrat era primul iesit . Sa vezi si sa nu crezi ... exact ce-mi trebuia mie . :)) Mi-am tras o palma peste cap, am pornit alt proiect, am scris repede codul, a rezultat cel de mai jos. Elegant, simplu, fara shiftari de biti sau alte magarii ...

C++:
  1. void inverseaza2(int*,int)
  2. {
  3.     _asm
  4.     {
  5.         mov eax,[ebp+8]
  6.         mov ecx,[ebp+12]
  7.         mov edx,0
  8. bucla:
  9.         cmp edx,ecx
  10.         je final
  11.         push dword ptr [eax]
  12.         add eax,4
  13.         inc edx
  14.         jmp bucla
  15. final:
  16.         mov eax,[ebp+8]
  17.         mov edx,0
  18. bucla2:
  19.         cmp edx,ecx
  20.         je final2
  21.         pop dword ptr [eax]
  22.         add eax,4
  23.         inc edx
  24.         jmp bucla2
  25. final2:
  26.     }
  27. }

De acum incolo voi folosi stiva !
De acum incolo voi folosi stiva !
De acum incolo voi folosi stiva !
De acum incolo voi folosi stiva !
De acum incolo voi folosi stiva !
De acum incolo voi folosi stiva !

Leave a reply...