[Assembler] Wczytywanie cyfr, tworzenie liczby i sprawdzanie.

0

Wczytanie jednej liczby 5 cyfrowej (jako ciągu znaków), sprawdzenie czy jest to rzeczywiście liczba (czy nie podano innych niż cyfry znaków), konwersja ciągu znaków na liczbę całkowitą oraz sprawdzenie czy liczba ta mieści się w zakresie liczb 16-to bitowych.

.model small
.stack 100h

.data
t1 db 'Podaj liczbe(potwierdz ESC) : $'
t2 db 'Liczba to :'
crlf db 0dh,0ah,'$'

.code
mov ax,@data ;wpisanie zmiennych data do pamieci
mov ds,ax    ;wpisanie zmiennych data do pamieci
mov dx,offset t1 ;przygotuj napis
mov ah,09h 
int 21h
mov cx,0 ;wyzerowanie licznika stosu

wczytaj:
mov ah,01h
int 21h
cmp al,39
jg koniec
cmp al,30
jl koniec
cmp al,27
je dalej
sub ax,0
push ax
add cx,1
jmp wczytaj

dalej:
mov dx,offset crlf ;przygotwanie offsetu
mov ah,09h	   ;czyszczenie
int 21h 	   ;ekranu (wyswietlenie niczego:D?)
mov dx,offset t2   ;przygotowanie tekstu
mov ah,09h	   ;wyswietlenie
int 21h 	   ;na ekranie
mov bx,0	   ;wyzerowanie bx

liczba:
cmp cx,4
je mnozenie10
cmp cx,3
je mnozenie100
cmp cx,2
je mnozenie1000
cmp cx,1
je mnozenie10000
pop ax		   ;pobranie ze stosu
add bx,ax	   ;dodanie do bx tego co w akumulatorze
loop liczba	   ;petla, bezwarunkowa, ktora zmniejsza licznik cx (wykonuje dec i sprawdzenie dopoki=0).

mnozenie10:
pop ax		   ;pobranie ze stosu
mov dx,10   
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie100:
pop ax		   ;pobranie ze stosu
mov dx,100
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie1000:
pop ax		   ;pobranie ze stosu
mov dx,1000
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie10000:
pop ax		   ;pobranie ze stosu
mov dx,10000
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba


wyswietl:
mov ax,bx
mov ah,02h
int 21h
mov ah,01h
int 21h

koniec:
  mov ah,4ch ;instrukcja 
  int 21h    ;przerwania
  end

Warunki przy wczytywaniu sa najprawodpodobniej zle, niestety samemu nie udalo mi sie zlokalizowac bledu. Calosc kompiluje w tasm (taki kompilator przekazal nam prowadzacy). Program kompiluje sie, nawet gdy zakomentuje warunki przy wczytywaniu program nie dziala, wczytuje liczby aczkolwiek na tym konczy sie jego dzialanie. Prosilbym wszelakie glupoty, ktore sa zawarte w tym kodzie - wybaczyc. Prowadzacy po 20 minutowym wstepie teoretycznym, zadał zadanie i to cale moje "doswiadczenie" z procesorem 8086. Wczesniej pracowalismy na procesorze 8080. Z gory dzieki za pomoc, nie bede ukrywal, ze potrzebna jest mi ona dzisiaj, jutro bedize juz "po ptokach".

Z gory wielkie dzieki, pozdrawiam.

0
cmp al,39
jg koniec
cmp al,30
jl koniec

co ty tu wczytujesz? cyfry mają inne kody, począwszy od '0' które ma kod 48.

0

fakt, moj blad.

poprawilem skladnie na:

wczytaj:
mov ah,01h
int 21h
cmp al,27
je dalej
cmp al,'9'
jg koniec
cmp al,'0'
jl koniec
sub ax,0
push ax
add cx,1
jmp wczytaj

