| Автор |
Съобщение |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
 Логическо деление
Здравейте. Тъй като никаде не срещнах инструкция с която се извършва логическо деление при програмиране на PIC микроконтролер, реших да попитам как става. Искам да разделя 8 битово число от даден регистър на 2 и резултата да запиша в W. Моля Ви, помагаите. Благодаря предварително!
|
| Пон Мар 03, 2008 5:35 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
За да разделиш на 2 преместваш един разряд на дясно.
Примерно имаш в регистъра 0b00001000 (0x08)
Премествайки веднъж на дясно ->0b00000100 (0x04)
Премествайки веднъж на дясно ->0b00000010 (0x02)
И така ..... А справка в Гугъла направи ли ?
|
| Пон Мар 03, 2008 6:26 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
Имаш предвид въртене на дясно през С ли?
rrf (reg),w
Аритметичното, трябва да нулираш С на всяко врътване.
|
| Пон Мар 03, 2008 6:30 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
Благодаря за помоща, сега вече ми е ясно как става.  Ами гледах в Гугъл, но нищо не намерих по въпроса.
|
| Пон Мар 03, 2008 7:03 pm |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
Не ти трябва Гугъл, трябва да си спомниш, какво си учил по аритметика (двоична!), или ако не си, да наваксаш бързичко 
|
| Пон Мар 03, 2008 9:44 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
Проблема е, че не съм учил двоична аритметика. Електрониката ми е хоби доста отдавна, от скоро се занимавам и с микроконтролери.
П.С. Извинявам се за оффтопика
|
| Пон Мар 03, 2008 10:32 pm |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
|
| Вто Мар 04, 2008 9:32 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
Прав си.  След 8-ми клас не можах да вляза в електротехникума със специалността която исках, но въпреки това не спирам да се занимавам с електроника защото това ми е мечтата. С микроконтролери се занимавам едва от 4-5 месеца. Сега съм почти на 18 години и след като завърша училище ще се постарая да вляза в Техническия университет със специалност която се занимава с нещо такова.
Благодаря за линка свързан с двоичната аритметика.
|
| Сря Мар 05, 2008 5:31 pm |
|
 |
|
Yanek
Ранг: Новодошъл
Регистриран на: Пет Юни 29, 2007 10:59 pm Мнения: 113
|
И аз за протокола... Това не е "логическо" деление. Логически може да разделим на 7 магарета 3 снопа суха люцерна  . Това си е чисто целочислено деление на дадена степен на 2 
|
| Сря Мар 05, 2008 8:50 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
В някой книги пише "логическо умножение", "логическо събиране"... и аз помислих, че и делението е логическо 
|
| Сря Мар 05, 2008 9:11 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
Логическо преместване наляво или надясно е когато битът, който излиза, пак влиза от другата страна, така наречено rotate left / right или logical shift left / right
arithmetical shift left / right е когато на свободното място влизат нули, такова въртене arithmetical shift left / right е точно умножение / деление по основата на бройната система - в случая "2". Също както ако преместим 25 веднъж наляво - получаваме 250 или умножение по основата - "10" при десетична бройна система.
в някои книги логическото преместване може и се казва логическо умножение, за мене не е много вярно, но не мисля че е голям проблем, важното е да знаеш кое какво е и как да го използваш!
|
| Чет Мар 06, 2008 12:55 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 1:48 pm Мнения: 4906 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
много аграрно казано  но точно 
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
| Чет Мар 06, 2008 2:29 pm |
|
 |
|
Cvetanov
Ранг: Новодошъл
Регистриран на: Пон Фев 21, 2005 2:14 pm Мнения: 191 Местоположение: Varna
|
Прегледай някой Instruction Set, за да си опресниш понятията.
ROL и LSL (ROR и LSR) са различни неща.
Не си прав за ASR. Там най-старшия бит остава непроменен, за да се запази знака.
Логическото събиране и умножение са понятия от булевата алгебра, по известни като AND и OR.
@Nikolay_90
Наистина е добре да прочетеш малко за двоична аритметика и логически операции. И с няколко примера ще ти се изяснят нещата.
_________________ Шанс едно на милион, обикновено се случва девет от десет пъти.
|
| Чет Мар 06, 2008 3:59 pm |
|
 |
|
stanleyhacker
Ранг: Новодошъл
Регистриран на: Чет Дек 02, 2004 7:22 pm Мнения: 140
|
 Да, май малко съм ги забравил тия неща. ASL беше като LSL, обаче не се сещам защо? (старшия бит не трябва пак да остане същия или се бъркам нещо?)
|
| Чет Мар 06, 2008 6:23 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
@stanleyhacker,
Логическо преместване наляво или надясно не е еквивалентно на rotate.
При Logical Shift Left и Logical Shift Right имаме запьлване на LSB, сьответно на MSB с 0-и.
При Rotate Left, LSB получава предходното MSB.
При Rotate Right, MSB получава предходното LSB. Има и друг вариант Rotate Left/Rotate Right trough Carry, кьдето се вьрти през Carry Flag-a.
Arithmetical Shift Left е еквивалентно на Logical Shift Left.
Arithmetical Shift Right имаме когато MSB bit-а запьлва постепенно всички позиции от ляво на дясно при такт.
Това е от гледна точка на дигиталния дизайн. От гледна точка на информатиката нещата са по-сложни. Каква математическа операция бива изпьлнена зависи от начина на предстаняве на числата: one's complement, two's complement, signed magnitude, fixed-point, floating-point и т.н.
Не случайно много компилатори тьлкуват ASL по различен начин.
|
| Чет Мар 06, 2008 8:38 pm |
|
|