Znajdowanie najwiekszej liczby w rejestrach

Tu piszemy wiadomość, jeżeli zadanie domowe sprawia kłopot
i szybko potrzebujemy pomocy w rozwiązaniu.
ODPOWIEDZ
Legolas
-
Posty: 5
Rejestracja: 07 sty 2008, 16:50
Lokalizacja: Nibylandia

Znajdowanie najwiekszej liczby w rejestrach

Post autor: Legolas » 17 sty 2008, 13:46

Są dane w 3 rejestrach : R1,R2 i R3. Czy ktoś zna procedure jak znaleźć najwiekszą liczbe.

ZbeeGin

Post autor: ZbeeGin » 17 sty 2008, 18:45

Oj, lenistwo, lenistwo!!. Proste jak kilometr nawojówki w kieszeni.

Bierzesz liczbę z rejestru R1 zapisujesz ją jako Max i stawiasz w Liczniku 1. Następnie bierzesz liczbę z R2 i porównujesz z Max. Jeśli większa to wpisujesz ją jako Max a w Liczniku wpisujesz 2. Jeśli nie to bierzesz liczbę z R3 i tak samo jak w przypadku R2 sprawdzasz z Max, jeśli większa to bla, bla, bla (jak wyżej), a jeśli mniejsza to koniec i w Max masz kopię największej liczby a w Liczniku numer rejestru.

Teraz przekształć to sobie na konkretne rozkazy.

Legolas
-
Posty: 5
Rejestracja: 07 sty 2008, 16:50
Lokalizacja: Nibylandia

Post autor: Legolas » 20 sty 2008, 19:46

Kiedy właśnie chodzi mi o to jak ją porównać? Ogólna idea znajdowania najwiekszej liczby jest mi znana jednak gorzej z zapisem tego w programie. Wiem że można też liczyć bity po kolei i porównywać ale niestety nie umiem tego zapisać na papier.

ZbeeGin

Post autor: ZbeeGin » 20 sty 2008, 22:10

Legolas pisze:Wiem że można też liczyć bity po kolei
Tylko po co liczyć bity. Kompilkujesz sprawę. Procesory porównują poprzez odejmowanie!
Prosta instrukcja: SUBB A, R1 (A := A - R1 - CY)
  • Jeśli znacznik CY się nie ustawił to znaczy, że pożyczki nie było A > R1.
  • Jeśli znacznik CY ustawiony, pożyczka była zatem A < R1.
  • Jeśli znacznik Z ustawiony to wartości są równe A = R1
Elementarne zasady arytmetyki procesorów się kłaniają. Uczą Was tam czegoś w tych "szkołach"?

Piszę z głowy, więc nie odpowiadam za całkowitą poprawność:

Kod: Zaznacz cały

.CSEG
   MOV   MAX, R1
   MOV   LICZNIK, #1
   MOV   A, MAX
   CLR   C
   SUBB  A, R2
   JNC   _R2_NIE_WIEKSZA
   MOV   MAX, R2
   INC  LICZNIK
_R2_NIE_WIEKSZA:
   MOV   A, MAX
   CLR   C
   SUBB  A, R3
   JNC   _R3_NIE_WIEKSZA
   MOV   MAX, R3
   INC LICZNIK
_R3_NIE_WIEKSZA
   NOP
   ...

.DSEG
MAX       .DEFB  0
LICZNIK   .DEFB  0
A teraz zadanie domowe, analiza powyższego kodu. Na jutro chcę zobaczyć komentarze co się dzieje w tym programie.

elektronWielki
Użytkownik
Posty: 247
Rejestracja: 30 maja 2006, 12:45
Lokalizacja: kontownia

Post autor: elektronWielki » 21 sty 2008, 15:24

zakładając, że:
- po zakończeniu procedury w R1 znajduje się największa wartość
- w rejestrach mamy liczby ze znakiem
- program jest dla AVR-ków
kod będzie wyglądał tak:

Kod: Zaznacz cały

	cp     R1, R2
	brge	 label1
	mov	R1, R2
label1:
	cp	  R1, R3
	brge	 koniec
	mov	R1, R3
koniec:
;teraz w R1 jest największa wartość

tasza
Użytkownik
Posty: 1391
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 21 sty 2008, 17:13

:arrow: elektronWielki
elektronWielki pisze:- program jest dla AVR-ków
Fajnie, że próbujesz pomóc ale...post jest w dziale o kontrolerach rodziny 8051 :roll:

Legolas
-
Posty: 5
Rejestracja: 07 sty 2008, 16:50
Lokalizacja: Nibylandia

Post autor: Legolas » 22 sty 2008, 9:46

Wielkie dzięki, dopisałem sobie resztę tego kodu porównującego 3 rejestry i jest super, dzięki za pomoc.

ZbeeGin

Post autor: ZbeeGin » 22 sty 2008, 14:46

Legolas pisze:Wielkie dzięki, dopisałem sobie resztę tego kodu porównującego 3 rejestry i jest super, dzięki za pomoc.
Ale nadal kolega zadania domowego nie odrobił!

ODPOWIEDZ