Перейти к содержанию

Функция Ранда На Асме


DJ Димон

Рекомендуемые сообщения

Здравствуйте, у меня есть задачка, уместить некий код на си в 1кб памяти мк, код не влазит естественно)), пытаюсь оптимизировать.

В коде, одна из функций, функция ранда, есть такой вариант переписать её на асме и вставить в си, но, в асме я не силён, нужна функция выбора случайного числа в диаппазоне 0-254 ((

Компилятор использую CCS. Может кто знает как можно реализовать?

вот нашол, но она для билдера, в CCS не пойдёт(

procedure       _RandInt;
asm
{     ->EAX     Range   }
{     <-EAX     Result  }
       PUSH    EBX
{$IFDEF PIC}
       PUSH    EAX
       CALL    GetGOT
       MOV     EBX,EAX
       POP     EAX
       MOV     ECX,[EBX].OFFSET RandSeed
       IMUL    EDX,[ECX],08088405H
       INC     EDX
       MOV     [ECX],EDX
{$ELSE}
       XOR     EBX, EBX
       IMUL    EDX,[EBX].RandSeed,08088405H
       INC     EDX
       MOV     [EBX].RandSeed,EDX
{$ENDIF}
       MUL     EDX
       MOV     EAX,EDX
       POP     EBX
end;

Изменено пользователем DJ Димон

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

один из вариантов - сгенерировать таблицу на компе, а в прошивке разместить ее как готовый массив байтов, и хранить номер последнего выданного элемента массива, увеличивая номер на 1 каждый раз при вызове функции.

другой вариант - я где-то видел реализацию рандома в виде умножений (как в этом листинге на асме) или делений, с взятием остатка или младшего (старшего) байта результата, и в таком же духе.

есть смысл посмотреть исходники каких-либо run-time библиотек Борланда пяти-семи лет давности, они прямо в дистрибутивах были.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Если в составе МК есть АЦП, берите его младший разряд( там всегда шум) и в цикле формируйте бит.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

один из вариантов - сгенерировать таблицу на компе, а в прошивке разместить ее как готовый массив байтов, и хранить номер последнего выданного элемента массива, увеличивая номер на 1 каждый раз при вызове функции.

не пойдёт, памяти на это нет (озу - 64байт, заполнена на 80%, для проги 1кб, заполнена на 100%)

другой вариант - я где-то видел реализацию рандома в виде умножений (как в этом листинге на асме) или делений, с взятием остатка или младшего (старшего) байта результата, и в таком же духе.

а вот это бы подошло, если написано на асме, я сам не напишу(((

Если в составе МК есть АЦП, берите его младший разряд( там всегда шум) и в цикле формируйте бит.

ацп нету, есть таймер 0 не используется.

Изменено пользователем DJ Димон

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

вот нашол пример, Тынц но как его переделать под свой проект не понимаю((

надо чтото типа

int rand()
{
asm {

....

}
return rez;
}

int rand() чтоб возвращало число от 0 до 255

Есть знатоки по асму, которые смогут подсказать в этом вопросе?

Изменено пользователем DJ Димон

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

для AVR я не пишу, но для интелов - и на си и на асме

вот ссылочка http://www.daniweb.com/code/snippet216329.html#

я бы взял оттуда

// returns random integer from 1 to lim
//
int rand1(int lim)
{
 static long a = 100001;
 a = (a * 125) % 2796203;
 return ((a % lim) + 1);
}

//
// returns random integer from 1 to lim (Gerhard's generator)
//
int rand2(int lim)
{
 static long a = 1; // could be made the seed value
 a = (a * 32719 + 3) % 32749;
 return ((a % lim) + 1);
}

//
// returns random integer from 1 to lim (Bill's generator)
//

int rand3(int lim)
{
 static long a = 3;
 a = (((a * 214013L + 2531011L) >> 16) & 32767);
 return ((a % lim) + 1);
}

и скомпилировал бы для авр, с листингом

или дизассемблировал бы скомпилированную прошивку

результат можно почистить и вставить обратно в сишный код уже в виде инлайн-асма

а может и не придется чистить.

Ссылка на комментарий
Поделиться на другие сайты

для AVR я не пишу

ну сдесь тоже не AVR, не суть..

у меня щас вот такой код используется

int rand3(int lim)
{
 static long a = 3;
 a = (((a * 214013L + 2531011L) >> 16) & 32767);
 return ((a % lim) + 1);
}

попробую посмотрю что в асме компилятор пишет. спасибо

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

тут есть смысл попробовать упростить генератор, отказавшись от длинных целых чисел

тогда если нигде в прошивке больше не задействована длинная целочисленная арифметика, то можно будет сэкономить на соотв. коде библиотеки, т к она не попадет в скомпилированную прошивку

качество случайности пострадает, но и код усохнуть должен :)

Ссылка на комментарий
Поделиться на другие сайты

оспользовал один из предложенных вами варианто кода, один из них освободил мне 4% памяти, чего мне и было нужно чтоб запихать остаток кода))) память заполнена на 100% и весь код уместился... ничего на асме писать не пришлось...

Спасибо...

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

А что значит 214013L? что это long int?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

В TP используется вот такая формула для генерации случайных чисел:

; Compute next random number
; New := 8088405H * Old + 1

ЗЫ. Пример реализации у вас в 1 посте.

Ссылка на комментарий
Поделиться на другие сайты

Только не для контроллеров. Его придется слегка переделывать, не уверен что ассемблер (контроллерный конечно) поймет конструкцию MUL или [EBX] или еще какие "комповые" команды.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Я про "пример реализации". DJ Димон'у же надо было под контроллер (не понял только под какой, но это не важно) а он такие команды не съест. Всего лишь придется (скорее всего уже не ему а следующему искателю Рандома) переписывать под свою архитектуру.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Конечно же нет. В ATmega'x аппаратное умножение есть, а в ATtiny - нет, придется писать процедуру. Хотя для контроллера умножение на 08088405H может оказаться процессом долгим и требующим многих регистров (не менее 5)

Вроде бы русским языком написал

Всего лишь придется (...) переписывать под свою архитектуру
Кстати как вариант реализации функции - использовать значение таймера, тактируемого внешним RC-генератором.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Насколько мене известно прекрасные генераторы делали на сдвигах и элементах исключающее или.. Но у любого генератора проблема качаственной инициализации. Нужно использовать несколько сигналов, взять чтото с таймера, чтото с аналогового входа.. Пример реализации. Это псевдо рандом но если использовать регистр подлиньше и качественно его раз наполнить - то получается даже очень случайно :)

Ссылка на комментарий
Поделиться на другие сайты

Жуть какая :-) Не-е-е, на дискретной логике ранд требуется нечасто, а если и требуется, полно внешних случайных факторов (как в электронных кубиках время нажатия на кнопку например).

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Вы меня не поняли :) Я не предлагал делать его на логике :) Я предлагал это же сделать програмно. Тут вобщем то только сдвиги и исключающее или надо из команд.. Никакого умножения. Причём от длины регистра завилит качество ранодома а в програмном исполнении никто не мешает его сделать и в 40 бит или и длинее.

