Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
PIC как да сравня по голямо число с асемблер 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение 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

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Окт 30, 2010 9:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Хе, хе. RTFM :)

Вадиш от число А число В и проверяваш флаговете в STATUS - C,DC,Z :)

Carry
Digit Carry
Zero

Нещо такова :

MOVLW 'число А'
MOVWF 'адрес'
MOVLW 'число В'
SUBWF 'адрес'

и след това си проверяваш съответния бит в STATUS регистъра според това което те интересува.

Тия неща ги пише навсякъде.

Ако искаш да сравняваш по-големи числа става с малко повече инструкции, но принципа е същия.

Едит : както виждаш въобще не е уникална - ти ако беше компютър какво щеше да им правиш на числата - на кантар ли ще ги слагаш :)


Съб Окт 30, 2010 10:24 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение 
Всъщност само осем битово е числото..

Трябва ми за едно меню, един бутон ще върти менюто така променливата ID_menu ще се увеличава с 1 тоест при всяко натискане ще става ID_menu = ID_menu + 1 но ми трябва ID_menu да не минава стойността 4

И вече според съдържанието на ID_menu ще си направя програмната логика..

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

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Окт 30, 2010 10:43 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Чет Ное 29, 2007 2:22 pm
Мнения: 309
Местоположение: Vratsa
Мнение 
Проверяваш си го 4 пъти бутончето и избираш следващото меню , като подминеш четвъртотото се врщаш в началото . А може и да си проверяваш бутончето вътре в меню-тата и да викаш следващото а от последното извикваш първото ...
Aко все пак искаш да си затриеш един байт просто при всяко натискане на бутончето го инкрементираш , проверяваш б.0 и б.1 и си извикваш съответното меню , старшите битчета не те бъркат ама хич ;)


Съб Окт 30, 2010 11:01 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение 
другият начин е да го инициализирам в началото на стойност 4 и при всяко натискане да го декрементирам с едно докато не стане 0, а като стане 0 се отпраща пак на реда който го установява с стойност 4

но и твоето е идея също...

Ще я разгледам утре..

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Окт 30, 2010 11:24 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
за по-простите неща има едно просто решение. HI-Tech C. Създаваш си проект с него и правиш:
Код:
void main(void){
  int a;
  int b;
  int c;
  a=1;
  b=2;
  if(a>b){
    c=3;
  }
}

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

_________________
PIC SPBRG values calculator


Нед Окт 31, 2010 1:52 am
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение 
За сега това написах, не съм го пробвал..

Код:
;--------------------------------------------------------------------------------------
;
;         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   ; да отиди в следващото меню..
;------------------------------------------------------------------------------------------


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

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Нед Окт 31, 2010 10:31 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Ное 16, 2006 1:45 pm
Мнения: 18
Местоположение: Sofia
Мнение 
Ето ти една полезна програмка, дето прави тези сравнения на асм. Пишеш примерно IF A > B goto ET1 и тя ти генерира кода за сравнение в клипборда. После пасте в МПЛАБ.


Прикачени файлове:
helper.rar [147.86 KiB]
213 пъти
Сря Ное 03, 2010 10:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Ное 22, 2004 11:24 pm
Мнения: 1923
Местоположение: Габрово
Мнение 
М'че пиковете нямат ли си команда асемблерска с която сравняват две числа? Върти ми се в главата, че май имаше нещо такова. Сравни това с онова и ако са еднакви презкочи един ред, ако се не лъжа.


Пет Ное 05, 2010 6:57 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение 
Бе като гледам добрия му стил на коментиране май най-важното за него е да схване
принципа на сравненията, оттам ще се оправи и сам.

Та принципът е елементарен: ако трябва >, = и < да се знаят, едното число се вади от другото.
Ако числата са без знак преносът в резултата казва кое е по-голямото; ако са със
знак знакът на резултата го казва. Не знам пиковете какви флагове имат ама тия
трябва да ги има някак. Това правят cmp инструкциите по разните процесори, само
дето не пишат резултата по регистри (което пък ги ограничава по размер, ако човек
иска да сравни 128 бита примерно ще трябва да направи 16 байта изваждане, с cmp
не става).

Ако сравнението е само за равенство, и EOR (aka XOR) стига.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Пет Ное 05, 2010 7:22 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Ако е за равенство с XOR става. Имат флагове, малко по-горе ги писах. Ама простото сравняване става ако е един байт. За повече битове вадиш "до безкрай"


Пет Ное 05, 2010 9:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение 
Е то и за равенство при по-дълга от процесорната дума трябва да влачиш резултата от останалите
EOR-ове, примерно трупаш ги с OR в отделен регистър и на края проверяваш нула ли е.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Съб Ное 06, 2010 12:54 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Да де, то няма как да е различно, особенно при RISC архитектури ...


Съб Ное 06, 2010 9:35 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение 
Пиковете нямат инструкция която да сравнява за по голямо или по малко...

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

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

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

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

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

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

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Сря Ное 10, 2010 6:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

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


Сря Ное 10, 2010 7:01 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни