FAQ | Points | Add... | Recent posts | Search | Register | Log in


Assembler 8051 dzielenie 16bitowe


Post new topic  This topic is locked      Main Page -> Forum Index -> Microcontrollers Generally -> 51 Microcontrollers -> Assembler 8051 dzielenie 16bitowe
Author
Message
aml24
Poziom 3
Poziom 3


Joined: 03 Jan 2009
Posts: 5

Post#1 Post from the author of the topic 18 Mar 2010 20:01   

Assembler 8051 dzielenie 16bitowe


Witam!
Mam pytanie odnośnie poniższego programu. Program realizuje dzielenie 16bitowe. Liczby są wprowadzane przez porty P1,P0(dzielna) i P3,P2(dzielnik).Wyniki natomiast zapisywane do komórek pamięci 30h,31h. Program działa poprawnie,lecz gdy wpisuje dzielnik 0 to program się przywiesza i juz dalej nie liczy. Czy ma ktoś może pomysł jak to zabezpieczyć przed dzieleniem przez zero.
Program:
start:

MOV R0,P0
MOV R1,P1
MOV R2,P2
MOV R3,P3

CLR C
MOV R4,#00h
MOV R5,#00h
MOV B,#00h ;zlicza liczbe przesuniec w lewo

dziel1:
INC B
MOV A,R2
RLC A
MOV R2,A ;dzielnik mlodsze czesc
MOV A,R3 ;dzielnik starsza czesc
RLC A
MOV R3,A ;zapis starszej czesci dzielnika na port
JNC dziel1 ;skacze dopoki flaga jest 0


dziel2:
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A
CLR C
MOV 07h,R1 ;starsza czesc dzielnej
MOV 06h,R0 ;mlodsza czesc dzielnej
MOV A,R0 ;wpisanie mlodszej czesci dzielnej do A
SUBB A,R2
MOV R0,A ;zapisuje aktualna dzielna
MOV A,R1 ;wpisanie starszej czesci dzielnej do A
SUBB A,R3 ;odejmowanie starszej czesci dzielnika
MOV R1,A ;zapis aktualnej starszej czesci w starsza czesc dzielnika
JNC dziel3 ;jesli flaga nie jest ustawiona, to wynikiem jest 1
MOV R1,07h ;jesli wynik jest 0 zapisz i wroc do odejmowania
MOV R0,06h

dziel3:
CPL C
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
DJNZ B,dziel2
MOV 30H,05h ; R3/R2 starsza czesc
MOV 31H,04h ; R3/R2 mlodsza czesc
SJMP start
END
Back to top
   
Dżyszla
Poziom 24
Poziom 24


Joined: 15 May 2005
Posts: 4528
Location: Żory (kiedyś Opole)

Post#2 18 Mar 2010 20:59   

Re: Assembler 8051 dzielenie 16bitowe


CMP i skok do końca
Back to top
   
aml24
Poziom 3
Poziom 3


Joined: 03 Jan 2009
Posts: 5

Post#3 Post from the author of the topic 18 Mar 2010 21:22   

Re: Assembler 8051 dzielenie 16bitowe


w którym miejscu ma to być dopisane? wydaje mi się, że nie ma takego rozkazu
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 18 Mar 2010 21:22   





Back to top
   
tadzik85
Poziom 22
Poziom 22


Joined: 28 Feb 2007
Posts: 1571
Location: Bydgoszcz

Post#4 18 Mar 2010 21:33   

Re: Assembler 8051 dzielenie 16bitowe


Przed dzieleniem, sprawdź czy dzielna =0 jeśli tak to omiń operacje dzielenia.

Przecież dzielenie przez 0 jest niedozwolone, stąd zawieszanie. :D
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#5 18 Mar 2010 22:28   

Re: Assembler 8051 dzielenie 16bitowe


tadzik85 wrote:
Przecież dzielenie przez 0 jest niedozwolone, stąd zawieszanie. :D

Co Ty powiesz? :D
Na pewno nie. Jeszcze nie widziałem programu który by się zawieszał dzieląc przez zero. Nawet moje programy się nie zawieszają ;)
Program powinien po prostu zwrócić błędny wynik, a jak jest sprytniejszy to powinien zwrócić flagę błędu.
A ten jeżeli się zawiesza, to znaczy że coś w nim nie tak i tyle.
Back to top
   
tadzik85
Poziom 22
Poziom 22


Joined: 28 Feb 2007
Posts: 1571
Location: Bydgoszcz

Post#6 18 Mar 2010 22:37   

Re: Assembler 8051 dzielenie 16bitowe


Nie od parady był ten uśmieszek. Cóż kolega stworzył bardzo mądry programik :D
Back to top
   
Google

Google Adsense


