Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задача на сумму двух массивов

26K
06 декабря 2007 года
АлексейМ
18 / / 06.12.2007
Помогите , кто сможет найти ошибку в программе с нахождением суммы двух массивов с Ассемблерными вставками. Вот мой код. Просто результирующий массив не выводиться , помогите.
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  s3,S2,s1,s: array[1..10000] of smallint; i,p,summa:integer; begtime:tdatetime; h,m,ss,ms:word;
begin
  timer1.Enabled:=true;
  randomize;
  for i:=1 to 6 do s:=random(8888);
  summa:=0;
  for i:=1 to 6 do
  Begin
    memo1.Lines.Add(inttostr(s));
    summa:=summa+s;
  End;

  for i:=1 to 3 do  Begin
      s1:=s;
      End;
 for i:=1 to 3 do  Begin
      s2:=s[6-i+1];
      End;

 //i:=1;
 p:=0;
  asm
    pushad
    push ebx

    mov ecx,4
    shr ecx,2
    lea esi,s1
    lea edi,s2
    lea ebx,s3
@loop:
    clc
    xor eax,eax
    mov eax,dword ptr s1[esi*4]
    adc eax,dword ptr s2[edi*4]
    mov dword ptr s3[ebx*4],eax
    add esi,2
    add edi,2
    add ebx,2
    jbe @loop;

    pop ebx

   popad
    end;

   for i:=1 to 3 do
  memo1.Lines.Add(inttostr(s3));
end;
261
06 декабря 2007 года
ahilles
1.5K / / 03.11.2005
я "немного" модифицировал твой код, посмотри, вроде всё работает

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  s3,s2,s1,s: array[1..100] of longint;
  i,p,summa:integer; begtime:tdatetime;
  h,m,ss,ms:word;

begin
  Memo1.clear;
  timer1.Enabled:=true;
  randomize;

  for i:=1 to 6 do
   s:=random(100);

  summa:=0;

  for i:=1 to 6 do
   begin
    memo1.Lines.Add(inttostr(s));
    summa:=summa+s;
   end;

  memo1.Lines.Add('-----');

  for i:=1 to 3 do
   s1:=s;

  for i:=4 to 6 do
   s2[i-3]:=s;

   p:=0;
  asm
    pushad

    mov ecx,3
    xor esi, esi
    xor edi, edi
    xor ebx, ebx
  @loop:

    xor eax,eax
    mov eax,dword ptr s1[esi]
    adc eax,dword ptr s2[edi]
    mov dword ptr s3[ebx],eax
    add esi, 4
    add edi, 4
    add ebx, 4
    loop @loop

    popad
   end;

   for i:=1 to 3 do
    memo1.Lines.Add(inttostr(s3));
end;
26K
06 декабря 2007 года
АлексейМ
18 / / 06.12.2007
Вопрос по тому же коду, я поправил тот момент, что мне нужно чтобы второй массив s2 в обратную сторону ( если 1 2 3, то 3 2 1 ), это я исправил. Вопрос в том, я хотел попросить - первые 2 цикла (с массивом s1 и s2) перед ассемблерной вставкой были реализованы в ассемблерной вставке, а остальное трогать не надо, там всё отлично. Я вам очень благодарен,буду очень признателен если ещё чуток поможете.

Код:
for i:=1 to 3 do
   s1:=s;

  for i:=1 to 3 do
   s2:=s[6-i+1];

 
  asm
    pushad

    mov ecx,3
    xor esi, esi
    xor edi, edi
    xor ebx, ebx
  @loop:

    xor eax,eax
    mov eax,dword ptr s1[esi]
    adc eax,dword ptr s2[edi]
    mov dword ptr s3[ebx],eax
    add esi, 4
    add edi, 4
    add ebx, 4
    loop @loop

    popad
   end;

   for i:=1 to 3 do
    memo1.Lines.Add(inttostr(s3));
end;
261
07 декабря 2007 года
ahilles
1.5K / / 03.11.2005
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  s3,s2,s1,s: array[1..100] of longint;
  i,p,summa:integer; begtime:tdatetime;
  h,m,ss,ms:word;

