| Author |
Message
|
aml24 Poziom 3

Joined: 03 Jan 2009 Posts: 5
|
#1
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

Joined: 15 May 2005 Posts: 4528 Location: Żory (kiedyś Opole)
|
#2
18 Mar 2010 20:59 Re: Assembler 8051 dzielenie 16bitowe |
|
|
|
CMP i skok do końca
|
|
| Back to top |
|
 |
aml24 Poziom 3

Joined: 03 Jan 2009 Posts: 5
|
#3
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

|
#
18 Mar 2010 21:22 |
|
|
|
|
|
| Back to top |
|
 |
tadzik85 Poziom 22

Joined: 28 Feb 2007 Posts: 1571 Location: Bydgoszcz
|
#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

Joined: 14 Jul 2005 Posts: 6360
|
#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

Joined: 28 Feb 2007 Posts: 1571 Location: Bydgoszcz
|
#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

|
#
18 Mar 2010 22:37 |
|
|
|
|
|
| Back to top |
|
 |
atom1477 Poziom 25

Joined: 14 Jul 2005 Posts: 6360
|
#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

Joined: 04 Jun 2007 Posts: 716 Location: Łódź
|
#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

Joined: 14 Jul 2005 Posts: 6360
|
#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

Joined: 04 Jun 2007 Posts: 716 Location: Łódź
|
#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

|
#
19 Mar 2010 14:47 |
|
|
|
|
|
| Back to top |
|
 |
aml24 Poziom 3

Joined: 03 Jan 2009 Posts: 5
|
#11
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 |
|
 |