Post# 18 Mar 2010 22:37   





Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#7 19 Mar 2010 11:05   

Re: Assembler 8051 dzielenie 16bitowe


tadzik85 wrote:
Nie od parady był ten uśmieszek.

Dlaczego?

tadzik85 wrote:
Cóż kolega stworzył bardzo mądry programik :D

No to wręcz przeciwnie. Gorszy. Dlatego napisałem że nawet on się nie zawiesza.

Chodzi mi o to że klasyczny algorytm dzielenia to zwykła pętla przesuwająca bity.
Nawet jak dzielna będzie równa 0 to pętla powinna się wykonać tyle samo razy co zawsze, w przypadku dzielenia 16-to bitowego 16-cie razy.
Możliwości zawieszenia nie ma, po prostu wynik będzie błędny.
Co innego tutaj. Bo tutaj jest inny algorytm. Tutaj jest odejmowanie i to już może się zawiesić.
Back to top
   
kemot55
Poziom 19
Poziom 19


Joined: 04 Jun 2007
Posts: 716
Location: Łódź

Post#8 19 Mar 2010 11:32   

Re: Assembler 8051 dzielenie 16bitowe


Kolega Dżyszla miał na myśli porównanie CMP (skrót myślowy:-)) a nie konkretną instrukcję
Zrób w 5 linii np. tak:
mov a,P2
orl a,P3
jnz etykieta
call ERROR
sjmp koniec
etykieta:
;reszta procedury dzielenia
koniec:

Przy czym procedura ERROR musi jakoś poinformować program, że wykonano próbę dzielenia przez zero.
A tak na marginesie - algorytm powinien być tak napisany, żeby nigdy takie dzielenie nie miało miejsca, nawet bez sprawdzania (to taka uwaga praktyczna)
Back to top
   
atom1477
Poziom 25
Poziom 25


Joined: 14 Jul 2005
Posts: 6360

Post#9 19 Mar 2010 12:03   

Re: Assembler 8051 dzielenie 16bitowe


kemot55 wrote:
A tak na marginesie - algorytm powinien być tak napisany, żeby nigdy takie dzielenie nie miało miejsca, nawet bez sprawdzania (to taka uwaga praktyczna)

Na moje oko to niemożliwe. Jeszcze zwrócić flagę błędu bez instrukcji warunkowej się da, ale wyłączyć dzielenie przez zero bez wykorzystania warunku to już nie.
Back to top
   
kemot55
Poziom 19
Poziom 19


Joined: 04 Jun 2007
Posts: 716
Location: Łódź

Post#10 19 Mar 2010 14:47   

Re: Assembler 8051 dzielenie 16bitowe


Ja pisałem nie w sensie kodu tylko logiki. Po co urządzenie ma dzielić przez zero? Jeżeli w algorytmie dopuszczamy do takiej sytuacji (bez reakcji na to krytyczne zdarzenie) to algorytm jest do kosza. To znaczy wykrycie dzielenia przez zero powinno zatrzymać jakiekolwiek dalsze przetwarzanie dalszych obliczeń w programie (takie jest moje zdanie). Takie dzielenie może być wynikiem uszkodzenia przetwornika, lub jakieś innej nieprzewidzianej przez programistę sytuacji. Jeżeli wykonamy dzielenie przez zero (i nie "zawiesi" się przypadkiem procesor) to przecież dalsze obliczenia nie będą miały sensu.
Tyle na temat dzielenia. Szkoda elektronów i miejsca na dysku na niepotrzebne debaty w tym temacie.
Back to top
   
Google

Google Adsense


Post# 19 Mar 2010 14:47   





Back to top
   
aml24
Poziom 3
Poziom 3


Joined: 03 Jan 2009
Posts: 5

Post#11 Post from the author of the topic 19 Mar 2010 19:22   

Re: Assembler 8051 dzielenie 16bitowe


Dziękuje za pomoc, wasze wskazówki się przydały, więc temat może być już zamknięty
Back to top
   
Post new topic  This topic is locked      Main Page -> Forum Index -> Microcontrollers Generally -> 51 Microcontrollers -> Assembler 8051 dzielenie 16bitowe
Page 1 of 1
Similar topics
Bascom / Assembler, 8051 (4)
Assembler 8051 (3)
[assembler] dzielenie 2 liczb 64bitowych na rejestrach 32bit (3)
Dzielenie assembler AVR - attiny2313 (5)
[Assembler] Mnożenie i dzielenie. (11)
8051 + stałoprzcinkowe liczby 16bitowe (14)
Assembler dla 8051 (15)
LCD, 8051, assembler (2)
Assembler 8051 długość skoku jb (3)
POMOCY!!! ASSEMBLER 8051 LED (6)

Page generation time: 0.261 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed