Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 22:20   #1
viperrr
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 28
По умолчанию ассемблерные вставки в delphi

Язык программирования – Delphi. В виде ассемблерных вставок реализовать функции, которые выполняют следующие действия:

1. Сложение двух переданных функции операндов.
2. Выбор наибольшего из трех переданных функции операндов.
3. Поиск минимального элемента в массиве.
4. Поэлементное суммирование двух одномерных массивов произвольной длины (длины могут быть не равны).
5. Дополнительное задание: Сортировка вставкой.

в данном коде реализованы первые 3 задания, никак не выходит выполнить
Поэлементное суммирование двух одномерных массивов произвольной длины.
вылетает ошибка вроде переполнения памяти ...(процедура Button5Click) (во вложениях вся программа)
Вложения
Тип файла: rar ассемблер.rar (1.21 Мб, 40 просмотров)
Если ты знаешь еще хоть одну рифму к слову "ЗВЕЗДА", то ты настоящий поэт!(рифма должна быть в единственном числе)

Последний раз редактировалось viperrr; 09.12.2009 в 22:23.
viperrr вне форума Ответить с цитированием
Старый 09.12.2009, 22:22   #2
viperrr
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 28
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Edit4: TEdit;
    Button3: TButton;
    Edit5: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button2: TButton;
    Button4: TButton;
    Edit6: TEdit;
    Label5: TLabel;
    Edit7: TEdit;
    Label6: TLabel;
    Edit8: TEdit;
    Edit9: TEdit;
    Button5: TButton;
    Edit10: TEdit;

    procedure Button1Click(Sender: TObject);
    function sum(a,b:integer):longword;
    function min(w: Array of integer ; l:integer):LongWord;
    function  sr(a,b,d:integer):longword;
    function GetSubStr(st:string; expl:string ;n:integer):string;
    function plus(m,x,v:array of integer;n,k:integer):longint;
    function vivid(v:array of integer;n,k:integer):longword;

    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
a,q,b,c,z,l,d,k,e:integer;
mas:array of integer;
st,st2:string;
sum:array of integer;
implementation

{$R *.dfm}

function  TForm1.Sum(a,b:integer):longword;

 begin
 asm

  mov eax, a
  mov ebx, b
  add eax,ebx
  mov result, eax

  end;
  c:=result;
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=strtoint(Edit1.Text);
b:=strtoint(Edit2.Text);
sum(strtoint(Edit1.text),strtoint(Edit2.text));
form1.edit3.text:=inttostr(c);
end;

function  TForm1.sr(a,b,d:integer):longword;
begin
asm
mov eax, a
mov ebx, b
mov ecx, d
cmp eax , ebx

jnl @FirstFlow
mov result, ebx
jmp @fin

@firstflow:
mov result, eax

@fin:
mov edx,result
cmp edx,ecx
jnl @sekondflow
mov  result, ecx
jmp @all

@sekondflow:
mov result,edx

@all:

end;
z:=result;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
sr(strtoint(Edit1.text),strtoint(Edit2.text), strtoint(Edit4.text));
form1.edit5.text:=inttostr(z);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Edit1.Clear;
Form1.Edit2.Clear;
Form1.Edit3.Clear;
Form1.Edit4.Clear;
Form1.Edit5.Clear;
Form1.Edit6.Clear;
Form1.Edit7.Clear;
end;


function TForm1.min(w: Array  of integer ; l:integer ):LongWord;
var myTmp:LongWord;

begin

  asm

  mov eax,w
  mov ecx,l
  mov ebx,[eax] //принимаем первый элемент за минимум
  mov esi,1 //счетчик




  @sr:

  mov edx,eax[esi*4]
  cmp ebx,edx        //сравниваем 2й элемент с мигимум

  jle @firstmin
  mov ebx,edx
  jmp @dalee

  @firstmin:
  mov ebx,ebx

  @dalee:
  inc esi     //  увеличиваем счетчик для определения элемента массива
  dec ecx       // уменьшаем счетчик цикла

  jmp @prov

    @prov:
 cmp ecx,1        // проверка счетчика цикла,условие выхода
 je @fin
  jmp @sr

  @fin:
  mov result,ebx  // заносим наименьшее значение в результат

  end;
  q:=result;
  end;





 function TForm1.vivid(v:array of integer;n,k:integer):longword;
 begin
    asm
 mov eax,n
 mov ebx,k
 mov edi, v
 mov ebp,0
 cmp eax,ebx
 jnl @firstdlin
 mov esi,ebx
 jmp @su
 @firstdlin:
 mov esi,eax
 @su:
  mov edx,v[ebp*4]
  cmp esi,1
  je @all
  inc ebp
  dec esi
  jmp @su

  @all:
 mov result,eax
 end;
  e:=result;

 end;
  {mov ebx, w
 mov ebp,l
 //mov edi, [ebx]
  xor edi,edi
  mov esi, 4
 // mov eax, esi[edx*2]
  //mov result,eax

  @start_find_min:
    sub esi, 1         // начанаем с конца искать движемся к началу
    jbe @end_find_min     //ли дошли до первого, то окончен поиск
    mov edx,ebx[esi]        //зять элемент массива
    cmp edx,ebx[edi]        //равнить с минимумом
    jg @start_find_min    // если al>минимума, то продолжить цикл
        mov edi,esi        // иначе заменить индекс минимального
    jmp @start_find_min    // продолжить цикл

@end_find_min:
   mov result ,edi // результат}


 {end;
  q:=result;
  end;  }

procedure TForm1.Button4Click(Sender: TObject);
var i,l:integer;
w:array [1..5] of integer;

begin
st:=Edit6.Text;
l:=Length(St);
for i:=1 to l do
begin
st2:=copy(edit6.Text,i,1);

w[i]:=strtoint(st2);
end;
min(w,l);
form1.Edit7.Text:=IntToStr(q);
 end;

 {for i:=1 to 5 do
begin
w[i]:=;
end; }
//w[i]:=GetSubStr(Edit1.text,' ',i);//используем пробел в качестве разделителя
//for i:=1 to 5 do
//st:=st+' '+w[i]+#13;
//L:=strtoint(st);
//ShowMessage(st);





function TForm1.GetSubStr(st:string; expl:string ;n:integer):string;
Var p,i:integer;
Begin
k:=0;
 for i:= 1 to n-1 do
 begin
  p:=pos(expl,st);
  st:=copy(st,p+1,Length(st)-p);
  while (pos(expl,st)=1) and (length(st)>0) do
   delete(st,1,1);
   k:=k+1;
 end;
p:=pos(expl,st);
if p<>0 then result:=copy(st,1,p-1)
else result:=st;

End;
Если ты знаешь еще хоть одну рифму к слову "ЗВЕЗДА", то ты настоящий поэт!(рифма должна быть в единственном числе)
viperrr вне форума Ответить с цитированием
Старый 09.12.2009, 22:22   #3
viperrr
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 28
По умолчанию

Код:
procedure TForm1.Button5Click(Sender: TObject);
var st3,st4,st5,st6,st7,o:string;
    j,n,k:integer;
    m,x,v:array of integer;
begin
  st3:=Edit8.Text;
  n:=length(st3);
  st4:=Edit9.Text;
  k:=length(st4);
  setlength(m,n);
  setlength(x,k);
  //setlength(sum,50);
  for j:=0 to (n-1) do
  begin
  st5:=copy(st3,j,1);
  m[j]:=strtoint(st5);
  end;
  for j:=0 to (k-1) do
  begin
  st6:=copy(st4,j,1);
  x[j]:=strtoint(st6);
  end;

  if n<k then
  begin
  //setlength(sum,k);
  for j:=0 to (k-1) do begin
  setlength(v,k);
  v[j]:=1;
  end;
  end
  else
  begin
  //setlength(sum,n);
  for j:=0 to (n-1) do begin
  setlength(v,n);
  v[j]:=1;
  end;
  end;

  plus(m,x,v,n,k);

{  if n<k then begin
  for j:=0 to (k-1) do
begin

 vivid(v,n,k);
 st7:=st7+' '+inttostr(e);

 ShowMessage(st7);
{o:=inttostr(v[j]);
st7:=st7+' '+o+#13;
L:=strtoint(st7);
ShowMessage(st7); }
{end;
end else
begin
for j:=1 to n do
begin
 vivid(v,n,k);
 st7:=st7+' '+inttostr(e);
 ShowMessage(st7);
end;



  //Edit10.Text:=inttostr(e);
end; }
 end;
function TForm1.plus(m,x,v:array of integer;n,k:integer):longint;

 begin
 

 asm


 mov eax,m //заносим массивы в регистры
 mov ebx,x
 mov ebp,v
 mov ecx,4 // длина массива 1
 mov edx,5 //  длина массива 2
 mov esi,0 // счетчик элемнтов

 cmp ecx,edx
 jnl @firstdlin   // выбор наибольшей длны массива
 mov edi,edx
 jmp @sum
 @firstdlin:
 mov edi,ecx
 @sum:
  mov ecx,m[esi*4]
  mov edx,x[esi*4]
  add ecx,edx
  mov v[esi*4],ecx
  inc esi
  dec edi
  cmp edi,1
  je @All
  jmp @sum

  @All:
  mov result,ebp

 end;
 //z:=result;
end;
end.
Если ты знаешь еще хоть одну рифму к слову "ЗВЕЗДА", то ты настоящий поэт!(рифма должна быть в единственном числе)
viperrr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на ассемблере или ассемблерные вставки. Gremlin Фриланс 6 26.01.2009 21:27
Ассемблерные вставки в Delphi Jupiter Общие вопросы Delphi 2 24.08.2008 16:41
Ассемблерные вставки Assassin Помощь студентам 1 26.05.2008 08:19
вставки из ассемблера макс07 Общие вопросы C/C++ 7 13.05.2008 19:19