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

Вниз

к вопросу о встроенном ассемблере   Найти похожие ветки 

 
Sergey Pavl ©   (2002-12-09 13:50) [0]

Допустим у меня массив, состаящий из нескольких миллионов чисел. Над

всеми этими числами нужно провести некоторые математические

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

блок в виде ассемблерной вставки. Но если эту вставку написать в

отдельной функции, то, на сколько я понимаю, при обработке каждого

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

кода, выведенным в отдельную функцию, работает медленнее. Т.е. ввод

ассемблерной вставки с целью повышения скорости обработки массива

сводится на нет. Вот и возникает вопрос, можно ли ввести ассемблерную

вставку внутрь, например, оператора FOR...? Если да, то допустим есть

динамический массив А[i], как передать содержимое i-ого элемента в

регистр eax и как достать потом результат?
И еще маленький вопросик, пусть в нашем массиве шестнадцатиричные

числа, внутри ассемблерной вставки компилятор будет знать, что он

работает с шестнадцатиричным числом, или нужно как-то ему это пояснять?
Если нужно указать, что число шестнадцатиричное, то как это сделать?
Спасибо за предыдущие ответы.


 
Separator ©   (2002-12-09 14:06) [1]

Вот что мне понаписали в пятницу, эта функция выдает позицию элемента N в массиве Values, может поможет

function NPos(N: Integer; const Values: array of Integer):integer;
asm
push ebx
mov ebx, edx
@@10:
test ecx, ecx
jl @@40
cmp eax, [edx]
je @@30
add edx, 4
dec ecx
jmp @@10
@@30:
mov eax, edx
sub eax, ebx
shr eax,2
jmp @@50
@@40:
mov eax,-1
@@50:
pop ebx
end;


 
Sha ©   (2002-12-09 14:07) [2]

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


 
Calm ©   (2002-12-09 14:13) [3]


> Если нужно указать, что число шестнадцатиричное, то как
> это сделать?

Никак.
Слобо поддерживает типизацию данных.
Есть некоторая область памяти, содержащая массив чисел. Но каков размер числа, где заканчивается одно и начинается другое, должен знать программист.
А пересылать очень просто - mov
Например, есть адрес, который ассоциируется с началам массива StartAddress, тогда переслать 2-ое по счету 16-ти разрядное число можно так
move ax, StartAddress+2


 
Calm ©   (2002-12-09 14:14) [4]

Для организации циклов имеется команда Loop.
Можно и без нее. Организовать цикл проблемы нет.


 
andrew   (2002-12-09 14:39) [5]

Вот так вот можно писать (читать абсолютно также) элементы массива.

var A : array [1..10] of integer;
Start : pointer;
i : integer;
begin
A[4] := 777;
Start := @A;
asm
mov ebx, Start
mov edi, 3 * 4 // вместо тройки должно быть вычисленное значение номера элемента
mov eax, [ebx + edi] // в eax попадает 777
end;
end;


 
Calm ©   (2002-12-09 14:59) [6]


> andrew (09.12.02 14:39)
> Вот так вот можно писать (читать абсолютно также) элементы
> массива.

Если я правильно понял, приведен пример чтения.


 
Sha ©   (2002-12-09 15:25) [7]

Небольшое замечание:
если используешь присваивания регистрам (кроме eax, ecx, edx)
вне ассемблерной процедуры (как показал andrew), то надо их
предварительно сохранять в начале ассемблерной вставки и
восстанавливать в конце.

Последнюю строку моего предыдущего поста надо читать так:
INLINE вставки кода - в Паскале это было, в Дельфи нет.


 
han_malign ©   (2002-12-09 16:02) [8]

> вставки кода - в Паскале это было, в Дельфи нет.
program Basm;
{$APPTYPE CONSOLE}
uses
Utils;
var w: Longword;
a: array[0..100]of word;
i: integer;
begin
for i:=0 to 100 do a[i]:=Random(65535);
asm
xor EAX,EAX
xor EDX,EDX
end;
for i:=0 to 100 do
asm
mov ebx,i
add ebx,ebx
mov DX,word ptr(a[ebx])
add EAX,EDX
end;
asm
mov w,EAX
end;
writeln(w);
// Insert user code here
end.


 
Sha ©   (2002-12-09 19:55) [9]

>вставки кода - в Паскале это было, в Дельфи нет.

Чуть выше я уже все поправил.
Хотел написать следующее:

Внутрь FOR - пожалуйста, а INLINE вставки кода - в Паскале это было, в Дельфи нет.

Но мысли бежали впереди рук - что из этого получилось, вы видели. Sorry.


 
Murtix   (2002-12-11 20:41) [10]


const
n = 1000;
var
m : array [0..n]of integer;
i : integer;
begin
//Код Delphi
asm
mov ecx, n
xor ebx, ebx
@Loop :
mov eax, dword ptr m[ebx*4]//по-моему ecx вместо ebx нельзя
//не пришлось бы тратить такты
//но ты все же проверь
inc ebx
mov dword ptr m[ebx], eax
loop @Loop
{в этом примере m[i]->m[i+1], смещение вправо}
end;
end;

почитай доку по асме например: www.wasm.ru,
www.hi-tech.nsys.by // тут же архив ихней рассылки
я в интернет кафе засим информации мало и дельфей рядом нету
не имею возможности проверить
Удачи, направь на мыл если до сих пор этим вопросом интересуешся.



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
14-74954
Дмитрий К.К.
2002-11-29 09:31
2002.12.23
Чтение новостных групп


14-74979
seacat
2002-12-03 12:40
2002.12.23
inaccessible value во время отладки


14-74958
Николай Быков
2002-11-28 20:20
2002.12.23
Тут MrBeer предложил обсудить мою нормальность


14-74905
misterix
2002-11-29 14:17
2002.12.23
О детях


1-74838
ruslan_as
2002-12-12 11:23
2002.12.23
Сворачивание в трей дочерней формы