.model small
.data
x dw 300
.code
start:
mov ax,@data
mov ds,ax
mov ax,0
mov bx, 250
mov cx,10
@M1:
add ax,bx
inc bx
inc bx
loop @M1
div x
mov ax,4c00h
int 21h
end start
(Delphi,ассемблерные вставки) Задача на массивы
Сам код программы должен быть на ассемблере, просто "запихан" в делфи!
Порядок выполнения работы:
1.Создайте Делфи-приложение, содержащее вложенные циклы, при этом ничего не выполняющее, например, for x:=1 to 32000 do for y:=1 to 32000 do ;. При этом время работы такой конструкции должно фиксироваться.
2.Определите время работы приложения.
3.Замените операторы циклов аналогично работающей последовательностью команд ассемблера, оформив ее как вставку.
4.Определите время работы приложения и сравните со значением, полученным ранее.
5.Используя средства ввода/вывода ЯВУ, выполните задания, максимально задействовав ассемблерный код:
"Дан ряд случайных целых чисел в количестве 300. Числа выбраны из диапазона [-10, 20]. Просуммировать отрицательные."
Есть приблизительный код программы, только не для отрицательных чисел:
Код:
Это код другой программы, очень похожей по заданию на эту!
(сейчас стараюсь переделать на отрицательные)!
Заранее Благодарен!!!
Мне хотя бы последний 5-ый пункт!!
Цитата: One Bad
2.Определите время работы приложения.
Про то, как средствами WinAPI засечь время работы куска кода, тут писали много. Ищи в разделе по функции QueryPerformanceCounter.
Цитата: One Bad
5.Используя средства ввода/вывода ЯВУ, выполните задания, максимально задействовав ассемблерный код:
ЯВУ - Языки Высокого Уровня. Поясни этот пункт, а?:) Смысл в том, чтобы написать как можно больше на асме, а на ЯВУ - то, что на асме писать слишком громоздко? Или как?
Нужно главный код(не всю прогу), написать на асме, потом его "положить" в Делфи! Соответственно оформить правильно уже в Делфи!
Цитата: One Bad
1.Создайте Делфи-приложение, содержащее вложенные циклы, при этом ничего не выполняющее, например, for x:=1 to 32000 do for y:=1 to 32000 do ;
Написать код на Дельфи, поставить бряк на этой строке, при останове нажать Ctrl+Alt+C и посмотреть подстрочник ассемблера, сгенерированный компилятором. В 2006-й Студии его даже можно скопировать. Оптимизировать по вкусу.
Код:
program Project1;{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
var
s: array[1..300] of integer;
sum, j, i: integer;
freq_HRT, begin_time, end_time: int64;
begin
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
for i := 1 to 32000 do
for j := 1 to 32000 do ;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
asm
mov i, 0
@ii:
inc i
mov j, 0
@jj:
inc j
cmp j, 32000
jl @jj
cmp i, 32000
jl @ii
end;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
randomize;
sum := 0;
for i := 1 to 300 do
s := -10 + random(30);
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
for i := 1 to 300 do
if s < 0 then
sum := sum + s;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
//writeln;
//writeln(sum);
sum := 0;
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
asm
mov edx, 0
mov ecx, 0
mov eax, offset s
@cc:
inc ecx
cmp[eax], 0
jl @m
jmp @n
@m:
add edx, [eax]
@n:
add eax, 4
cmp ecx, 300
jl @cc
mov sum, edx
end;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
//writeln(sum);
readln;
end.
uses
SysUtils,
Windows;
var
s: array[1..300] of integer;
sum, j, i: integer;
freq_HRT, begin_time, end_time: int64;
begin
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
for i := 1 to 32000 do
for j := 1 to 32000 do ;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
asm
mov i, 0
@ii:
inc i
mov j, 0
@jj:
inc j
cmp j, 32000
jl @jj
cmp i, 32000
jl @ii
end;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
randomize;
sum := 0;
for i := 1 to 300 do
s := -10 + random(30);
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
for i := 1 to 300 do
if s < 0 then
sum := sum + s;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
readln;
//writeln;
//writeln(sum);
sum := 0;
QueryPerformanceFrequency(freq_HRT);
QueryPerformanceCounter(begin_time);
asm
mov edx, 0
mov ecx, 0
mov eax, offset s
@cc:
inc ecx
cmp[eax], 0
jl @m
jmp @n
@m:
add edx, [eax]
@n:
add eax, 4
cmp ecx, 300
jl @cc
mov sum, edx
end;
QueryPerformanceCounter(end_time);
writeln((end_time / freq_HRT - begin_time / freq_HRT) * 1000);
//writeln(sum);
readln;
end.
результат в миллисекундах. между блоками программы специально поставлено ожидание ввода пользователя, для большей объективности результатов нужно немного подождать. не исключено, что мог ошибиться.
СПАСИБО!!!! kosfiz, огромное спасибо!!! то что ошибки будут ничего, разберусь!! Все же легче уже!!!
Код:
mov cx,32000
L1: push cx
mov cx,32000
L2: Loop L2
pop cx
Loop L1
L1: push cx
mov cx,32000
L2: Loop L2
pop cx
Loop L1
а я бы вот так сделал фрагментик с вложеными циклами
кстати любопытно насколько быстрее будет - по идее оптимальнее на порядок
Прога готова(надеюсь допущусь), выглядет так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=4;
Type massiv=array[1..n]of integer;
var
Form1: TForm1;
x:massiv;
m:integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
Procedure Vvod (Var x:massiv);
Var i:integer;
begin
x[1]:=strtoint(edit2.Text);
x[2]:=strtoint(edit3.Text);
x[3]:=strtoint(edit4.Text);
x[4]:=strtoint(edit5.Text);
end;
Procedure max(var x:massiv);
VAR k2:integer;
begin
asm
mov edx, 1
mov esi, 0
mov m,0
@lp1:
mov edi,[x]
mov edi,[edi+edx*4-4]
mov k2,edi;
cmp k2,0;
jns @lp2
add m,edi
@lp2:
inc edx
cmp edx,n+1
jl @lp1
end;
label3.Caption:=inttostr(m);
end;
begin
vvod(x);
max(x);
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=4;
Type massiv=array[1..n]of integer;
var
Form1: TForm1;
x:massiv;
m:integer;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
Procedure Vvod (Var x:massiv);
Var i:integer;
begin
x[1]:=strtoint(edit2.Text);
x[2]:=strtoint(edit3.Text);
x[3]:=strtoint(edit4.Text);
x[4]:=strtoint(edit5.Text);
end;
Procedure max(var x:massiv);
VAR k2:integer;
begin
asm
mov edx, 1
mov esi, 0
mov m,0
@lp1:
mov edi,[x]
mov edi,[edi+edx*4-4]
mov k2,edi;
cmp k2,0;
jns @lp2
add m,edi
@lp2:
inc edx
cmp edx,n+1
jl @lp1
end;
label3.Caption:=inttostr(m);
end;
begin
vvod(x);
max(x);
end;
end.