Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.12.2006, 05:30
4ert 4ert вне форума
Прохожий
 
Регистрация: 29.12.2006
Сообщения: 1
Репутация: 10
По умолчанию Помогите найти Ошибку!!!!!!!!!!!!!!!!!!!!!!

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


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(aointer):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;

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`я вставка не моя, и я почти не знаком с этим без сомнений замечательным языком, поэтому найти ошибку просто не в состоянии, вот и прошу, нет, молю!!!!!!!!!!!
Помочь мне исправить этот код....

Заранее спасибо!!!!!
Ответить с цитированием
  #2  
Старый 29.12.2006, 16:56
Аватар для Ross
Ross Ross вне форума
Активный
 
Регистрация: 15.10.2005
Адрес: Казань
Сообщения: 250
Репутация: 30
По умолчанию

А что делает тот асемблерский код? Может легкче переделать на обычные паскалевские строчки? Что там? (Я то же не знаком ассемблером)
Ответить с цитированием
  #3  
Старый 29.12.2006, 20:44
Hedgehog77 Hedgehog77 вне форума
Прохожий
 
Регистрация: 29.12.2006
Сообщения: 3
Репутация: 10
По умолчанию С Наступающим!

Привет 4ert! Привет ROSS! 4ert, y тебя ассемблерный код копирует стек с теми самыми 4-мя параметрами от f1, только команда MOVSD копирует по 4 байта в ECX раз... То есть, ты затираешь собственный стек на выходе из f2, вызов окошка проходит на уря, а потом кирдык Попробуй заменить на MOVSB (побайтно)...
Ответить с цитированием
  #4  
Старый 29.12.2006, 20:47
Аватар для Ross
Ross Ross вне форума
Активный
 
Регистрация: 15.10.2005
Адрес: Казань
Сообщения: 250
Репутация: 30
По умолчанию

А зачем использовать асемблер для копирования стека, почему нельзя создать цикл по копированию стека? Ведь это не сложно.
Ответить с цитированием
  #5  
Старый 29.12.2006, 21:08
Hedgehog77 Hedgehog77 вне форума
Прохожий
 
Регистрация: 29.12.2006
Сообщения: 3
Репутация: 10
По умолчанию

Для начала - мне вообще непонятно, зачем так мучаться... Но если надо, то здесь как раз лучше использовать ассемблер. Хотя... Кому как нравится. Всё верно, можно было бы и простой цикл организовать, если, конечно, знать как работает стек (а это опять таки знание ассемблера, увы).
Ответить с цитированием
  #6  
Старый 29.12.2006, 21:12
Hedgehog77 Hedgehog77 вне форума
Прохожий
 
Регистрация: 29.12.2006
Сообщения: 3
Репутация: 10
По умолчанию

Упс, чей-то я не то замутил: никогда не пробовал управлять стеком средствами Делфи, так что, похоже, здесь тока ассемблер, всё правильно...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter