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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 23:51   #1
flyinsky
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 21
По умолчанию Задача с массивом вставка asm

Привет всем. Задача ("Знак суммы" (Ai * Bij) * X + "знак суммы" (Ci) * Y, где A B C - массивы)
делаю вставку асмовскую в паскале но зараза не хочет запускаться ошибки валятся вот что сделал

Код:
program q184006_2;

{$mode objfpc}{$H+}   // игнорит пишет Error 17 : Invalid compiler directive
{$ASMMODE intel}        //игнорит пишет Error 17 : Invalid compiler directive

const
  { Размерность массива }
  N=3;

type
  TMatrix=array[1..N,1..N]of Integer;  { Тип - матрица }
  TVector=array[1..N]of Integer;       { Тип - вектор }

var
  A,C:TVector;		{ Вектора}
  B:TMatrix;		{ Матрица }
  I,J,X,Y:Integer;

function CalcSum(A:TVector; B:TMatrix; C: TVector;  X, Y:Integer):Integer;
stdcall; Assembler;  // пишет Begin expected (ставлю после Begin  пишет Error 3 : Unknown identifier )

begin
  { Вводим данные }

  for I:=1 to N do begin
    for J:=1 to N do begin
      Write('B[',i,',',j,'] = '); ReadLn(B[i,j]);
    end;
  end;
  WriteLn;

  for I:=1 to N do begin
     Write('A[',i,'] = '); ReadLn(A[i]);
  end;
  WriteLn;

  for I:=1 to N do begin
     Write('C[',i,'] = '); ReadLn(C[i]);
  end;
  WriteLn;

  Write('X = '); ReadLn(X);
  Write('Y = '); ReadLn(Y);
  WriteLn;


{sum( (Ai * Bij) * X ) + sum( (Ci) * Y )}
{Расчет ведется следующим образом:}
{1) находим s1=SUM(j=1..3)SUM(i=1..3)(A[i]*B[i,j])}
{2) s1 = s1*X}
{3) находим s2=SUM(i=1..3)(C[i])}
{4) s2 = s2*Y}
{5) Результат s1+s2}

  asm
     push  esi
     push  edi
     push  ebx

     xor   ebx, ebx		{искомая сумма}

     mov   ecx, 3		{счетчик столбцов в массиве B}
     xor   edi, edi		{индекс элемента (i*N + j) в массиве B}
@sumLoop1:			{цикл по столбцам j массива B}
     push  ecx			{сохраним счетчик столбцов в массиве B}
     xor   ecx, ecx		{индекс в массиве A, i}
     mov   esi, A		{адрес массива А}
     push  edi			{сохраним индекс первого элемента в столбце}
@sumLoop2:			{цикл по строкам i массива В}
     mov   eax, [esi+ecx*4]	{элемент массива А, ECX = i}
     mov   edx, B		{адрес массива В}
     imul  dword ptr[edi*4+edx] {eax = A[i]*B[i*N+j]}
     add   ebx, eax		{накапливаем сумму}
     add   edi, N		{на следующий элемент столбца, i=i+1}
     inc   ecx			{на следующий элемент массива А}
     cmp   ecx, N		{прошли все строки у столбеца и массив А?}
     jb    @sumLoop2		{нет - на повтор}
     pop   edi			{восстанавливаем индекс первого элемента в
столбце}
     inc   edi			{на следующий столбец массива В}
     pop   ecx			{восстанавливаем счетчик столбцов в массиве B}
     loop  @sumLoop1		{по всем столбцам}

     mov   eax, ebx		{посчитанная сумма}
     imul  x			{умножаем на Х}
     mov   ebx, eax		{сохраним}

     xor   eax, eax		{посчитаем sum(ci)}
     mov   edi, C		{адрес массива С}
				{после последнего loop, ECX=0}
@sumLoop:			{цикл по элементам массива}
     add   eax, [edi+ecx*4]	{складываем, ECX = i}
     inc   ecx			{на следующий элемент}
     cmp   ecx, N		{проверим на конец}
     jb    @sumLoop
     imul  Y			{eax = sum * Y}

     add   eax, ebx		{eax = искомой сумме}

     pop   ebx
     pop   edi
     pop   esi
  end;


  WriteLn('Result = ', CalcSum(A, B, C, X, Y));

  ReadLn;
end.



Заранее благодарю !
flyinsky вне форума Ответить с цитированием
Старый 21.12.2011, 06:58   #2
flyinsky
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 21
По умолчанию

версия паскаль : TURBO PASCAL 7.1
flyinsky вне форума Ответить с цитированием
Старый 21.12.2011, 11:01   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
версия паскаль : TURBO PASCAL 7.1
Цитата:
Код:
{$mode objfpc}{$H+}   // игнорит пишет Error 17 : Invalid compiler directive
{$ASMMODE intel}        //игнорит пишет Error 17 : Invalid compiler directive

...
  push  esi
  mov   eax, ebx
Вы шутите?! Какие директивы ассемблера?! Какой 32-битный код (вы пытаетесь задействовать 32-х битные регистры).
ТурбоПаскаль - это DOS приложение. Поэтому ТОЛЬКО ИСКЛЮЧИТЕЛЬНО 16-ти битное приложение (и ассемблер можно использовать только 16-ти битные команды! например:
Код:
  asm
    push    ds
    mov     cx,StackWords
    jcxz    @@NoParams
    lds     si,StackData
    mov     ax,cx
    dec     ax
    shl     ax,1
    add     si,ax
    std
....
    end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2011, 22:44   #4
flyinsky
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 21
По умолчанию

Извиняюсь, пользую FPC, ошибка одна на другой к примеру где function CalcSum(A:TVector; B:TMatrix; C: TVector; X, Y:Integer):Integer;
stdcall; Assembler; то пишет Error illegal expression
flyinsky вне форума Ответить с цитированием
Старый 21.12.2011, 23:07   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,371
По умолчанию

А где у функции начало (begin), и где у функции конец (end)?
А где начало программы begin?
Думаю, что следует посчитать операторные скобки.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
asm вставка Акоб Паскаль, Turbo Pascal, PascalABC.NET 5 06.11.2011 00:46
задача с массивом GoldSieg Паскаль, Turbo Pascal, PascalABC.NET 10 19.10.2011 15:55
Задача с массивом AleNa666 Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2009 21:06
[C++] Задача с массивом Demigoddess Общие вопросы C/C++ 3 06.04.2009 17:10
задача с массивом bonys91 Помощь студентам 3 26.03.2009 22:11