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

Ваш аккаунт

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

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

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

(Delphi,ассемблерные вставки) Задача на массивы

24K
24 июня 2007 года
One Bad
12 / / 16.04.2007
Привет всем! Друзья, помогите плиз!! Нужна помощь по проге(чтобы допуск к экзамену получить(который в эту среду))! Задача в следующем:

Сам код программы должен быть на ассемблере, просто "запихан" в делфи!

Порядок выполнения работы:
1.Создайте Делфи-приложение, содержащее вложенные циклы, при этом ничего не выполняющее, например, for x:=1 to 32000 do for y:=1 to 32000 do ;. При этом время работы такой конструкции должно фиксироваться.
2.Определите время работы приложения.
3.Замените операторы циклов аналогично работающей последовательностью команд ассемблера, оформив ее как вставку.
4.Определите время работы приложения и сравните со значением, полученным ранее.
5.Используя средства ввода/вывода ЯВУ, выполните задания, максимально задействовав ассемблерный код:

"Дан ряд случайных целых чисел в количестве 300. Числа выбраны из диапазона [-10, 20]. Просуммировать отрицательные."

Есть приблизительный код программы, только не для отрицательных чисел:
Код:
.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


Это код другой программы, очень похожей по заданию на эту!
(сейчас стараюсь переделать на отрицательные)!

Заранее Благодарен!!!
24K
24 июня 2007 года
One Bad
12 / / 16.04.2007
Мне хотя бы последний 5-ый пункт!!
63
24 июня 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: One Bad

2.Определите время работы приложения.


Про то, как средствами WinAPI засечь время работы куска кода, тут писали много. Ищи в разделе по функции QueryPerformanceCounter.

Цитата: One Bad

5.Используя средства ввода/вывода ЯВУ, выполните задания, максимально задействовав ассемблерный код:


ЯВУ - Языки Высокого Уровня. Поясни этот пункт, а?:) Смысл в том, чтобы написать как можно больше на асме, а на ЯВУ - то, что на асме писать слишком громоздко? Или как?

24K
24 июня 2007 года
One Bad
12 / / 16.04.2007
Нужно главный код(не всю прогу), написать на асме, потом его "положить" в Делфи! Соответственно оформить правильно уже в Делфи!
10
24 июня 2007 года
Freeman
3.2K / / 06.03.2004
Как бы подошёл к задаче я.

Цитата: One Bad
1.Создайте Делфи-приложение, содержащее вложенные циклы, при этом ничего не выполняющее, например, for x:=1 to 32000 do for y:=1 to 32000 do ;


Написать код на Дельфи, поставить бряк на этой строке, при останове нажать Ctrl+Alt+C и посмотреть подстрочник ассемблера, сгенерированный компилятором. В 2006-й Студии его даже можно скопировать. Оптимизировать по вкусу.

257
24 июня 2007 года
kosfiz
1.6K / / 18.09.2005
не спец я в асме, но кое-что помню. вообщем получилось так:
Код:
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.

результат в миллисекундах. между блоками программы специально поставлено ожидание ввода пользователя, для большей объективности результатов нужно немного подождать. не исключено, что мог ошибиться.
24K
24 июня 2007 года
One Bad
12 / / 16.04.2007
СПАСИБО!!!! kosfiz, огромное спасибо!!! то что ошибки будут ничего, разберусь!! Все же легче уже!!!
622
24 июня 2007 года
nilbog
507 / / 19.12.2006
 
Код:
mov cx,32000
L1:  push cx
      mov cx,32000
L2:  Loop L2
      pop cx
      Loop L1

а я бы вот так сделал фрагментик с вложеными циклами
кстати любопытно насколько быстрее будет - по идее оптимальнее на порядок
24K
25 июня 2007 года
One Bad
12 / / 16.04.2007
Спасибо Всем! Ваши подсказки были полезны и поучительны!
Прога готова(надеюсь допущусь), выглядет так:
Код:
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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог