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;
Задача на сумму двух массивов
Помогите , кто сможет найти ошибку в программе с нахождением суммы двух массивов с Ассемблерными вставками. Вот мой код. Просто результирующий массив не выводиться , помогите.
Код:
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;
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;
Код:
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;
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;
Код:
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;
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;
Код:
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;
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]модератор
Код:
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;
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;
и такой вопрос , почему эта программа реализованная способом выше по временя идёт быстрее,нежели с использованием команд MMX?
и такой вопрос , почему эта программа реализованная способом выше по временя идёт быстрее,нежели с использованием команд MMX
Как по твоему мнению посчитаь время выполнения команды средствами Delphi, которая в ассемблерной вставке.