Czy teraz jest poprawnie?
Warunki przechodza, jednakowoz program w dalszym ciagu nie dziala, wyrzuca offset t2 i sie zatrzymuje.

0

Witam ponownie, po zajeciach, paru wskazowkach prowadzacego i moich poprawkach program wyglada tak:

.model small
.stack 100h
.data
t1 db 'Podaj liczbe(potwierdz ESC) : $'
t2 db 'Liczba to :'
crlf db 0dh,0ah,'$'

.code
mov ax,@data ;wpisanie zmiennych data do pamieci
mov ds,ax    ;wpisanie zmiennych data do pamieci
mov dx,offset t1 ;przygotuj napis
mov ah,09h 
int 21h
mov cx,0 ;wyzerowanie licznika stosu

wczytaj:
mov ah,01h
int 21h
cmp al,27
je dalej
cmp al,'9'
jg koniec
cmp al,'0'
jl koniec
sub ax,'0'
push ax
add cx,1
jmp wczytaj

dalej:
mov dx,offset crlf ;przygotwanie offsetu
mov ah,09h	   ;czyszczenie
int 21h 	   ;ekranu (wyswietlenie niczego:D?)
mov dx,offset t2   ;przygotowanie tekstu
mov ah,09h	   ;wyswietlenie
int 21h 	   ;na ekranie
mov bx,0	   ;wyzerowanie bx

pop ax		   ;pobranie ze stosu
add bx,ax	   ;dodanie do bx tego co w akumulatorze
loop liczba	   ;petla, bezwarunkowa, ktora zmniejsza licznik cx (wykonuje dec i sprawdzenie dopoki=0).
liczba:
cmp cx,4
je mnozenie10
cmp cx,3
je mnozenie100
cmp cx,2
je mnozenie1000
cmp cx,1
je mnozenie10000
jmp wyswietl

mnozenie10:
pop ax		   ;pobranie ze stosu
mov dx,10   
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie100:
pop ax		   ;pobranie ze stosu
mov dx,100
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie1000:
pop ax		   ;pobranie ze stosu
mov dx,1000
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba

mnozenie10000:
pop ax		   ;pobranie ze stosu
mov dx,10000
mul dx		   ;pomnozenie ax razy mnoznik
add bx,ax	   ;dodanie do bx tego co w akumulatorze
dec cx		   ;zmniejszenie cx, aby petla krecila sie tylko i rowno 5 razy.
jmp liczba


wyswietl:
mov ax,bx
mov ah,02h ;wyswietlanie
int 21h
mov ah,01h ;zatrzymanie aby ujrzec wynik
int 21h

koniec:
  mov ah,4ch ;instrukcja 
  int 21h    ;przerwania
  end
  1. Program sie kompiluje
  2. Wczytuje liczby
  3. Wyswietla, jeden znaczek (na podstawie kodu ASCII).

Co nie dziala:

  1. Wyswietlanie calej liczby (kodu ascii), wyswietla tylko 1 znak
  2. Zamiana kodu ascii na liczbe dziesietna
  3. Sprawdzenie czy liczba miesci sie w zakresie 16 bitowym.. (ni emam zielonego pojecia jak to zrobic, cos czytalem o przepelnieniach ale jestem przepelniony kolorem zielonym sugerujacym brak wiedzy zwiazanej z ASM..).

Prosilbym o w miare mozliwosci pomoc w rozwiazaniu problemu. Nie ukrywam, ze zalezy mi (chociaz pewnie jak kazdemu w tym dziale).

Pozdrawiam i z gory dziekuje.

0

Udalo mi sie uporac z programem, samemu. Troche sie musialem pomeczyc, pol dnia spedzone przed emu8086 ale rezultat jak najbardziej pozytywny. Moze sie kiedys przyda ten nieszczesny Asembler.

Temat do zamkniecia, jak program zostanie zaliczony jutro to podziele sie kodem (zedytuje posta). Poki co nie moge bo sepy z roku moga weszyc :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1