Микроконтролери и електроника
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), If(a > b), if(a <= b), if(a >= b)



пробвах една магия :D от си да го обърна на асемблер и после да го дизасемблирам (моля не питайте защо)

Дизасемблатора създаде следната уникална комбинация

if(a < b);
Код:
BCF 0x3, 0x5
   3F7    080D     MOVF 0xd, W
   3F8    3A80     XORLW 0x80
   3F9    0090     MOVWF 0x10
   3FA    080F     MOVF 0xf, W
   3FB    3A80     XORLW 0x80
   3FC    0210     SUBWF 0x10, W
   3FD    1903     BTFSC 0x3, 0x2
   3FE    080E     MOVF 0xe, W

Автор:  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 ще си направя програмната логика..

Абе забавления общо взето... 8O :? :D

Автор:  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. Създаваш си проект с него и правиш:
Код:
void main(void){
  int a;
  int b;
  int c;
  a=1;
  b=2;
  if(a>b){
    c=3;
  }
}

После избираш View->Disassembly Listing.

Автор:  traqn_savov [ Нед Окт 31, 2010 10:31 am ]
Заглавие: 

За сега това написах, не съм го пробвал..

Код:
;--------------------------------------------------------------------------------------
;
;         Menu_inj_time.inc
;
;
;------------------------------------------------------------------------------------
Menu_inj_time            ; Етикет.
   call   m_inj_dsp_f_i   ; извикай първоначалната индификация на менюто..
buttonup               ;
   btfsc   up_button      ; натиснат ли е бутона за инкрементиране..
   goto   buttondn      ; не отиди на етикета buttondn
   movlw   D'5'         ; да зареди работният регистър със стойността 5
   call   Wait         ; изчакай 5 милисекунди | докато бутона се установи. 
   btfsc   up_button      ; още ли натиснат ли е бутона за инкрементиране..
   goto   buttondn      ; не не отиди на етикета buttondn
   call   bitton_beep      ; да извикай bitton_beep (произвежда кратък сигнал)
   call    Tim_inj_set_up   ; извикай    (Сверява необходимото време)
   call   show_inj_time   ;
buttondn               ;
   btfsc   dn_button      ; натиснат ли е бутона за декрементиране..
   goto   select_menu_inj   ; не отиди на етикета select_menu_inj
   movlw   D'5'         ; да зареди работният регистър със стойността 5
   call   Wait         ; изчакай 5 милисекунди | докато бутона се установи. 
   btfsc   dn_button      ; още ли натиснат ли е бутона за декрементиране..
   goto   select_menu_inj   ; не не отиди на етикета select_menu_inj
   call   bitton_beep      ; да извикай bitton_beep (произвежда кратък сигнал)
   call    Tim_inj_set_dn   ; извикай    (Сверява необходимото време)
   call   show_inj_time   ;
select_menu_inj
   btfsc   menu_button      ; натиснат ли е бутона за избор на меню
   goto   buttonup      ; не върни се на buttonup и започни проверката от начало.
   movlw   D'5'         ; да зареди работният регистър със стойността 5
   call   Wait         ; изчакай 5 милисекунди | докато бутона се установи. 
   btfsc   menu_button      ; още ли натиснат ли е бутона за избор на меню.
   goto   buttonup      ; не не отиди на етикета buttonup..
   goto   Menu_cicle_ps   ; да отиди в следващото меню..
;------------------------------------------------------------------------------------------


Едит даже открих грешка трябва да променя етикетите иначе ще се препокрият

Автор:  Gosho75 [ Сря Ное 03, 2010 10:57 am ]
Заглавие: 

Ето ти една полезна програмка, дето прави тези сравнения на асм. Пишеш примерно IF A > B goto ET1 и тя ти генерира кода за сравнение в клипборда. После пасте в МПЛАБ.

Прикачени файлове:
helper.rar [147.86 KiB]
213 пъти

Автор:  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 ]
Заглавие: 

Пиковете нямат инструкция която да сравнява за по голямо или по малко...

Това е много голям минус :? :? :lol: :evil:

Още се мъча де с това, доста е трудно за представяне...

Иначе ако се чудите какво правя.. :lol: мъча се нещо такова да направя. http://www.obd2-bg.com/komutator/

половината софтуер е написан и е тестван работи..

до тук добре, ама графичният интерфейс е греда, прегледах тези в нета правените повечето са за забавление да изписват числа.. :D ама не ми вършат работа...

Ама аз съм тъп и упорит де продължавам да се мъча... :o :( :D

Автор:  Cekins [ Сря Ное 10, 2010 7:01 pm ]
Заглавие: 

Що да е лошо? Както казах, това все пак е RISC процесор. За смекта на това 4 инструкции се изпълняват за 4 клока (99% :P )
И затова повечето хора си ползват асемблера само за времево критични задачи или когато компилатора бълва глупости при разни омагьосани задачки. Всичко останало на C, Паскал, Бейсик и кой на квот му е удобно.

Като искаш да има инструкции за всичко вземай някой Pentium и джари.

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