Asembler Wczytywanie do lancucha i wypisywanie

0

Czesc,

mam pewien problem z wczytywaniem do lancucha, a pozniej wypisywaniem tego co wczytalem.

Kod:

d segment
        lancuch db 20, 20 dup(?), '$' ; tutaj chce wczytac lancuch 
d ends
 
 
c segment                   
start:
 
        mov ax,seg lancuch            
        mov ds,ax                    ;do ds adres segmentu gdzie jest lancuch 
        mov dx, offset lancuch  ; do dx adres offsetu gdzie jest lancuch 
        
        
        mov al, 0Ah ; funkcja wczytujaca caly lancuch do DS:DX = lancuch 
        int 21h        ; przerwanie 21h z ww. funkcja 
       
        ; w moim rozumowaniu teraz pod lancuchem "siedzi" moj wczytany z klawiatury lancuch
        ; teraz chce go wypisac funkcja 09h przerwania 21h, wypisujace caly lancuch do napotkania $ 

       mov ax, seg lancuch 
       mov ds, ax 
       mov dx, offset lancuch ; do DS:DX znowy laduje adres lancucha, nic po drodze sie w tych rejestrach nie dzialo wiec chyba nie musialem tego robic?
       add dx, 2 ; przesuwam offset o 2, czyli tam gdzie zacznie sie juz lancuch 
       mov al, 09h ; funkcja wypisujaca z adresu DS:DX lancuch do napotkania znaku $ 
       int 21h 
       
       
 
exit:
        mov     al,0
        mov     ah,04ch  ;koniec programu i powrot do systemu
        int     021h
 
c ends
 
 
 
stos segment stack
stos ends
 
end start
 

Chcialem wczytac do lancucha wprowadzony ciag znakow, a potem go wypisac. Niestety kod ten wczytuje znaki, a potem nic nie wypisuje. Nie bardzo wiem gdzie robie blad, wiem, ze przy bardziej skomplikowanych programach nalezy odkladac rejestry na stos i potem je sciagac bo sie po drodze ciagle zmieniaja. Tutaj sie nie zmieniaja bo nic poza tym nie robie, poza tym i tak wpisuje dokladny adres do pamieci, ktoryc chce wypisac i nie ma reakcji.

Moglby ktos wskazac luke w moim rozumowaniu? Bylby bardzo wdzieczny.

Z gory dziekuje

0

Sprawdź sobie jak się używa tych przerwań, a w szczególności że tam jest ah a nie al jako parametr przerwania ;)
http://spike.scu.edu.au/~barry/interrupts.html#ah09

0

Dziękuje za pomoc.
Faktycznie, tutaj pomylilem rejestry ah z al. Pisalem z glowy, w oryginale bylo dobrze i nie dzialalo, sam nie wiem dlaczego.

Napisalem ten fragment od nowa i teraz jest progres, ale np przy wprowadzeniu 1 znaku nic mi nie wyswietla, od 2 pokazuje 2 znak, powyzej 3 pokazuje wszystkie wprowadzone znaki. Jezeli przed wypisaniem tego lancucha wypisze przejscie do nowej linii i dwie spacje to wtedy pokazuje dobrze z odpowiednim wcieciem.
Manipulowalem tez add dx, 2. Pod adresem segmentu 00 mam maksymalny rozmiar bufora, pod segmentem 01 tez jakis parametr, czyli to nie tutaj jest blad.

0

NASM jest lepszy od starożytnego TASMa.

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