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.
Asembler - min i max
-
- Użytkownik
- Posty: 21
- Rejestracja: 13 kwie 2008, o 22:37
- Płeć: Mężczyzna
- Lokalizacja: małogoszcz
-
- 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
całości pisać mi się nie chce, ale niedawno pisałem podobny program. Fragment Ci wkleję:
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
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
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