.model small ;deklaracja modelu programu (max wielkosc dla segmentu danych, stosu, kodu) ;w praktyce innego nizeli tiny lub small(prawie to samo) nie bedziemy urzywac dane segment ;segment danych sie tutaj rozpoczyna tekst0 db "wprowadz dane!!",0ah,0dh,"$" ;deklaracja zmiennej - nazwa rozmiar(db-bajt dd-slowo(2 bajty)) zawartosc tekst2 db "oto tekst",0ah,0dh,"$" ;w tym przypadku zmienne to tekst 0ah to /r 0dh to /n $ - koniec ciegu znakow ;wymagany przez funkcje 9 przerwania 21h tekst1 db 40,255 dup (?) ;deklaracja max dlugosci ciagu odczytanego(funkcja 0ah przerwania 21h) ;po przecinku nastepny bajt danych ;dup (?) zawartosc nieokreslona dane ends ;segment danych sie konczy kod segment ;segment kodu poczatek assume cs:kod,ds:dane ;przepisanie adresu segment kodu i danych (tutaj tak samo jak w nazwach) start: ;etykieta wymagana do tego zeby program ruszyl xor cx,cx ;podobno szybsze zerowanie nizeli mov rejstr,00 mov ax,dane ;do ax przenosimy adres segmentu dane mov ds,ax ;do ds'a przenosimy ax (mozliwe ze niekonieczne ale gosc od laborek powiada ;ze lepiej wicej napisac i niech napewno dobrze dziala) mov ah,9 ;zeby cos wydrukowac na ekranie trzeba wsadzic do ah wartosc 9 mov dx,offset tekst0 ;do dx'a wsadzic offset ciagu do wydruku int 21h ;i na koncu wywolac przerwanie 21h mov dx,offset tekst1 ;tutaj przenosze do dx'a offset danej do odczytania z klawiaturki mov ah,0ch ;to jest troche droga na okolo bo funckcja 0ch czysci najpierw bufor mov al,0ah ;pozniej wywoluje to co jest w al int 21h ;wywolanie przerwania efekt: wyczyszczenie bufora klawiatury i oczekiwanie na ;tekst enter konczy wprowadzanie mov ah,9 ;do ah 9 czyli zaraz cos mozna wydrukowac mov dx,offset tekst2 ;bez offsetu w dx sie nie obejdzie int 21h ;wywolanie przerwania mov ah,9 ;tutaj do ah znowu 9 bopo przerwaniu niektore rejstry potrafia wyprawiac cuda(tw gosc od laborek) mov dx,offset tekst1 ;do dx'a offsecik to tylko tak dla przygotowania drukowania... mov bx,dx ;tutaj zaczuna sie lokalizacja informacji o dlugosci znakow jaka pobrano po wywolaniu funkcji 0ah ;przerwania 21h do bx'a leci offsecik (bx'em sie adresuje pamiec) inc bx ;zwiekszenie bx'a o 1 ze wzgledu na polorzenie informacji o dluosci pobranego ;ciagu znakow (debuger prawde ci powie :P) add bl,[bx] ;jako ze informacja o dlugosci to jeden bajt to jedynie nizsza czescia rejestu poslurzyc sie moge ;w przeciwnym wypadku pobiore 2 bajty i pozniej nic ciekawego z tego nie wyjdzie ;oczywiscie mozna byloby na okolo przez jakis inny rejestr (ze wzgledu na to ze wynik sumowania ;2 bajtow moze byc wiekszy od bajta w tym przypadku wartosci nie sa zbyt duze) ;i wreszcie do czego to jest te 'add bl,[bx]' po prostu okreslenie adresu konca ciagu ;do adresu poczatku ciagu dodaje dlugosc ciagu ktora jest pod adresem zawartym w komorce pamieci nr 'bx' mov [bx+2],24h ;tutaj wstawianie na koncu ciagu znaku $ zeby funkcja 9 przerwania 21h wydrukowala tylko to co chcemy add dx,2 ;przesuniecie poczatu drukowania o 2 (pierwszy bajt to max rozmiar pobieranego ciagu drugi to dlugosc pobranego cigu) int 21h ;wywolanie przerwania 21h mov ah,4ch ;przygotowanie sie do zakonczenia sie programu funkcja ach przerwania 21h int 21h ;wywolanie 21h i zaonczenie programu kod ends ;koniec segmentu kodu end start ;taka koncowka inicjujaca zeby program ruszyl ;a teraz efekt dzialania tego kodu: ;pojawienie sie napisu 'wpisz dane!!:' ;w nastepnej linijce pojawienie sie znaku zachety i oczekiwanie na jakies znaki enter konczy wpisywanie ;w miesjcu wpisywanych danych pojawia sie tekst 'oto tekst:' ;jesli ciag wpisay byl dluzszy nizeli dlugosc 'oto tekst' w tej samej linijce zostaja znaki :-) ;wkoncu nikt niczego nie napisal ze prog ma przejsc do nastepej linijki czy ja wyczyscic ;-) ;w nastepnej linijce pojawia sie tekst ktory wpisalismy ;program sie konczy