На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> деление в ARM
    Приветствую

    В ARM нет инструкции деления
    Как же производить тогда это деление?
      наверно в столбик :) , если тебе поможет могу привести вариант на С
        да нет, какой нафиг столбик
        скорость всего в 12 раз ниже умножения (вроде)

        хотя давай код - посмотрю
          ExpandedWrap disabled
            //    z/x
            unsigned int div(unsigned int z, unsigned int x)
            {
                 int i;
                 unsigned int tmp = 0;
                 for (i = 1; i <= 32; ++i )
                 {
                     tmp = (tmp << 1) | (z >> 31);
                     z <<= 1;
                     if (tmp >= x)
                     {
                         tmp -= x;
                         ++z;
                     }
                }
                // в tmp остаток
                // в z частное
                  return z;
            }
            нет - какой-то неоптимальный алгоритм или подпорченный из-за C специфики
            я переписал его на ассемблере - увеличил скорость в 4.5 раза
            но a/b работает еще в 5 раз быстрее - и по алгоритму его на столько не убыстрить просто

            наверное существует более оптимальный?
              Цитата Fireman @
              но a/b работает еще в 5 раз быстрее

              ты же говорил что там нет деления :wacko:
                нет - я написал в C++ a/b, он как-то имулировал эту функцию и она работала (эта имуляция) в 5 раз быстрее чем тот код
                  А пробовал посмотреть как он эмулировал?
                  если b константа он мог деление заменить умножением, в случае когда результат умножения записывается не в один регистр а в два, аналогично mul в x86
                    Цитата Fireman @
                    но a/b работает еще в 5 раз быстрее


                    А "под чем" работаете ?
                    я использую IAR для TMS470xx.
                    Посмотрел отладчиком - там вызывается для UINT
                    функция divu32_a, рассмотреть ее команды можно без проблем.
                    В профешшынал версии весьма вероятно и исходники прилагаются.
                    Однако нужно заметить, что IAR очень хорошо оптимизирует
                    программу.
                    Фокусы типа
                    ExpandedWrap disabled
                       a=10;b=5; a = a/b; // тут компилер сам вычислит результат.
                      // или
                       a = getchar();
                       b=2;
                       a=a/b; // компилер не будет "делить" - сгенерит коды для сдвига

                    "не проходят". Такими способами не удается заставить компилер
                    использовать библиотечную процедуру деления.
                    Что приводит к весьма сильному ускорению процесса.
                    ;)
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0.0976 ]   [ 15 queries used ]   [ Generated: 25.10.26, 08:54 GMT ]