Assembler w delphi...

0

Witam!

To pytanie, mimowszystko dotyczy delphi... ;-)

Napisałem taką procedure

var s,pass:string;
   lng:cardnial;
begin
 s:=edit1.Text;
 pass:=edit2.Text;
  asm
   mov edx, pass    // zmienna z haslem do edx
   cmp edx,0           // jesli nie ma hasla, to wyjdz
   je @koniec          //
   mov eax, [edx-4] //
   mov lng, eax     // dlugosc hasla do zmiennej
   add lng, edx        // do zmiennej koniec hasla
   mov eax, s       // tekst do eax
   cmp eax,0           // jesli nie ma tekstu, to wyjdz
   je @koniec          //
   push ebx         // ebx na stos
   mov ebx, [eax-4]    //
   add ebx, eax        // koniec tekstu do ebx
   jmp @petla
   @zeruj:
    mov edx, pass   // ustawienie na poczatek hasla
    ret
   @petla:
    mov cl, [eax]   // odczytanie bajtu tekstu
    xor cl, [edx]   // szyfrowanie
    mov [eax], cl   // zapisanie zaszyfrowanego bajtu
    inc edx         // ustawienie na nastepny bajt hasla
    inc eax         //    -||-   -||-  -||-   -||- tekstu
    cmp edx,lng     // sprawdzanie, czy koniec hasla
    call @zeruj     // jesli tak, to ustaw na jego poczatek
    cmp eax,ebx     // sprawdzanie, czy koniec tekstu
    jne @petla      // jesli nie, to szyfruj dalej
   pop ebx          // przywroc ebx
   @koniec:
  end;
 edit1.Text:=s;
 edit2.text:=pass;
end;

Wszystko jest ok (nawet dziala :]), tylko że chciałbym z tego zrobić procedure...
Jak to zrobić?? (czytałem kurs asmindelphi, ale nie znalazlem odpowiedzi)

Z góry wielkie dzieki za pomoc!

0

E... a nie mozna po prostu dodac na poczatku

procedure JakasProcedura;

?

0

No prawie :)
Ale jak zrobie:

procedure XorStr(var s:string;pass:string);
asm
...
...
...
end;

To wyskakuje pare błędów...

0

Napisałem taką procedure
(...)
Wszystko jest ok (nawet dziala :]), tylko że chciałbym z tego zrobić procedure...

To w koncu jak to jest? Masz ta procedure czy nie? :)
Tak jak napisane bylo. Dodaj naglowek bedzie procedura. Nie dodasz jej to nie bedzie procedury (chociaz widze, ze i tak raczej jest, bo w delphi tylko w dpr moglbys bez naglowka napisac tak).

0

Tzn: chodzi mi o to jak napisac procedure, ktora bylaby w formie

procedure XorStr(var s:string;pass:string);
asm
...
end;

To, co napisałem na poczatku nie działa, jeśli s jest przekazywane jako parametr procedury! Czyli jeśli walne to co tam na górze w te tu 3 kropeczki wyżej, to wyskakują access violation

0
procedure P(s, pass: string);
   lng:cardnial;
begin
  asm
   mov edx, pass    // zmienna z haslem do edx
   cmp edx,0           // jesli nie ma hasla, to wyjdz
   je @koniec          //
   mov eax, [edx-4] //
   mov lng, eax     // dlugosc hasla do zmiennej
   add lng, edx        // do zmiennej koniec hasla
   mov eax, s       // tekst do eax
   cmp eax,0           // jesli nie ma tekstu, to wyjdz
   je @koniec          //
   push ebx         // ebx na stos
   mov ebx, [eax-4]    //
   add ebx, eax        // koniec tekstu do ebx
   jmp @petla
   @zeruj:
    mov edx, pass   // ustawienie na poczatek hasla
    ret
   @petla:
    mov cl, [eax]   // odczytanie bajtu tekstu
    xor cl, [edx]   // szyfrowanie
    mov [eax], cl   // zapisanie zaszyfrowanego bajtu
    inc edx         // ustawienie na nastepny bajt hasla
    inc eax         //    -||-   -||-  -||-   -||- tekstu
    cmp edx,lng     // sprawdzanie, czy koniec hasla
    call @zeruj     // jesli tak, to ustaw na jego poczatek
    cmp eax,ebx     // sprawdzanie, czy koniec tekstu
    jne @petla      // jesli nie, to szyfruj dalej
   pop ebx          // przywroc ebx
   @koniec:
  end;
end;

Przypisanie ponowne do editow musisz recznie zrobic (to sa elementy klasy i nie mozna ich zmienic bezposrendnio). Ja co prawda bym to troszke inaczej robil... ale nie mam czasu kiedy pisac.

0

Wielkie dzięki :D
PS: już chyba zaczaiłem, o co w tym wszystkim chodzi :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0