Use the stack , Luke !
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:
-
void inversare(int*,int)
-
{
-
_asm
-
{
-
mov ecx,0
-
mov ebx,[ebp+12]
-
shr ebx,1
-
dec ebx
-
bucla:
-
mov eax,[ebp+8]
-
-
push ecx
-
shl ecx,2
-
add eax,ecx
-
pop ecx
-
-
mov edx,[ebp+12]
-
dec edx
-
sub edx,ecx
-
sub edx,ecx
-
shl edx,2
-
-
push eax
-
add eax,edx
-
mov edx,eax
-
pop eax
-
-
push dword ptr [eax]
-
push dword ptr [edx]
-
pop dword ptr [eax]
-
pop dword ptr [edx]
-
-
cmp ecx,ebx
-
jne continua
-
cmp ecx,ebx
-
je stop
-
continua:
-
inc ecx
-
jmp bucla
-
stop:
-
}
-
}
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 ...
-
void inverseaza2(int*,int)
-
{
-
_asm
-
{
-
mov eax,[ebp+8]
-
mov ecx,[ebp+12]
-
mov edx,0
-
bucla:
-
cmp edx,ecx
-
je final
-
push dword ptr [eax]
-
add eax,4
-
inc edx
-
jmp bucla
-
final:
-
mov eax,[ebp+8]
-
mov edx,0
-
bucla2:
-
cmp edx,ecx
-
je final2
-
pop dword ptr [eax]
-
add eax,4
-
inc edx
-
jmp bucla2
-
final2:
-
}
-
}
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 !