Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Asm-->Pascal] среднее арифметическое, ассемблерная вставка в паскаль 
V
    Опции темы
Feroce
Дата 18.5.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.5.2009

Репутация: нет
Всего: нет



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

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.
PM MAIL   Вверх
taiven
Дата 19.5.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



Код

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-разрядная, то естественно немного по-другому будет...

Это сообщение отредактировал(а) taiven - 19.5.2009, 15:55
PM   Вверх
Feroce
Дата 20.5.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.5.2009

Репутация: нет
Всего: нет



Спасибо))
taiven, можешь мне её прям вставить в нужное место и удалить из исходной программы лишнее?))
Пожалуйста)))))
и комментарии)) очень надо))))
PM MAIL   Вверх
taiven
Дата 21.5.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



это
Код

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;

PM   Вверх
Feroce
Дата 21.5.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.5.2009

Репутация: нет
Всего: нет



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

А если не 16-разрядная?
У меня почему-то не идёт((((( Из-за чего это может быть?
PM MAIL   Вверх
taiven
Дата 21.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



попробуй так
Код

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.

PM   Вверх
Feroce
Дата 25.5.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.5.2009

Репутация: нет
Всего: нет



Спасибо большое)))
Задача правда не запустилась, выдал: must be in 8087 mode to compile this
Но мне всё же удалось сдать smile 
 smile 
PM MAIL   Вверх
taiven
Дата 25.5.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: 4
Всего: 9



Цитата

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

Если у тебя Turbo Pascal, то достаточно было зайти в Options->Compiler... и отметить пункт 8087/80287, тогда всё бы запустилось  smile 
PM   Вверх
Feroce
Дата 31.5.2009, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.5.2009

Репутация: нет
Всего: нет



я туда заходила и вводила в строку 8087, но видимо не надо было вводить?)) Просто не видела этих пунктов%))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.