Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi|Assembler] Копирование массива


Автор: Sovereign 3.2.2007, 17:56
Есть массив 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;
 

Автор: JAPH 3.2.2007, 22:45
Интересно, 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

Автор: dumb 4.2.2007, 03:18
Цитата(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;


Автор: MBo 4.2.2007, 08:30
Код

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;


Автор: Sovereign 4.2.2007, 15:24
2 dumb c вставкой стало немного лучше,всем спасибо =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)