Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model flat, stdcall
- .xmm
- .data
- .code
- ;szyfruje cezarem. wynik zwraca przez tekst
- EncryptAsm proc uses eax ebx ecx edx tekst:ptr byte, przesuniecie:ptr byte, dlugosc:dword
- mov ecx, przesuniecie ;*przesuniecie w eax
- movups xmm0, [ecx] ;przesuniecie * 16 w xmm0
- mov eax, tekst ;*tekst w eax
- mov ebx, dlugosc ;dlugosc tekstu w ebx
- ;glowna petla. for (i=dlugosc;i>=0;i-=16)
- petla: sub ebx,16 ;ebx=ebx-16
- jz ostatnixmm ;if (ebx=0)
- jnge skonczbezxmm ;if (ebx<0)
- ;else
- movups xmm1,[eax] ;tekst[16] w xmm1
- paddb xmm1,xmm0 ;wynik[16] w xmm1
- movups [eax],xmm1 ;wynik[16] w tekst
- add eax,16 ;adres tekstu +=16
- jmp petla ;skok do petli
- ;dlugosc tekstu jest podzielna przez 16, robimy ostatni xmm i koniec
- ostatnixmm: movups xmm1,[eax] ;tekst[16] w xmm1
- paddb xmm1,xmm0 ;wynik[16] w xmm1
- movups [eax],xmm1 ;wynik[16] w tekst
- ret ;return
- ;po xmmach coś zostało(<16 znaków) więc trzeba zrobić "ręcznie"
- ;for (i=ilezostalo;i>0;i--)
- skonczbezxmm: add ebx,16 ;wcześniej było odjęte, trzeba przywrócić
- petlabexxmm: mov dh,[eax] ;bajt tekstu do DH
- add dh,[ecx] ;szyfruje 1 bajt
- mov [eax], dh ;zapisuje wynik
- inc eax ;inkrementuje adres tekstu
- sub ebx,1 ;i--;
- jnle petlabexxmm ;if (ebx>0) petlabezxmm
- ret ;else return;
- EncryptAsm endp
- ;deszyfruje cezarem. wynik zwraca przez tekst
- DecryptAsm proc uses eax ebx ecx edx tekst:ptr byte, przesuniecie:ptr byte, dlugosc:dword
- mov ecx, przesuniecie ;*przesuniecie w eax
- movups xmm0, [ecx] ;przesuniecie * 16 w xmm0
- mov eax, tekst ;*tekst w eax
- mov ebx, dlugosc ;dlugosc tekstu w ebx
- ;glowna petla. for (i=dlugosc;i>=0;i-=16)
- petla: sub ebx,16 ;ebx=ebx-16
- jz ostatnixmm ;if (ebx=0)
- jnge skonczbezxmm ;if (ebx<0)
- ;else
- movups xmm1,[eax] ;tekst[16] w xmm1
- psubb xmm1,xmm0 ;wynik[16] w xmm1
- movups [eax],xmm1 ;wynik[16] w tekst
- add eax,16 ;adres tekstu +=16
- jmp petla ;skok do petli
- ;dlugosc tekstu jest podzielna przez 16, robimy ostatni xmm i koniec
- ostatnixmm: movups xmm1,[eax] ;tekst[16] w xmm1
- psubb xmm1,xmm0 ;wynik[16] w xmm1
- movups [eax],xmm1 ;wynik[16] w tekst
- ret ;return
- ;po xmmach coś zostało(<16 znaków) więc trzeba zrobić "ręcznie"
- ;for (i=ilezostalo;i>0;i--)
- skonczbezxmm: add ebx,16 ;wcześniej było odjęte, trzeba przywrócić
- petlabexxmm: mov dh,[eax] ;bajt tekstu do DH
- sub dh,[ecx] ;szyfruje 1 bajt
- mov [eax], dh ;zapisuje wynik
- inc eax ;inkrementuje adres tekstu
- sub ebx,1 ;i--;
- jnle petlabexxmm ;if (ebx>0) petlabezxmm
- ret ;else return;
- DecryptAsm endp
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement