Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 14:36   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Стек и исключения

Что происходит с данными в стеке при возникновении исключения. Я имею в виду вот что. При вызове процедуры значения некоторых (используемых) регистров записываются в стек. Перед ret данные из стека вновь заносятся в регистре. Но если вызвать исключение (raise), то дело до POP не дойдет. А если в вызывающей подпрограмме вызов происходил внутри структуры try...except, то значения регистров как-бы можно использовать дальше. Но там ведь будут "левые" значения.
Или я что-то вообще не догоняю?

P.S.: Delphi 7
Sibedir вне форума Ответить с цитированием
Старый 19.04.2011, 21:47   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

компилятор генерирует такой код, что в момент входа в exсept-блок содержимое регистров общего назначения, каким бы оно ни было, абсолютно неважно и не играет никакой роли.
mss вне форума Ответить с цитированием
Старый 20.04.2011, 05:46   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ага, понял. Спасибо.
Тогда если кодишь на basm, то лучше с try...except не связываться?
Sibedir вне форума Ответить с цитированием
Старый 20.04.2011, 10:39   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Обработка исключений обязана быть предусмотрена в любом случае.
И BASM здесь ни причем.
mss вне форума Ответить с цитированием
Старый 20.04.2011, 14:24   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да я имел в виду типа того
Код:
  try
    asm
      ...
    end;
  except
    on TMyException do asm
      ...
    end;
  end;
Надо было сказать:
Если есть try...except, то с basm лучше не связываться?

Хотя впринципе теперь и сам понимаю, что вопрос был излишним. Во-первых, скорость. Во-вторых, try...except обычно в основную вызывающую процедуру ставится, ну например, что-бы известить пользователя, что что-то не так. И basm там совсем не нужет (в 99,999999999999% случаях).

Последний раз редактировалось Sibedir; 20.04.2011 в 14:29.
Sibedir вне форума Ответить с цитированием
Старый 20.04.2011, 15:08   #6
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Добавьте сюда и то, что в готовящейся 64-битной версии компилятора на асемблере можно писать только всю процедуру целиком. Смешанный код там не поддерживается.
eduard93 вне форума Ответить с цитированием
Старый 20.04.2011, 15:34   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Перед ret данные из стека вновь заносятся в регистре. Но если вызвать исключение (raise), то дело до POP не дойдет. А если в вызывающей подпрограмме вызов происходил внутри структуры try...except, то значения регистров как-бы можно использовать дальше. Но там ведь будут "левые" значения.
Или я что-то вообще не догоняю?
Непонятно, что смущает. Если возникло исключение - это значит, что функция не была выполнена (не выполнена до конца). И как в результирующем регистре у вас может оказаться осмысленное (не "левое") значение? Никак. Ну, пока компьютеры не научатся путешествовать во времени или иметь телепатические способности, конечно же.

Более того, это не должно вас волновать, поскольку код анализа возвращаемого функцией значения тоже не будет выполнен - ведь возникло исключение и управление получит обработчик в finally или except: а он никакого отношения к функции не имеет.

Так что осмысленное там значение или нет - должно быть пофиг.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.04.2011, 20:28   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну примерно вот так я думал:
Код:
function MainProc (i: Integer): Integer;
var
  a, b, c: Integer;
begin
  a := i;
  b := a;
  c := b;
  if i <= 0 then
    raise TMyException.Create ('')
  else begin
    Result := i+a+b+c;
  end;
end;

procedure Mes1 (i: Integer);
begin
  ShowMessage ('Имеем ' + IntToStr(i));
end;

procedure Mes2 (i: Integer);
begin
  ShowMessage (IntToStr(i) + ' совсем не годится');
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: Integer;
begin
// --------------------------------- 1
  b := $00001111;
  a := 1;
  a := MainProc (a);
  Mes1 (b);

// --------------------------------- 2
  b := $11110000;
  a := -1;
  try
    a := MainProc(a);
    Mes1 (b);
  except
    on TMyException do Mes2 (b);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// --------------------------------- 1
  asm
    push $00001111       // что-то попало в стек
    mov eax, $00000001   // ...
    call MainProc        // вызываем MainProc (ошибки не будет, я уверен)
    pop eax              // это "что-то из стека" теперь понадобилось
    call Mes1            // ...

// --------------------------------- 2
    push $11110000       // что-то попало в стек
    mov eax, $FFFFFFFF   // ...
  end;
  try                    // а вдруг чего
    asm
      call MainProc      // вызываем MainProc (может быть ошибка, но я не уверен)
                         // Хотя на самом-то деле в EAX сейчас 0
      pop eax            // это "что-то из стека" понадобилось снова
      call Mes1          // ...
    end;
  except
    on TMyException do   // если всё-таки это случилось
    asm
      pop eax            // это "что-то из стека" нам и тут нужно
      call Mes2          // ...
    end; // и тут он такой БА-БАХ (см. скрин) (как я понял - при попытке уничтожения исключения)
  end;
end;
Безымянный.jpg

Покурил малость asm-код, который создает delphi при try. Чёт стало понятнее. Там действительно
Цитата:
компилятор генерирует такой код, что в момент входа в exсept-блок содержимое регистров общего назначения, каким бы оно ни было, абсолютно неважно и не играет никакой роли.
Он там походу не ч/з регистры, а ч/з память работает. Но ясно одно TRY и BASM - еще тот компот.

Цитата:
Так что осмысленное там значение или нет - должно быть пофиг.
Да. Буду стараться, чтобы в finally или except мне было пофиг, что в регистрах и стеке.

Последний раз редактировалось Sibedir; 20.04.2011 в 20:41.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключения в Qt iukash Qt и кроссплатформенное программирование С/С++ 6 16.04.2011 18:54
Исключения C++ Impuls1989 Помощь студентам 2 04.03.2011 00:51
Исключения в Visual C++ _Mixer_ Visual C++ 10 19.01.2011 23:12
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29