błąd w kodzie

bodziulla

Użytkownik
Dołączył
Luty 7, 2009
Posty
1
Witam.Mam prośbę a zarazem pytanie.Otóż mam do zrobienia program w połowie w Delphi a w połowie w asm tzn kod szyfrujący i deszyfrujący ma być w asmie ( kod dotyczy szyfrowania XOR), ale szkielet programu mogłem zrobić w Delphi.Zrobiłem właśnie program, ale przy szyfrowaniu zdjęcia wyskakuje mi błąd podczas szyfrowania "Scan line index out of range".Nie wiem właśnie gdzie robię błąd i gdzie owy błąd jest???

Oto kod


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, jpeg;

type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Button1: TButton;
Label3: TLabel;
Edit1: TEdit;
Button3: TButton;
OpenPictureDialog1: TOpenPictureDialog;
Label2: TLabel;
SaveDialog1: TSaveDialog;
Button4: TButton;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}
var

img_path: string;
img_key: string;
img_loaded: integer;
key: byte;

procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then begin
img_path:=OpenPictureDialog1.FileName;
Label2.Caption:=img_path; // wczytanie sciezki pliku do etykiety po otwarciu
Label1.Visible:=true; // ustawienie widocznosci etykiety
Image1.Picture.LoadFromFile(img_path); // zaladowanie zdjecia
img_loaded:=1;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if SaveDialog1.Execute then begin
Image1.Picture.SaveToFile(SaveDialog1.FileName);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
img_width,img_height,i,j,keylen: integer;
is24bit: byte;
img_ptr: PByteArray;
begin
is24bit:=0; // inicjalizacja
key:=0; // inicjalizacja
// Najpierw sprawdzenie, czy plik jest już załadowany
img_key:=Edit1.Text;
keylen:=length(img_key);
if(keylen<8) then begin
for i:=keylen to 8 do
img_key:='0'; // Dopelnianie klucza 'zerami' ;p
end;
if (keylen>8) then // skrocenie klucza
img_key:=Copy(img_key,1,8);

asm
push eax // zachowujemy na stos ( na wszelki wypadek )
push ecx // uzywane rejestry
push ebx
push esi

mov bh,128
mov bl,2
mov ecx,8
@@next_bit_generate:
mov al, byte ptr img_key[esi]
xor ah,ah // zerujemy ah
div bl
cmp ah,1 // czy reszta == 1
je @@set_one // ustawimy bit w zmiennej key
jmp @@after_set // przeskok nad kodem ustawiajacym bit.
@@set_one:
or key,bh
@@after_set:
shr bh,1
inc esi
loop @@next_bit_generate

// przywrocenie rejestrow ze stosu
pop esi
pop ebx
pop ecx
pop eax
end;
ShowMessage('Klucz to '+inttostr(key));
if(img_loaded=0) then begin // jesli nie zaladowano
ShowMessage('Nie wczytano pliku obrazu.');
exit;
end;
// Sprawdzenie ilosci bitow na piksel
if Image1.Picture.Bitmap.PixelFormat=pf8bit then begin
is24bit:=0;
ShowMessage('8 bit');
end;
if Image1.Picture.Bitmap.PixelFormat=pf24bit then begin
is24bit:=1;
ShowMessage('24 bit');
end;
// Zmienne pomocnicze do petli
img_height:=Image1.Height-1;
img_width:=Image1.Width-1;

ShowMessage('Wysokosc bitmapy: '+inttostr(img_height)+', szerokosc: '+inttostr(img_width)+'.');
for i:=1 to img_height do begin
img_ptr:=Image1.Picture.Bitmap.ScanLine;
asm
push eax
push ecx
push esi

mov ecx,img_width
xor esi,esi
mov [key],ah
cmp is24bit,1
je @@encode_next_cell24
@@encode_next_cell8:

xor byte ptr img_ptr[esi],ah
inc esi
loop @@encode_next_cell8
jmp @@after_loops

@@encode_next_cell24: // wersja dla 24
xor byte ptr img_ptr[esi],ah // xor na kolejnych skladowych piksela
xor byte ptr img_ptr[esi+1],ah // R, G, B
xor byte ptr img_ptr[esi+2],ah
add esi,3 // zwiekszenie esi o 3
@@after_loops:


pop esi
pop ecx
pop eax
end;
end;
Image1.Refresh;
if Button1.Caption='Szyfruj' then Button1.Caption:='Deszyfruj'
else
Button1.Caption:='Szyfruj';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// Sprawdzenie, czy w ogole cos wczytano
if(img_loaded=0) then begin
ShowMessage('Nie wczytano pliku obrazu.');
exit;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
img_loaded:=0;
end;

end.
 
Do góry Bottom