Главная страница
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.053 c
15-1167818363
$Pl@Sh
2007-01-03 12:59
2007.01.21
Смайлики


2-1167914494
Sholah_Weras
2007-01-04 15:41
2007.01.21
Новые объекты в TreeView.


2-1166968934
Wahnsinng
2006-12-24 17:02
2007.01.21
Копировать на FTp


1-1164810385
zdm
2006-11-29 17:26
2007.01.21
Свернуть форму


15-1167295202
root
2006-12-28 11:40
2007.01.21
Kylix