Asembler - min i max

lukasz18101988
Użytkownik
Użytkownik
Posty: 21
Rejestracja: 13 kwie 2008, o 22:37
Płeć: Mężczyzna
Lokalizacja: małogoszcz

Asembler - min i max

Post autor: lukasz18101988 »

napisac w asemblerze ( NASM, gcc) podprogram, który wczytuje z klawiatury liczby calkowite
( 32-bity ze znakiem) aż do napotkania jakiegoś znaku. A następnie wyprowadzający na ekran liczbe najwieksza i namniejszą.

proszę o pomoc, nie mam zielonego pojęcia jak to zrobić, mimo tego że przeczytalem kilka kursów tego jezyka.
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Asembler - min i max

Post autor: spajder »

całości pisać mi się nie chce, ale niedawno pisałem podobny program. Fragment Ci wkleję:

Kod: Zaznacz cały

; procedura pobiera napis zakonczony symbolem '$' lub enterem spod adresu di

; i konwertuje go na liczbe dziesietna ze znakiem, Jesli wszystko jest

; ok zwraca wynik w AX oraz 0 w BX

; jesli wystapil nieprawidlowy znak zwraca 1 w BX

; jesli liczba jest spoza zakresu zwraca -1 w BX

zmien_liczbe PROC

   push cx

   push dx

   

   xor ax, ax

   xor bh, bh

   mov cx, 10   

   mov bl, [di]

   cmp bl, '$'

   je zmien_liczbe_zly_znak

   cmp bl, 0dh

   je zmien_liczbe_zly_znak

   cmp bl, '-'

   jne 	zmien_liczbe_dodatnia

   inc di





   

      zmien_liczbe_petla:   



	     mov bl, [di]

		 ; sprawdza, czy znak jest znakiem terminujacym

		 cmp bl, '$'

		 je zmien_liczbe_ok_koniec

		 cmp bl, 0dh

		 je zmien_liczbe_ok_koniec

		 ; sprawdzanie, czy znak jest cyfra

		 cmp bl, '0'

		 jb zmien_liczbe_zly_znak

		 cmp bl, '9'

		 ja zmien_liczbe_zly_znak

		 ; jesli jest cyfrš to konwertuje znak na liczbe

		 sub bl, '0'



		 imul cx          ; mnoży ax przez 10

		 ; sprawdza, czy nie wyszedlem poza zakres slowa

	     jo zmien_liczbe_poza_zakresem

	     sub ax, bx

         jo zmien_liczbe_poza_zakresem	

		; js zmien_liczbe_poza_zakresem

		 inc di

		 

      jmp zmien_liczbe_petla





   zmien_liczbe_dodatnia:	  

	     mov bl, [di]

		 ; sprawdza, czy znak jest znakiem terminujacym

		 cmp bl, '$'

		 je zmien_liczbe_ok_koniec

		 cmp bl, 0dh

		 je zmien_liczbe_ok_koniec

		 ; sprawdzanie, czy znak jest cyfra

		 cmp bl, '0'

		 jb zmien_liczbe_zly_znak

		 cmp bl, '9'

		 ja zmien_liczbe_zly_znak

		 ; jesli jest cyfrš to konwertuje znak na liczbe

		 sub bl, '0'



		 mul cx          ; mnoży ax przez 10

		 ; sprawdza, czy nie wyszedlem poza zakres slowa

		 or dx, dx

	     jnz zmien_liczbe_poza_zakresem

	     add ax, bx

         jo zmien_liczbe_poza_zakresem	

		; js zmien_liczbe_poza_zakresem

		 inc di	

      jmp zmien_liczbe_dodatnia

   



   

	  

  zmien_liczbe_zly_znak:

      mov bx, 1  

	  jmp zmien_liczbe_koniec

	  

   zmien_liczbe_poza_zakresem:

      mov bx, -1   

	  jmp zmien_liczbe_koniec

	  

	   

  zmien_liczbe_ok_koniec:	   

	  xor bx, bx

	  jmp zmien_liczbe_koniec

	  

  zmien_liczbe_koniec:

   pop dx

   pop cx	 

   ret	 

ENDP
to jest funkcja przeształcająca tekst na liczbę. Jest to 16-bitowa wersja pod DOS, ale w twoim wypadku osiągnięcie 32bitów ograniczy się do zamiany wszystkich rejestrów na 32bitowe (EAX zamiast AX itp). Sam kod jest chyba nieźle komentowany (miesiąc temu pisałem na zaliczenie), jak czegoś nie rozumiesz to pytaj. Przed zastosowaniem tej procedury musisz wczytać do edi adres tekstu pobranego z klawiatury jakąś funkcją systemową (nie wiem, czy robisz pod win czy pod linuxem), obowiązek terminowania go '$' umieściłem, bo tak łatwiej pisało się pod DOS.
Jeśli będziesz miał problem z samą tabelą to pisz - to akurat jest ta prostsza część programu.
I nie dziw się, że nic nie rozumiesz, asembler nie jest trudny tylko kod jest skomplikowany... trzeba przeczytać kilka razy :D
ODPOWIEDZ