Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Asm-->Pascal] среднее арифметическое


Автор: Feroce 18.5.2009, 15:45
Здравствуйте!
Мне надо в совсем несложную задачу на Паскале сделать ассемблерную вставку.
задача:  найти среднее арифметическое чисел одномерного массива.
Помогите, пожалуйста))
Желательно с комментариями {ничего не понимаю...стыдно(((((}
Я просто в Паскале решила, не знаю как переделать, чтобы была именно эта вставка.

program assemblery;
type mass= array [1..100] of integer;
var a: mass;
    i,n,s:integer;
    sa:real;
Begin
  randomize;
  writeln ('vvedi kol-vo 4isel massiva',n);
  readln(n);
  for i:=1 to n do
  begin
   a[i]:=random(10);
   write(a[i],' ')
  end;
  s:=0;
  for i:=1 to n do s:=s+a[i];
  sa:=s/n;
  writeln('srednee arifmti4eskoe=',sa:5:3);
 readln
end.

Автор: taiven 19.5.2009, 15:52
Код

xor eax, eax
xor esi, esi

mov ecx, n
begin:
   add eax, a[esi]
   add esi, 4
loop begin

mov s, eax

fild s
fidiv n
fstp sa


P.S. если программа 16-разрядная, то естественно немного по-другому будет...

Автор: Feroce 20.5.2009, 10:55
Спасибо))
taiven, можешь мне её прям вставить в нужное место и удалить из исходной программы лишнее?))
Пожалуйста)))))
и комментарии)) очень надо))))

Автор: taiven 21.5.2009, 13:36
это
Код

asm
        //предварительное обнуление нужных регитров
        xor eax, eax            //eax = 0(в регистре eax будет храниться сумма элементов массива)
        xor esi, esi            //esi = 0(esi используется для индексирования)
        
        //делаем   for i:=1 to n do s:=s+a[i];
        mov ecx, n              //помещаем в регистр ecx содержимое переменной n
                                //т.е. задаём количество шагов цикла
        begin:                  //метка begin(можно сказать начало цикла...)
            add eax, a[esi]     //eax = eax + a[esi](думаю тут всё понятно)
            add esi, 4          //увеличиваем индекс для перехода к след. элементу массива a
        loop begin              //уменьшение содержимого регистра ecx на 1
                                //если сожержимое регистра ecx не стало равно нулю, то переходим к метке begin
                                //т.е. выполняем след. шаг цикла
        mov s, eax              //помещаем в переменную s содержимое регистра eax

        //теперь   sa:=s/n;
        fild s                  //загрузка s в вершину стека
        fidiv n                 //помещённое в вершину стека число делим на n
        fstp sa                 //помещаем результат этого деления в переменную sa
end;

надо вставить вместо 
Код

  for i:=1 to n do s:=s+a[i];
  sa:=s/n;

Автор: Feroce 21.5.2009, 14:58
Цитата(taiven @ 19.5.2009,  15:52)
P.S. если программа 16-разрядная, то естественно немного по-другому будет...

А если не 16-разрядная?
У меня почему-то не идёт((((( Из-за чего это может быть?

Автор: taiven 21.5.2009, 19:03
попробуй так
Код

type mass= array [1..100] of integer;
var a: mass;
    i,n,s:integer;
    sa:double;
Begin
  randomize;
  writeln ('vvedi kol-vo 4isel massiva',n);
  readln(n);
  for i:=1 to n do
  begin
   a[i]:=random(10);
   write(a[i],' ')
  end;

  asm
    xor ax, ax
    xor si, si

    mov cx, n

    @begin:
       add ax, word ptr a[si]
       add si, 2
    loop @begin

    mov s, ax

    fild s
    fidiv n
    fstp sa
  end;

  writeln('srednee arifmti4eskoe=',sa:5:3);
 readln
end.

Автор: Feroce 25.5.2009, 15:10
Спасибо большое)))
Задача правда не запустилась, выдал: must be in 8087 mode to compile this
Но мне всё же удалось сдать smile 
 smile 

Автор: taiven 25.5.2009, 15:32
Цитата

Задача правда не запустилась, выдал: must be in 8087 mode to compile this

Если у тебя Turbo Pascal, то достаточно было зайти в Options->Compiler... и отметить пункт 8087/80287, тогда всё бы запустилось  smile 

Автор: Feroce 31.5.2009, 07:28
я туда заходила и вводила в строку 8087, но видимо не надо было вводить?)) Просто не видела этих пунктов%))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)