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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2016, 22:55   #1
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию Как написать процедуру без пролога и эпилога

Пишу процедуру такого вида, но из-за наличия "begin-end;" компиллятор иногда, редко, создает пролог, а уж эпилог так это всегда. Поэтому команды "push-pop" внутри асм-вставок нарушают правильное выполнение процедуры. Вся байда у меня в том, что мне надо обязательно сохранить и потом восстановить регистр состояния (pushad-popad не обязательные, но желательные команды). Как заставить компиллятор не создавать пролог и эпилог в этой процедуре?
Цитата:
Код:
Procedure MyProc;
begin
  asm
    pushfd;
    pushad;
  end;
    ....... мой код на Делфи .....
  asm
    popad;
    popfd;
  end;
end;
Ну или как внутрь такой асм-процедуры, вставить делфийский код?
Цитата:
Код:
Procedure MyProc; Assembler;
asm
  pushfd;
  pushad;
    ....... мой код на Делфи .....
  popad;
  popfd;
end;
Kuzya69 вне форума Ответить с цитированием
Старый 27.08.2016, 23:23   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используйте второй вариант, а ваш код вынесите в отдельную процедуру и просто вызывайте ее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2016, 23:32   #3
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Это конечно ответ. Но...
Я не стал писать весь код, надеясь получить ответ на МОЙ вопрос.
В моем делфийском коде есть как-бы два выхода, и поэтому концовка асм-кода будет в первом случае такая как я привел, во втором, я сначала изменю регистры в стеке которые загнал туда командой pushad, а потом закончу стандартный код. Тут тогда появляется еще куча вопросов.
1. Как изменить стек в вынесенной процедуре? Ведь там точно появится эпилог и/или пролог.
2. Или как сделать два выхода из процедуры?

Последний раз редактировалось Kuzya69; 27.08.2016 в 23:37.
Kuzya69 вне форума Ответить с цитированием
Старый 27.08.2016, 23:41   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Пролог и эпилог генерируются вместе. Всегда в зависимости от наличия параметров и локальных переменных. Хотите без эпилога и пролога. Убирайте локальные переменные и параметры.
Что касатеся 2-х выходов. Так возьмите и сделайте в чём вопрос?
jmp и goto вам в помощь.
Концовку формируете вручную.
Код:
procedure Foo;
begin
if ck then goto L2

asm
popa
ret 4
end; 
L2: WriteLn('Two');
asm
popa
ret 4
end; 
end; // конец процедуры
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.08.2016, 23:41   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы можете или полностью работать в асме, или промежуточное как в первом варианте.

во втором варианте вы можете лишь вызвать иные процедуры.

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

Pavia, в принципе тоже вариант, но там могут быть нюансы из-за использования FPU, из-за разрядности и тп.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2016, 23:46   #6
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Ага, точно, про функцию вместо процедуры я совсем не подумал.
Тогда попутный вопрос, Делфи всегда выводит Result в регистре eax?

То-есть выходит, что нет ни директив, никаких трюков, чтобы избавиться от этих прологов-эпилогов, кроме как отказавшись от локальных переменных и параметров?

И кстати, как быть-то, ведь мне нужно передать стек в вынесенную функцию. На основе данных стека, я решаю какой выход избрать. Придется завести глобальную запись под стек?

Последний раз редактировалось Kuzya69; 27.08.2016 в 23:55.
Kuzya69 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать процедуру в ДЕЛФИ?? Wi1D Помощь студентам 10 24.02.2014 10:19
Как написать процедуру в Delphi 7 Dominick1990 Помощь студентам 2 01.08.2012 16:09
незнаю как процедуру написать Saka Помощь студентам 10 14.02.2010 20:37
Как написать свою процедуру? theYozh Помощь студентам 10 08.03.2009 11:18
С помощью рекурсии без операторов цикла и перехода написать процедуру P(N) WhyBeNormal Помощь студентам 1 29.01.2009 01:20