Форум: "Основная";
Текущий архив: 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