Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi|Assembler] Копирование массива 
V
    Опции темы
Sovereign
Дата 3.2.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 7.11.2006

Репутация: нет
Всего: 4



Есть массив buf[0..w*h*3] и wbuf[0..w*h*4], нужно скопировать из buf в wbuf, так, чтобы первые три в wbuf записывались из buf, а 4-й  255, и так до конца массива, помогите сделать ввиде ассемблерной вставки в delphi, т.е 
Код

for i := 0 to 320*240-1  do begin
     bufrgba[i*4]:=buf[i*3];
     bufrgba[i*4+1]:=buf[i*3+1];
     bufrgba[i*4+2]:=buf[i*3+2];
     bufrgba[i*4+3]:=255;
   end;
 


Это сообщение отредактировал(а) Sovereign - 3.2.2007, 19:50
PM MAIL   Вверх
JAPH
Дата 3.2.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 12
Всего: 23



Интересно, Delphi и Pascal одинаково относятся к таким вставкам? Просто нет знаний и возможности проверить. smile
Может, так:
Код

asm
lea esi, buf
lea edi, wbuf
mov ax, ds
mov es, ax
{Далее вычисляем w*h*3}
mov ecx, w
imul ecx, h
mov ebx, ecx {ebx = w*h}
shl ecx, 1
add ecx, ebx
{Ну и копируем ecx двойных слов из DS:ESI в ES:EDI}
repd movsd
{теперь заполняем остаток 255ками}
mov eax, 255
mov ecx, ebx
repd stosd
end;

Проверяем smile

Это сообщение отредактировал(а) JAPH - 3.2.2007, 22:46


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
dumb
Дата 4.2.2007, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 6
Всего: 158



Цитата(Sovereign @  3.2.2007,  17:56 Найти цитируемый пост)
помогите сделать ввиде ассемблерной вставки в delphi

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

JAPH, не, совсем не то. smile

как-то так:
Код

procedure someproc;
label next_item;
begin
asm
  push esi
  push edi
  lea esi, buf
  lea edi, wbuf
  mov ecx, w
  imul ecx, h
  cld
next_item:
  lodsd
  or eax,$ff000000
  stosd
  dec esi
  loop next_item
  pop edi
  pop esi
end;
end;


PM MAIL   Вверх
MBo
Дата 4.2.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 7
Всего: 18



Код

var
  AIn: array of TRGBTriple;
  AOut: array of Integer;
  PIn: PByte;
  POut: PInteger;
  N, i: Integer;
begin
  N := 10;
  SetLength(AIn, N);
  SetLength(AOut, N);
  for i := 0 to N - 1 do begin
    AIn[i].rgbtBlue := i;
    AIn[i].rgbtGreen := i or $40;
    AIn[i].rgbtRed := i or $80;
  end;
  PIn := @AIn[0];
  POut := @AOut[0];
  for i := 0 to N - 2 do begin
    POut^ := PInteger(PIn)^ or $FF000000;
    Inc(POut);
    Inc(PIn, 3);
  end;
//последний элемент обрабатываем специальным образом, чтобы не вылезти за свою память
  Move(AIn[N-1], AOut[N-1], 3);
  AOut[N-1] := AOut[N-1] or $FF000000;
end;


PM MAIL   Вверх
Sovereign
Дата 4.2.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 7.11.2006

Репутация: нет
Всего: 4



2 dumb c вставкой стало немного лучше,всем спасибо =)

Это сообщение отредактировал(а) Sovereign - 5.2.2007, 13:25
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.