Ссылка на комментарий
Поделиться на другие сайты

давно это было  :rolleyes: писалось под проц PIC16F630, остановился на вот каком варианте:


// Функция выбора случайного числа
int rand()
{
static long a = 1; 
 a = (a * 32719 + 3) % 32749;
  return ((a % 254) + 1);
}

 

может кому-нибудь понадобится :rolleyes: 

функция использовалась для выбора случайного адреса устройства(slave) при включении B)немного глупо, но зашивать в каждый девайс адрес не хотелось  :rolleyes: в дальнейшем адрес выдавал хост...

Удовольствие критиковать мешает наслаждаться прекрасным. (це) Ж. Ла6рюйер

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Видел такую реализацию для компьютерного Си. mil_alex давал и другие Си-реализации. Но переводить их на асм не так просто.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @Гость Михаил, что мешает поставить и послушать? Что мешает потестить операционник из магазина на предмет подлинности, хотя бы замерить скорость нарастания выходного сигнала и сравнить с даташит? Из магазина с большой вероятностью может быть перемаркированный LM358, его сразу видно то характерной ступеньке на синусоиде и по частоте он просто "тормоз" по сравнению с ne. Ваш LG медленнее в три раза от исходного. Ваш lg со своими 3 МГц должен быть однозначно лучше, чем перемаркированный ne из 358. Например, разницы между оригинальным LM833 и с 8 МГц хорошей подделкой ne с Али не слышно.
    • Что Вы вообще делаете в институте с такими "знаниями"? Задачка для средней группы детского сада.
    • По ссылке все понятно, если Вам не понятно обратитесь к специалисту он Вам сделает.
    • Всё верно, не спорю, там маслом пропитано наверное. Я не высоковольтник. У меня корочки до 1000 V. На РЖД все кабели с бумажной изоляцией - сухие.  Шуршит бумага... ! Я пишу о чём знаю и видел. Капни водой, впитывает... Может у нас совсем древнее хозяйство..  Может быть, я лучше не видел. Так и допускаю. Очень хорошо знаю.. Там многослойная изоляция. Каждый слой  намотки - изолирован.  Все сопротивления идут в  +   +. Ничего личного, пережил несколько аварий из - за пробоев высоковольтных кабелей из бумаги с маслом. И всего - то за 6 лет работы электриком. Лучшая изоляция - стекло. Проверено. Не мной, но факты опыта других людей об этом говорят. Мне не надо своё мнение доказывать. Я люблю надёжность.
    • @Владислав2 все советские трансформаторы (не военные, от бытовой РЭА)), которые удалось разобрать, были с бумажной изоляцией. Допускаю, что бумага была специальная, т.к. в детстве сталкивался с таким "веществом" как электро-картон, у друга был лист, для всяких поделок (не радиолюбительских) его использовали.
    • 90% высоковольтных кабелей изоляция из бумаги... как больше полвека работают ХЗ...
×
×
  • Создать...