Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.042 c
2-1167283740
Sw
2006-12-28 08:29
2007.01.21
поле типа AsDateTime


2-1167860535
KIT
2007-01-04 00:42
2007.01.21
Подскажите пожалуйста


15-1167581198
Pazitron_Brain
2006-12-31 19:06
2007.01.21
Не удаляйте мои темы


2-1167194715
karton
2006-12-27 07:45
2007.01.21
Как нарисовать на форме поверх всех контролов


15-1167323894
oldman
2006-12-28 19:38
2007.01.21
С Новым Годом...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский