Czemu do cholery wyświetla się tylko ostatnio wpisana wartosć?

0

Krótko i na temat. Męczę już to kilka godzin i nie mam pojęcia czemu po podaniu 10 cyfr i wpisaniu ich do tablicy, podczas wyswietlania wypisuje tylko ostatnio podaną?

format binary                                       ; dla FASM'a ?

org 100h

    mov cx, 10                                      ; przeslanie do rejestru CX liczby elementow tablicy

; wpisywanie liczb do tablicy        
pobierz:                                            ; poczatek petli
    mov dx, podaj_liczbe                            ; przeniesienie tekstu ze zmiennej do rejestru DX 
    mov ah, 9                                       ; wypisanie na ekran tekstu znajdujacego sie w rejestrze DX
    int 21h                                         ; przerwanie - prawidlowe wyjscie
    
    mov ah, 01h                                     ; wczytywanie 1 znaku z klawiatury
    int 21h                                         ; przerwanie - prawidlowe wyjscie
    mov [tablica + licznik], al                     ; przenosimy wpisana wartosc do tablicy
    inc [licznik]                                   ; inkrementacja licznika o 1         
    
    mov dx, nowa_linia                              ; przejscie do nowej linii i na miejsce pierwszego znaku
    mov ah, 9                                       ;
    int 21h                                         ;
loop pobierz                                        ; skok na poczatek petli rejestr CX automatycznie zmniejsza sie o 1
                              
    mov cx, 10                                      ; przeslanie do rejestru CX liczby elementow tablicy
    mov [licznik], 0                                ; zerowanie licznika
    xor dx, dx                                      ; zeruje DX
    
; wypisywanie liczb z tablicy
wyswietl:                                           ; poczatek petli
    mov dl, [tablica + licznik]                     ; przeniesienie tekstu ze zmiennej do rejestru DX
    inc [licznik]                                   ; inkrementacja licznika o 1
    
    mov ah, 02h                                     ; wypisywanie na ekran (tutaj juz nie tekstu)
    int 21h                                         ; przerwanie - prawidlowe wyjscie
loop wyswietl                                       ; skok na poczatek petli rejestr CX automatycznie zmniejsza sie o 1
    
    mov ah, 0                                       ; czeka na klawisz
    int 16h                                         ; przerwanie - prawidlowe zakonczenie
ret                                                 ; koniec
    
; zmienne dla aplikacji
    podaj_liczbe    DB "Podaj liczbe: $"            ; zmienna przechowujaca tekst (musi byc z dolarem na koncu) 10 - linia w dol, 13 - pierwszy znak w linii      
    nowa_linia      DB 10, 13, "$"                  ; 10 - linia w dol, 13 - idz do pierwszego znaku w linii, dolar oznacza koniec tekstu
    licznik         DB 0                            ; licznik do tablicy o wartosci poczatkowej 0          
    tablica         DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; tablica 10 elementowa o polach 8-bitowych typ DB      

kompiluję to pod http://8086-microprocessor-emulator.soft32.com/

3

Bo instrukcja mov dl, [tablica + licznik] jest niepoprawna, oba to wskaźniki, nie możesz się odwoływać w ten sposób do zmiennych (do licznika), odczytaj wartość licznika do tymczasowego rejestru np. DH i zrob mov dl, [tablica + dh] i przed loop-em daj inc dh (sprawdź czy DH nie jest gdzieś modyfikowany po wywołaniach przerwań, bo to w ogóle idiotyzm uczyć kogoś assemblera dla DOSa mając do dyspozycji 32 i 64 bitowe procki).

0

faktycznie tutaj był problem. dzięki za pomoc.

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