Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.036 c
14-1086157930
XIII
2004-06-02 10:32
2004.06.20
"Намедни" на НТВ не стало. Парфенова уволили


6-1083057490
Veon
2004-04-27 13:18
2004.06.20
Подсчёт трафика


1-1086706407
red chief
2004-06-08 18:53
2004.06.20
Как поменять стиль шрифта?


3-1085648034
Andrew_S
2004-05-27 12:53
2004.06.20
Проблема с LookUp полями


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский