Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Asm в Delphi   Найти похожие ветки 

 
AlexZ_CRC   (2004-05-31 19:01) [0]

Приветствую!
Как грамотно вставить Ассемблерный код в дельфовую прогу?
Есть процедура, там пишу:

здесь остальной код (Паскаль)
asm
Здесь идёт Ассемблер
end;
А здесь надо код на Паскале.
После ассемблерного кода в регистре лежат нужные мне данные, здесь их надо использовать.

Собственно, как сделать?


 
GuAV ©   (2004-05-31 19:06) [1]

скачай отсюда книжку.
http://podgoretsky.com/ddp.html


 
IraiZor ©   (2004-05-31 19:07) [2]

function xXx(a:integer):integer;
var b:integer;
begin
asm
 mov eax,a
 add eax,5
 mov b,eax
end;
showmessage("Сумма равна"+inttostr(b));
result:=b;
end;

где-то так ,не проверял


 
GuAV ©   (2004-05-31 19:08) [3]


> в регистре лежат нужные мне данные

В одном регистре? тогда если не AL/AX/EAX - MOV туда. И asm-код оформь как отдельную функцию, результат - нужный тип.


 
IraiZor ©   (2004-05-31 19:11) [4]

Сейчас проверил- все работает верно


 
Anatoly Podgoretsky ©   (2004-05-31 19:16) [5]

Так как ты спрашиваешь никак, кроме конечно очень грязного хака. Оформляей функцией, а результат будет в EDX:EAX


 
GuAV ©   (2004-05-31 19:19) [6]


> Сейчас проверил- все работает верно

Но это не совсем хорошо. Цитирую:
© Guido Gybels, January-February 2001, All rights reserved.
© Anatoly Podgoretskys, 2002, Authorized Russian Translation
"Ассемблерные инструкции размещаются внутри блока asm...end. Эти блоки могут появляться внутри процедур и функций обычного кода, но я настоятельно не рекомендую поступать таким образом. Гораздо лучше изолировать их в отдельной функции или процедуре. Вставка asm блока внутри обычной процедуры создает сложности для компилятора Паскаля и код становится не эффективным с точки зрения производительности. Переменные, которые обычно передаются через регистры, в этом случае будут передаваться через стек или перезагрузку. "


 
GuAV ©   (2004-05-31 19:23) [7]

"... Также, это заставляет компилятор адаптировать собственный код к вашему вставленному коду, что делает механизм оптимизации менее эффективным. Так, что это становится правилом помещать ассемблерный код в отдельную процедуру или функцию. Кроме того - это вопрос проектирования. Читабельность и управляемость вашего кода становится выше, если он помещен в свой собственный блок."


 
IraiZor ©   (2004-05-31 19:26) [8]

GuAV ©
Я этих подробностей не знал... я ассемблер-то совсем недавно изучать начал.


 
GuAV ©   (2004-05-31 19:30) [9]


> GuAV ©

Anatoly Podgoretsky ©

> Я этих подробностей не знал... я ассемблер-то совсем недавно
> изучать начал.

Я тоже. Рекомендую [1]


 
IraiZor ©   (2004-05-31 19:32) [10]

Ссылку, выложенную тобой, я сразу сохранил =)


 
AlexZ_CRC   (2004-05-31 20:26) [11]

Огромное спасибо за оперативность.(и за линк)
Дело в том, что есть готовая рабочая процедура(а не фрагменты вычислений) на Ассемблере (можно сказать, что из программы под компилятор ассемблера копированая). Там рассчитано в какие регистры что класть, и что в конце(и где) получить.
Вот мне надо эту процедуру как-то вставить.
Хотелось бы, конечно приладить(как я сказал выше) её без всяких отдльных Паскаль-процедур с Asm, т.к. всё рассчитано.
В случае с отдельной функцией, Асм-процедура уже выглядит по-другому :( (прога падает)
Всё делать на Asm - невозможно, поэтому, хотелось бы ускорить работу, перейти на делфи.


 
Anatoly Podgoretsky ©   (2004-05-31 20:48) [12]

Да процедуру (точнее ассемблерную вставку) можно вставить, только забудь о возврате через регист, это уже функция, а у тебя никакого вызова не происходит, хочешь возврат, оформляй как внешнюю к данному блоку функцию.


 
default ©   (2004-05-31 20:48) [13]

покажи её код


 
GuAV ©   (2004-05-31 20:51) [14]


> Дело в том, что есть готовая рабочая процедура(а не фрагменты
> вычислений) на Ассемблере (можно сказать, что из программы
> под компилятор ассемблера копированая).

Calling conventions - ? 32bit - ? и ваще давай код посмотрю...


 
AlexZ_CRC   (2004-06-01 16:50) [15]

>>покажи её код
Хм... он не менее 50 строк.
В общем, сделал я всё на Ассемблере. Вопрос вроде как-бы отпадает.
Есть другой(по Делфи):
Как покороче разделить число на число, и чтобы получить остаток деления?


 
app ©   (2004-06-01 17:05) [16]

А это задай в отдельной ветке


 
GuAV ©   (2004-06-01 17:05) [17]


> Есть другой(по Делфи):
> Как покороче разделить число на число, и чтобы получить
> остаток деления?

DivMod. Только учти диапазон типа word.


 
WebErr ©   (2004-06-01 17:33) [18]


> AlexZ_CRC   (01.06.04 16:50) [15]

procedure XXX(A, B: Integer; var Res, Ost: Integer);
asm
mov eax, A
mov ebx, B
div ebx
mov Res, eax
mov Ost, edx
end;


 
GuAV ©   (2004-06-01 17:43) [19]


> procedure XXX(A, B: Integer; var Res, Ost: Integer);
> asm
> mov eax, A
> mov ebx, B
> div ebx
> mov Res, eax
> mov Ost, edx
> end;

Так посто нельзя писать в ebx тогда надо push ebx в начале/pop ebx в конце. И ещё ошибки есть.


 
GuAV ©   (2004-06-01 17:46) [20]

Вообще рекомендую найти в Math.pas DivMod и её уже доработать для dword


 
AlexZ_CRC   (2004-06-01 17:49) [21]

А ведь и правда, самый короткай способ - Ассемблер!!!
(Я чёт не догадался, и спросил про делфи)
PS только я для безопасности регистры сохранил в стек, т.к. не стал делать отдельную процедуру.
Всё, спасибо. Вопрос решен.


 
GuAV ©   (2004-06-01 18:10) [22]


> т.к. не стал делать отдельную процедуру

[6]-[7].
Может статься так, что asm внутри процедуры помешает компилеру оптимизить, и будет хуже, чем div и mod отдельно.

Если хочешь DivModLong на асме-делай. Но только отдельно. Рекомендую [20].


> PS только я для безопасности регистры сохранил в стек

Все? Сомневаюсь, что были использованы EDI и EBP,
для арифметики нужны только EAX, EDX, ECX, EBX.
Из них первые три сохранять не требуется. Т.е. достаточно
PUSH EBX
....
POP EBX


 
WebErr ©   (2004-06-01 18:17) [23]


> GuAV ©   (01.06.04 17:43) [19]

Сорри, лучше использовать EDX. Его сохранять необязательно.

> И ещё ошибки есть.

Какие? :)


 
Anatoly Podgoretsky ©   (2004-06-01 19:17) [24]

AlexZ_CRC   (01.06.04 17:49) [21]
Самый короткай способ - это Паскаль, функция заложена в язык и называется MOD
О типах беспокоиться не придется.


 
GuAV ©   (2004-06-01 19:23) [25]


> mov eax, A   // mov eax,eax
> mov edx, B   // mov edx,edx
> div edx      // "Integer Overflow..."


 
AlexZ_CRC   (2004-06-02 01:57) [26]

Интересно, столько мнений...
Я уж на Ассемблере сделал. Как-то понятнее.
>>Все? Сомневаюсь, что были использованы EDI и EBP,
Да конечно же не все! Зачем Popad"ом/pushad"ом мучить?


 
GuAV ©   (2004-06-04 00:49) [27]


> Я уж на Ассемблере сделал. Как-то понятнее.

LOL
В hex-е ещё понятнее. сначала пишешь 4D 5A, ну и так далее...

зы - как там авторан?



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 4.187 c
1-1086264193
Прямой
2004-06-03 16:03
2004.06.20
Панельку надо


1-1086607879
sesh
2004-06-07 15:31
2004.06.20
Запись в текстовый файл в DOS кодировке


14-1086333374
Baks
2004-06-04 11:16
2004.06.20
Из рубрики Знаменательная математика


14-1086173050
}|{yk
2004-06-02 14:44
2004.06.20
Что я нашел !!!


3-1085416337
Nous Mellon
2004-05-24 20:32
2004.06.20
Спец-Операции с таблицами :)