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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2009, 09:11   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
Лампочка Delphi и АСМ. универсальный запуск

интересует следующее:
реализация универсального запуска подпрограмм(stdcall тип аргументов известен и порядок известен, и также тип возвращаемого значения)
типы аргументов могут быть следующие: указатель(в основном PChar), дробное(real 8б) и целое(int 4б)..
возвращаем указатель:

получается чтото типа следующего:
Код:
var P:pointer;
     i,j:integer;
begin
 for i:=0 to Proc.ArgumentsCount-1 do
  case Proc.Arguments[i] of
   'i': begin
        j:=IntToStr(Argument[i]);
        asm
         push//далее не знаю
        end;
  //дальше case
  end;
 asm
  call//тоже не знаю что тут(вроде адрес)
 //и главное как забрать результат в P?
 end; 
end;
Код:
Argument = array of string;
Proc=record;
 ArgumentsCount:integer;
 Arguments:array of char;
 Address:pointer;
end;
1)верный ли порядок аргументов?(допустим функция
Код:
Proc(i:integer;p:PChar;f:real):pointer;stdcall
)
2)возможно ли по данной схеме работать с ДЛЛ?
3)как потом очистить стек если гдето будет ошибка при заталкивании переменных?
pop ведь так?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2009, 15:39   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Если честно, я не очень понял, что вам нужно сделать. Какой-то жуткий способ запустить процедуру?

Код:
  call//тоже не знаю что тут(вроде адрес)
 //и главное как забрать результат в P?
Код:
  call Proc
 mov [P],eax ; результат возвращается в eax
Цитата:
1)верный ли порядок аргументов?
Аргументы в stdcall запихиваются в стек в обратном порядке, т.е. первым должен зайти real ( т.к. он 8 байт, то это еще и в 2 этапа - вначале одна половика, затем другая), после пойдет PChar, и в конце integer.

Цитата:
2)возможно ли по данной схеме работать с ДЛЛ?
Почти со всеми DLL, кроме сишных, так и работают.
Цитата:
3)как потом очистить стек если гдето будет ошибка при заталкивании переменных?
pop ведь так?
Я думаю более целесообразно будет запомнить положение указателя стека (регистр esp) где-нибудь (на асме напр обычно его сохраняют в регистре ebp) и в случае ошибки восстанавливать его значение.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 22.09.2009, 19:33   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Какой-то жуткий способ запустить процедуру?
почти
просто функа может быть как Proc(i1,i2,i3:integer)ointer;
так и та что я ранее привел(но мне известен тип и порядок аргументов)..

Цитата:
Почти со всеми DLL, кроме сишных, так и работают.
а с Сишными что делать?(сишные это С и С++, или только чистый С?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2009, 19:53   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
а с Сишными что делать?(сишные это С и С++, или только чистый С?)
Я имею ввиду чистый Си, в его функциях стек после вызова не выравнивается, это должна делать вызывающая прогамма, т.е. ваша
Код:
push arg2
push arg1
call C_proc
add esp,8 ; 2 параметра по 4 байта
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 22.09.2009, 20:18   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спасибо
тему можно закрыть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программ из среды Delphi .Phoenix Общие вопросы Delphi 5 19.09.2009 23:07
Подскажите универсальный код для всплывающего окна SunnyDay JavaScript, Ajax 3 11.07.2009 23:22
Универсальный стилизатор исходного кода Eldarion Помощь студентам 3 26.04.2009 19:02
Запуск программы в Delphi Cannibal Помощь студентам 2 11.10.2008 16:13
Как создать универсальный шаблон документа? CoolMan Microsoft Office Word 1 18.12.2007 09:10