begin
  Memo1.clear;
  timer1.Enabled:=true;
  randomize;

  for i:=1 to 6 do
   s:=random(100);

  summa:=0;

  for i:=1 to 6 do
   begin
    memo1.Lines.Add(inttostr(s));
    summa:=summa+s;
   end;

  memo1.Lines.Add('-----');

   p:=0;
  asm
    pushad

    mov ecx,3
    xor esi, esi
   @loop1:
    mov eax,dword ptr s[esi]
    mov dword ptr s1[esi],eax
    add esi, 4
    loop @loop1


    mov ecx,3
    xor esi, esi

   @loop2:
    shl ecx, 2

    mov edi, 8
    add edi, ecx

    mov eax,dword ptr s[edi]
    mov dword ptr s2[esi],eax
    add esi, 4
    shr ecx, 2
    loop @loop2


    mov ecx,3
    xor esi, esi
  @loop:

    xor eax,eax
    mov eax,dword ptr s1[esi]
    adc eax,dword ptr s2[esi]
    mov dword ptr s3[esi],eax
    add esi, 4
    add edi, 4
    add ebx, 4
    loop @loop

    popad
  end;

  for i:=1 to 3 do
   memo1.Lines.Add(inttostr(s3));
end;
26K
07 декабря 2007 года
АлексейМ
18 / / 06.12.2007
Простите за вопрос щё один. Тут только для массива из 6-ти элементов, помогите пожалуйста сделать это же, но для произвольного количества n-элементов (n- как константу задать)
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  s3,s2,s1,s: array[1..100] of longint;
  i,p,summa:integer; begtime:tdatetime;
  h,m,ss,ms:word;

begin
  Memo1.clear;
  timer1.Enabled:=true;
  randomize;

  for i:=1 to 6 do
   s:=random(100);

  summa:=0;

  for i:=1 to 6 do
   begin
    memo1.Lines.Add(inttostr(s));
    summa:=summa+s;
   end;

  memo1.Lines.Add('-----');

   p:=0;
  asm
    pushad

    mov ecx,3
    xor esi, esi
   @loop1:
    mov eax,dword ptr s[esi]
    mov dword ptr s1[esi],eax
    add esi, 4
    loop @loop1


    mov ecx,3
    xor esi, esi

   @loop2:
    shl ecx, 2

    mov edi, 8
    add edi, ecx

    mov eax,dword ptr s[edi]
    mov dword ptr s2[esi],eax
    add esi, 4
    shr ecx, 2
    loop @loop2


    mov ecx,3
    xor esi, esi
  @loop:

    xor eax,eax
    mov eax,dword ptr s1[esi]
    adc eax,dword ptr s2[esi]
    mov dword ptr s3[esi],eax
    add esi, 4
    add edi, 4
    add ebx, 4
    loop @loop

    popad
  end;

  for i:=1 to 3 do
   memo1.Lines.Add(inttostr(s3));
end;

[COLOR="Red"]Оформляй код по Правилам.[/COLOR]модератор
261
08 декабря 2007 года
ahilles
1.5K / / 03.11.2005
всё что надо изменить я пометил жирным.
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
const
  N=8;
var
  s3,s2,s1,s: array[1..N] of longint;
  i,p,summa:integer; begtime:tdatetime;
  h,m,ss,ms:word;
begin
  Memo1.clear;
  timer1.Enabled:=true;
  randomize;

  for i:=1 to N do
   s:=random(100);

  summa:=0;

  for i:=1 to N do
   begin
    memo1.Lines.Add(inttostr(s));
    summa:=summa+s;
   end;

  memo1.Lines.Add('-----');

   p:=0;
  asm
    pushad

    mov ecx,N/2
    xor esi, esi
   @loop1:
    mov eax,dword ptr s[esi]
    mov dword ptr s1[esi],eax
    add esi, 4
    loop @loop1


    mov ecx,N/2
    xor esi, esi

   @loop2:
    shl ecx, 2

    mov edi, (N*4)/2-4
    add edi, ecx

    mov eax,dword ptr s[edi]
    mov dword ptr s2[esi],eax
    add esi, 4
    shr ecx, 2
    loop @loop2


    mov ecx,N/2
    xor esi, esi
  @loop:

    xor eax,eax
    mov eax,dword ptr s1[esi]
    adc eax,dword ptr s2[esi]
    mov dword ptr s3[esi],eax
    add esi, 4
    add edi, 4
    add ebx, 4
    loop @loop

    popad
  end;

  for i:=1 to round(N/2) do
   memo1.Lines.Add(inttostr(s3));
end;
26K
08 декабря 2007 года
АлексейМ
18 / / 06.12.2007
А если элементов нечетное количество , как сделать так чтобы средний элемент первоначального массива s тоже складывался, но сам с собой..
и такой вопрос , почему эта программа реализованная способом выше по временя идёт быстрее,нежели с использованием команд MMX?
26K
08 декабря 2007 года
АлексейМ
18 / / 06.12.2007
А если элементов нечетное количество , как сделать так чтобы средний элемент первоначального массива s тоже складывался, но сам с собой..
и такой вопрос , почему эта программа реализованная способом выше по временя идёт быстрее,нежели с использованием команд MMX

Как по твоему мнению посчитаь время выполнения команды средствами Delphi, которая в ассемблерной вставке.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог