| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| PIC как да сравня по голямо число с асемблер http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8248 |
Страница 1 от 2 |
| Автор: | traqn_savov [ Съб Окт 30, 2010 9:52 pm ] | ||||||||||||||||||
| Заглавие: | PIC как да сравня по голямо число с асемблер | ||||||||||||||||||
Който разбира от програмиране на C ще му стане ясно. Искам да направя това но с асемблер
пробвах една магия Дизасемблатора създаде следната уникална комбинация if(a < b);
|
|||||||||||||||||||
| Автор: | Cekins [ Съб Окт 30, 2010 10:24 pm ] |
| Заглавие: | |
Хе, хе. RTFM Вадиш от число А число В и проверяваш флаговете в STATUS - C,DC,Z Carry Digit Carry Zero Нещо такова : MOVLW 'число А' MOVWF 'адрес' MOVLW 'число В' SUBWF 'адрес' и след това си проверяваш съответния бит в STATUS регистъра според това което те интересува. Тия неща ги пише навсякъде. Ако искаш да сравняваш по-големи числа става с малко повече инструкции, но принципа е същия. Едит : както виждаш въобще не е уникална - ти ако беше компютър какво щеше да им правиш на числата - на кантар ли ще ги слагаш |
|
| Автор: | traqn_savov [ Съб Окт 30, 2010 10:43 pm ] |
| Заглавие: | |
Всъщност само осем битово е числото.. Трябва ми за едно меню, един бутон ще върти менюто така променливата ID_menu ще се увеличава с 1 тоест при всяко натискане ще става ID_menu = ID_menu + 1 но ми трябва ID_menu да не минава стойността 4 И вече според съдържанието на ID_menu ще си направя програмната логика.. Абе забавления общо взето... |
|
| Автор: | sigkill [ Съб Окт 30, 2010 11:01 pm ] |
| Заглавие: | |
Проверяваш си го 4 пъти бутончето и избираш следващото меню , като подминеш четвъртотото се врщаш в началото . А може и да си проверяваш бутончето вътре в меню-тата и да викаш следващото а от последното извикваш първото ... Aко все пак искаш да си затриеш един байт просто при всяко натискане на бутончето го инкрементираш , проверяваш б.0 и б.1 и си извикваш съответното меню , старшите битчета не те бъркат ама хич |
|
| Автор: | traqn_savov [ Съб Окт 30, 2010 11:24 pm ] |
| Заглавие: | |
другият начин е да го инициализирам в началото на стойност 4 и при всяко натискане да го декрементирам с едно докато не стане 0, а като стане 0 се отпраща пак на реда който го установява с стойност 4 но и твоето е идея също... Ще я разгледам утре.. |
|
| Автор: | npelov [ Нед Окт 31, 2010 1:52 am ] | |||||||||
| Заглавие: | ||||||||||
за по-простите неща има едно просто решение. HI-Tech C. Създаваш си проект с него и правиш:
После избираш View->Disassembly Listing. |
||||||||||
| Автор: | traqn_savov [ Нед Окт 31, 2010 10:31 am ] | |||||||||
| Заглавие: | ||||||||||
За сега това написах, не съм го пробвал..
Едит даже открих грешка трябва да променя етикетите иначе ще се препокрият |
||||||||||
| Автор: | Gosho75 [ Сря Ное 03, 2010 10:57 am ] | ||
| Заглавие: | |||
Ето ти една полезна програмка, дето прави тези сравнения на асм. Пишеш примерно IF A > B goto ET1 и тя ти генерира кода за сравнение в клипборда. После пасте в МПЛАБ.
|
|||
| Автор: | Tisho [ Пет Ное 05, 2010 6:57 pm ] |
| Заглавие: | |
М'че пиковете нямат ли си команда асемблерска с която сравняват две числа? Върти ми се в главата, че май имаше нещо такова. Сравни това с онова и ако са еднакви презкочи един ред, ако се не лъжа. |
|
| Автор: | tgi [ Пет Ное 05, 2010 7:22 pm ] |
| Заглавие: | |
Бе като гледам добрия му стил на коментиране май най-важното за него е да схване принципа на сравненията, оттам ще се оправи и сам. Та принципът е елементарен: ако трябва >, = и < да се знаят, едното число се вади от другото. Ако числата са без знак преносът в резултата казва кое е по-голямото; ако са със знак знакът на резултата го казва. Не знам пиковете какви флагове имат ама тия трябва да ги има някак. Това правят cmp инструкциите по разните процесори, само дето не пишат резултата по регистри (което пък ги ограничава по размер, ако човек иска да сравни 128 бита примерно ще трябва да направи 16 байта изваждане, с cmp не става). Ако сравнението е само за равенство, и EOR (aka XOR) стига. |
|
| Автор: | Cekins [ Пет Ное 05, 2010 9:28 pm ] |
| Заглавие: | |
Ако е за равенство с XOR става. Имат флагове, малко по-горе ги писах. Ама простото сравняване става ако е един байт. За повече битове вадиш "до безкрай" |
|
| Автор: | tgi [ Съб Ное 06, 2010 12:54 am ] |
| Заглавие: | |
Е то и за равенство при по-дълга от процесорната дума трябва да влачиш резултата от останалите EOR-ове, примерно трупаш ги с OR в отделен регистър и на края проверяваш нула ли е. |
|
| Автор: | Cekins [ Съб Ное 06, 2010 9:35 am ] |
| Заглавие: | |
Да де, то няма как да е различно, особенно при RISC архитектури ... |
|
| Автор: | traqn_savov [ Сря Ное 10, 2010 6:13 pm ] |
| Заглавие: | |
Пиковете нямат инструкция която да сравнява за по голямо или по малко... Това е много голям минус Още се мъча де с това, доста е трудно за представяне... Иначе ако се чудите какво правя.. половината софтуер е написан и е тестван работи.. до тук добре, ама графичният интерфейс е греда, прегледах тези в нета правените повечето са за забавление да изписват числа.. Ама аз съм тъп и упорит де продължавам да се мъча... |
|
| Автор: | Cekins [ Сря Ное 10, 2010 7:01 pm ] |
| Заглавие: | |
Що да е лошо? Както казах, това все пак е RISC процесор. За смекта на това 4 инструкции се изпълняват за 4 клока (99% И затова повечето хора си ползват асемблера само за времево критични задачи или когато компилатора бълва глупости при разни омагьосани задачки. Всичко останало на C, Паскал, Бейсик и кой на квот му е удобно. Като искаш да има инструкции за всичко вземай някой Pentium и джари. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|