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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.007 c
14-74969
sen
2002-12-03 11:49
2002.12.23
Удаленная работа


7-75020
Gliph
2002-10-17 01:18
2002.12.23
Кнопки и иконки


1-74641
Ag2002
2002-12-10 14:48
2002.12.23
Ожидание


1-74783
VladTen
2002-12-11 09:31
2002.12.23
Как опреледить имя компьютера


1-74841
don_dampster
2002-12-11 16:37
2002.12.23
unrar.dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский