Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Помогите найти Ошибку!!!!!!!!!!!!!!!!!!!!!!   Найти похожие ветки 

 
4ert   (2006-12-29 03:48) [0]

Здравтсвуйте Уважаемые Мастера!!!!!!!!!!!!!!!!!!!
Помогите найти ошибку в следующем коде:


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
const
 MaxParam = 32;
implementation

{$R *.dfm}

function f2(a:pointer):integer; assembler;
asm
 push edi
 push esi
 mov ecx,MaxParam*4
 sub esp,ecx
 mov edi,esp
 lea esi,[ebp+8]
 rep movsd
 lea edi,[esp+MaxParam*4]
 call eax
 mov esp,edi
 pop edi
 pop esi
end;

function f1(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
var
 a: pointer;
begin
 a:=@MessageBoxA;
 f2(a);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
f1(0,"TEST","HEAD",MB_OK);
end;

end.


В результате нажатия на Button1 я, таки, вижу MessageBox с кнопкой Ok заголовком HEAD и текстом TEST, но при нажатии на кнопку OK ловлю следующее сообщение:


Project Project1.exe raised exception class EAccessViolation with message "Access Violation at address 001703CA read of address 001703CA". Process stopped.


Честно говоря, assemblerna`я вставка не моя, и я почти не знаком с этим без сомнений замечательным языком, поэтому найти ошибку  просто не в состоянии, вот и прошу, нет, молю!!!!!!!!!!!
Помочь мне исправить этот код....

Заранее спасибо!!!!!


 
4ert   (2006-12-29 04:00) [1]

сорри функция выглядет так:


function f2(a:pointer):integer; assembler;
asm
 push edi
 push esi
 mov ecx,MaxParam*4
 sub esp,ecx
 mov edi,esp
 lea esi,[ebp+8]
 rep movsd
 lea edi,[esp+MaxParam*4]
 call eax
 mov esp,edi
 pop esi
 pop edi
end;


 
Котик Б   (2006-12-29 09:10) [2]

Вот одного не пойму... чего ты у нас спрашиваешь ? Спроси у автора кода...


 
Elen ©   (2006-12-29 09:16) [3]


> 4ert

А чего б не посмотреть как это делфийский дебугер делает. и кстати, зачем тебе это именно функцией описывать?, помоему ты из стека по окончании выполнения не весь мусор выбрал.


 
Elen ©   (2006-12-29 09:28) [4]


> 4ert

Вот как делает отладчик делфи :

unit Unit1;

interface

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

type
TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
Form1: TForm1;
const
MaxParam = 32;
implementation

{$R *.dfm}

function f1(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
var mb:pointer;
begin
mb:=@messageboxA;
asm
mov eax,[ebp+$14]
push eax
mov eax,[ebp+$10]
push eax
mov eax,[ebp+$0c]
push eax
mov eax,[ebp+$08]
push eax
call mb
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
f1(0,"TEST","HEAD",MB_OK);
end;

end.


а ты помоему с функциями переборщил.


 
evvcom ©   (2006-12-29 09:35) [5]

Такие вещи отладчиком проверяют. Это гораздо проще. Но на первый взгляд, по-моему, так:
mov ecx,MaxParam*4
sub esp,ecx

резервируешь под 32 параметра 32*4 байта
mov edi,esp
lea esi,[ebp+8]
rep movsd

Во-первых, перед movsd немешало бы удостовериться, что копирование будет идти в нужном направлении (по-моему это cld и std);
Во-вторых, ты копируешь ecx раз по 4 байта, т.е. 32*4*4, тем самым затирая в стеке больше, чем там зарезервировал своим sub esp,ecx. Т.е. надо либо shr ecx,2, либо movsb, но лучше первое.
Отладчиком пройдись.



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
2-1167032516
KyRo
2006-12-25 10:41
2007.01.21
Подскажите как сделать DBGrid без скролов


15-1167239507
oldman
2006-12-27 20:11
2007.01.21
Мама, я очень болен. Мама, нас лечат не те врачи... (Чиж ©)


15-1167137406
AntiUser
2006-12-26 15:50
2007.01.21
Разработчики Firefox не смогли устранить ошибки при работе в ...


15-1167383931
Ega23
2006-12-29 12:18
2007.01.21
C НАСТУПАЮЩИМ, КОЛЛЕГИ!!!


5-1146937627
w!zard
2006-05-06 21:47
2007.01.21
Значение строки в listbox