Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Как би изглеждал този С код на асемблер за PIC16 примерно
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1036
Страница 1 от 1

Автор:  jony++ [ Вто Сеп 20, 2005 11:39 am ]
Заглавие:  Как би изглеждал този С код на асемблер за PIC16 примерно

Как биха изглеждал този С код на асемблер за PIC16 примерно

int T = 23;
int temp1, temp2;

temp1 = T%10;
temp2 = T/10;

Сигурно ще е нещо просто, но ....... май математика ми куца :roll:
Благодаря ви.

Автор:  Gogo [ Вто Сеп 20, 2005 2:34 pm ]
Заглавие: 

Намираш си процедурата на асм:
"Divide 16 bit int by 8 bit int to 8 bit int and remainder"
и виждаш как изглежда :D
temp2 ти е резултата, а temp1 остатъка.

Автор:  jony++ [ Вто Сеп 20, 2005 4:46 pm ]
Заглавие: 

Май е по-добре да кажа за какво ми е това деление защото може да се окаже че имало и по-лесен начин.....
Ами работата е там че искам да извеждам двуцифрени числа на динамичен 2 разряден 7 сегмендет LED и чрез това деление исках да разделя десеттиците от единиците.

Автор:  arcopal [ Вто Сеп 20, 2005 10:11 pm ]
Заглавие: 

методи - БОЛ! Но всичко по реда си!

1.не знам какъв формат данни ти трябва за ЛСД-то ама най-лесно според мен е да си зеделиш 200 байта (2 байта за число в интервала 0-99) и да си направиш едно масивче директно с исходните стойности... тъпо, обемно, но бързо! макар че за обема може да се поспори - не знам колко място заемат инструкциите реализиращи двете деления...
но пък простотата на този метод е неоспорима - свежда се до едно четене от масив!

2.ако все пак си останеш на деленетото... ВНИМАНИЕ - едното деление може да го замениш със ВАДЕНЕ!!!
Код:
temp2 = T/10; // вече това е първо!!!
temp1 = T%10; // temp2=T-temp1;



3. самото делене можеш да направиш като си напишеш класическата функция за бързо делене:
Код:
int fastdiv(int big, int div){
  while ( big>0 )
    if  ( big impair )   
    then big-=div ;
    else big>>1;
  return big;}
...
while:
   bitfsc   big, 0   ; if ( big pair ) //za tselta proverka na nuleviya bit!
   goto   impair   ; FALSE
pair:         ; TRUE
   addlw   0x00   ; W + 0 => C flag clears ]:->
   rrf   big, F   ; big>>1;
   goto   re
impair:
   movf   div, W   ; div -> W
   subwf   big, F   ; big - W -> big
re:
   bitfsc   STATUS, Z
   goto while;
...


4.става и като работиш с BCD-числа! разликата от "стандартните" двоично-дестични е, че след всяко "двоично" събиране/вадене "подравняваш" - тоест добавяш 0x6/0x60 на тетрадата в коята има пренос(проверяваш битове C, DC). когато ти потрябват отделните цифри - "распакетираш"(тоест вземаш поотделно всяка от тях като маскираш другата с AND 0) тетрадите по една в байт и си готов!

5.ЦЕНЕН ПИК-СЪВЕТ: погледни в сайта на Мicrochip, там има примери за разни алгоритми преобразования, деления(и за какло ли не) и описания/доунлоад на всевъзможни библиотеки![/code]

Автор:  jony++ [ Чет Сеп 22, 2005 11:01 am ]
Заглавие: 

Благодаря за прделожените варианти, но този код с деленено нещо неработи...

Код:
while:
   bitfsc   big, 0   ; if ( big pair ) //za tselta proverka na nuleviya bit!
   goto   impair   ; FALSE
pair:         ; TRUE
   addlw   0x00   ; W + 0 => C flag clears ]:->
   rrf   big, F   ; big>>1;
   goto   re
impair:
   movf   div, W   ; div -> W
   subwf   big, F   ; big - W -> big
re:
   bitfsc   STATUS, Z
   goto while;
[/code]

Автор:  [ Чет Сеп 22, 2005 11:51 am ]
Заглавие:  Re: Как би изглеждал този С код на асемблер за PIC16 примерн

...

Автор:  jony++ [ Чет Сеп 22, 2005 1:38 pm ]
Заглавие:  Re: Как би изглеждал този С код на асемблер за PIC16 примерн

Цитат:
Ами ровни се малко в сайта на MicroChip. Имат десетки AN с примери за деление и умножение.Освен това такава тема е за Академия, не е за тук, защото няма нищо сложно в това да разделиш 2 8-битови числа на асемблер за PICxxx


pirev, не ми се карай :( , малко съм неориентиран, но ще влезна в час. А това, че е лесно да разделиш две 8 битови числа е така, но като занеш алголитъма. На времето като са ми го преподавали това чудо, кой зане къде съм блеел като съм си мислел за какво ще са ми тия неща. Но ето че сега се наложи.

Автор:  arcopal [ Съб Сеп 24, 2005 4:38 pm ]
Заглавие: 

ПЪРВО СЕ ИЗВИНЯВАМ за тотално грешния и дори безмислен алгоритъм за "делене" който съм написал... ама така става когато човек бърза - да ми е за урок да знам да не се излагам! Значи за умножение и деление има два подхода:

1.последователно събиране/вадене към/от делимото на делителя и при всеки цикъл инкрементираш с единица променливата-резултат
2.същото като по-горе, но когато делимото е четно го умножаваш/делиш на две, като съответно променливата-резултат също се удвоява! тука има един момент ако почнеш да умножаваш от самото начало резултата и си го занулил предварително :twisted: ... класическа ситуация...

няма да поставам повече алгоритми за да не напиша пак някоя глупост, само ще дам ей този готин линк: http://www.convict.lu/Jeunes/Math/Fast_operations2.htm

темата наистина е за академията :oops:

Автор:  jony++ [ Нед Сеп 25, 2005 1:02 am ]
Заглавие: 

Благодаря много. Извинявам се че съм сложил темата тук, тя наистина е за академията.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/