Thread View: pl.comp.lang.asm
36 messages
36 total messages
Started by Johnny
Wed, 13 Sep 2006 08:35
Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 13 Sep 2006 08:35
Date: Wed, 13 Sep 2006 08:35
94 lines
2211 bytes
2211 bytes
Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to okiem? Dzięki z góry. title 6_04 .model small .stack 100h .386 .code ;--------------------------------------------- ; main ;--------------------------------------------- main proc mov ax,@data ; inicjalizacja ds mov ds,ax mov ah,0h ; tryb video mov al,3h int 10h ; odczytanie położenia wskaźnika mov ah,3h int 10h ; odczyt znaku odczytaj: mov ah,10h int 16h ; jeżeli wprowadzono ESC zakończ program cmp ah,1h je exit ; jeżeli wprowadzono znak z zakresu 0-9 ; wyświetl go i przesuń wskaźnik cmp ah,2h jb odczytaj cmp ah,0Bh ja odczytaj mov ah,0Ah ; wyświetl znak mov cx,1h int 10h inc dl cmp dl,4Fh ja next_row mov ah,2h int 10h jmp odczytaj next_row: inc dh cmp dh,18h ja move mov ah,2h mov dl,0h int 10h jmp odczytaj move: mov ah,3h int 10h mov ah,6h mov al,1h xor cx,cx mov dl,5h int 10h mov ah,2h mov dl,0h inc dh inc dh int 10h jmp odczytaj exit: mov ax,4C00h ; zakończenie procedury int 21h main endp .data end main -- Johnny
Re: Problem z przesunięciem ekranu
Author: Bogdan (bogdro)
Date: Wed, 13 Sep 2006 09:53
Date: Wed, 13 Sep 2006 09:53
42 lines
2069 bytes
2069 bytes
Johnny napisał(a): > Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia > tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne > dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam > położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi > ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to > okiem? Dzięki z góry. [...] > next_row: > inc dh > cmp dh,18h > ja move [...] > move: > mov ah,3h > int 10h > > mov ah,6h > mov al,1h > xor cx,cx > mov dl,5h > int 10h > > mov ah,2h > mov dl,0h > inc dh > inc dh > int 10h Gdy wpadasz do "move:", DH >= 25. Po wykonaniu przewinięcia ekranu, ustaw kursor w wierszu 24 (18h), zamiast dawać 2 razy INC. Tyle na pierwszy rzut oka (bez patrzenia do RBIL). Możliwe, że coś pominąłem. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Prawdziwy, bezpieczny komunikator: www.JabberPL.org
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 13 Sep 2006 10:23
Date: Wed, 13 Sep 2006 10:23
11 lines
1376 bytes
1376 bytes
> Gdy wpadasz do "move:", DH >= 25. Po wykonaniu przewinięcia ekranu, > ustaw kursor w wierszu 24 (18h), zamiast dawać 2 razy INC. Tyle na > pierwszy rzut oka (bez patrzenia do RBIL). Możliwe, że coś pominąłem. > Dzięki ale tak jak pisałem próbowałem już różnych ustawień z dh w tym z 18h. Przy tej wartości wskaźnik co prawda się pojawia lecz wprowadzane znaki już nie. -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Wed, 13 Sep 2006 10:47
Date: Wed, 13 Sep 2006 10:47
84 lines
3919 bytes
3919 bytes
Johnny napisał(a): > Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia > tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne > dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam > położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi > ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to > okiem? Dzięki z góry. > > title 6_04 > .model small > .stack 100h > .386 > .code > ;--------------------------------------------- > ; main > ;--------------------------------------------- > main proc > mov ax,@data ; inicjalizacja ds > mov ds,ax > > mov ah,0h ; ustawienie trybu video > mov al,3h ; wybór trybu > int 10h ; wywołanie BIOS mov ah, 5h ; wybranie funkcji stronicy mov al, 0 ; wybranie stronicy int 10h ; wywołanie BIOS > mov ah,3h ; odczytanie położenia wskaźnika mov bh, 0 ; stronica > int 10h ; wywołanie BIOS mov ah, 2 ; ustawienie położenia wskaźnika mov dh, 10 ; wiersz mov dl, 20 ; kolumna mov bh, 0 ; stronica int 10h ; wywołanie BIOS ; uzyskanie położenia wskaźnika ; CH - początkowy wiersz kursora ; CL - końcowy wiersz kursora ; DH - wiersz wskaźnika ; DL - kolumna wskaźnika mov ah, 3 ; uzyskanie położenia wskaźnika mov bh, 0 ; stronica int 10h ; wywołanie BIOS ; pobieranie danych mov cursor, cx ; zapisanie wierszy wskaźnika mov cur_row, dh ; zapisanie wiersza mov cur_col, dl ; zapisanie kolumny ; ------------------ Przykład ---------------- ; poniższy kod oczyszcza cały ekran poprzez przewinęcie ; go do góry (normalne atrybuty pustych wierszy) mov ah, 6 ; przewinięcie do góry mov al, 0 ; całe okno mov ch, 0 ; wiersz dla lewy-górny wierzchołek mov cl, 0 ; kolumna dla lewy-górny wierzchołek mov ah, 24 ; wiersz dla prawy-donly wierzchołek mov dl, 79 ; kolumna dla prawy-dolny wierzchołek mov bh, 7 ; normalny atrybut dla pustych wierszy int 10h ; wywołanie BIOS [...] > exit: > mov ax,4C00h ; zakończenie procedury > int 21h ; wywołanie DOS > main endp > > end main ; ----------------------------------------------------------- INT 10h: Screen -> http://www.bookcase.com/library/dos/ints/int10.html Mam nadzieje, że gdzieś się nie machłem :P :] Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Bernard
Date: Wed, 13 Sep 2006 11:51
Date: Wed, 13 Sep 2006 11:51
13 lines
1527 bytes
1527 bytes
Johnny wrote: > Mam drobny problem z przesunięciem ekranu. Otóż sam efekt przesunięcia > tekstu o 1 wiersz potrafię osiągnąć lecz po tym zabiegu nie są widoczne > dalsze wpisywane znaki (0-9). Prawdopodobnie niewłaściwie ustawiam > położenie wskaźnika przy pomocy int 10h i ah=2h. Próbowałem z różnymi > ustawieniami dh (wiersze) ale bezskutecznie. Mógłby ktoś rzucić na to > okiem? Dzięki z góry. Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając wartości parametrów, które w tej sytuacji są dość losowe, bo nie wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji pisania znaków
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 13 Sep 2006 12:29
Date: Wed, 13 Sep 2006 12:29
12 lines
1431 bytes
1431 bytes
> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając > wartości parametrów, które w tej sytuacji są dość losowe, bo nie > wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na > podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji > pisania znaków Sądziłem, że taka jest praktyka by nie podawać argumentów, których wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień stronicy itp. -- Johnny
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 13 Sep 2006 12:31
Date: Wed, 13 Sep 2006 12:31
15 lines
1492 bytes
1492 bytes
Matuzalem napisał(a): > mov ah, 2 ; ustawienie położenia wskaźnika > mov dh, 10 ; wiersz > mov dl, 20 ; kolumna > mov bh, 0 ; stronica > int 10h ; wywołanie BIOS Dlaczego mam ustawiać tu wskaźnik skoro tego nie chcę? Dzięki za przykład z oczyszczaniem całego ekranu ale go znam. Mój problem dotyczy dokładnie tego co opisałem w pierwszym e-mailu oraz w odpowiedzi do Bogdana. -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Wed, 13 Sep 2006 13:43
Date: Wed, 13 Sep 2006 13:43
80 lines
4092 bytes
4092 bytes
Johnny napisał(a):
> Matuzalem napisał(a):
> > mov ah, 2 ; ustawienie położenia wskaźnika
> > mov dh, 10 ; wiersz
> > mov dl, 20 ; kolumna
> > mov bh, 0 ; stronica
> > int 10h ; wywołanie BIOS
>
> Dlaczego mam ustawiać tu wskaźnik skoro tego nie chcę?
Bo miałeś problem z jego ustawieniem, podałem to jako przykład :]
Bernard napisał(a):
> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając
> wartości parametrów, które w tej sytuacji są dość losowe, bo nie
> wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na
> podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji
> pisania znaków
a Ty na to:
Johnny napisał(a):
> Sądziłem, że taka jest praktyka by nie podawać argumentów, których
> wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień
> stronicy itp.
Bernard ma racje, w przykładowych kodach które Ci podałem,
pozjadałeś dość istotne dane których nie iniciowałeś, choćby
stronice np.:
mov ah,3h
int 10h
W dokumentcji jest wspomniane o bh, a u Ciebie, gdzie ono jest ?
(http://www.bookcase.com/library/dos/ints/int10.html#03)
Co jeśli w bh znajdzie się coś "nie oczekiwanego"? mogą powstać
komplikacje, pomyśl o tym jak o "ostateczności", czemu?
W tym w/w przykładzie to jeszcze pewnie nic strasznego by się nie
stało (nie sprawdzałem, może z ciekawości to zrobie :P ) ale co by
było gdyby to były funkcje obsługujące np. dysk i zapomniałbyś
zainicjować jakąś zmienną i zostawił ją taką jaka jest?
mógłyś pożegnać się z danymi w najgorszym wypadku z dyskiem (to
już nie są żarty :P )
asm, to nie HLL, gdzie domyślne argumenty "same się" uzupełnią jak
np tu:
int Fun(int arg = 0);
int main()
{
Fun();
return 0;
}
Gdybyś skompilował to i zdeasemblował, zobaczyłbyś coś takiego
(mniej więcej i pod warunkiem, że kompilator nie zastosuje konwencji
wywołań przez rejestr [Register]):
push 0 ; widzisz, nawet jeśi w C/C++ jest
; domyślny zero to i tak musi zostać
odłożony na stos
call 00401012 ; jakiś tam adres
Pojęcie "domyślny argument" w języku asm jest abstrakcyjne, nie ma
czegoś takiego (przynajmniej w tym konekście).
asm to język niskiego poziomu (wręcz kod maszynowy) to bardzo prosty
i logiczny język, dla tego nie należy interpretować go tak jak HLL.
Johnny napisał(a):
> Dzięki za przykład z oczyszczaniem całego ekranu ale go znam. Mój
> problem dotyczy dokładnie tego co opisałem w pierwszym e-mailu oraz w
> odpowiedzi do Bogdana.
Może napisz słownie co chcesz osiągnąć...
Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Bernard
Date: Wed, 13 Sep 2006 18:20
Date: Wed, 13 Sep 2006 18:20
15 lines
1652 bytes
1652 bytes
Johnny wrote: >> Masz problem z czytaniem dokumentacji. Wywołujesz funkcje nie podając >> wartości parametrów, które w tej sytuacji są dość losowe, bo nie >> wiadomo, co siedziało w rejestrze przed wywołaniem. Zwróć uwagę na >> podanie WSZYSTKICH argumentów, w tym rejestró2 bl i bh dla funkcji >> pisania znaków > > Sądziłem, że taka jest praktyka by nie podawać argumentów, których > wartość znajduje się w rejestrach, stąd nagminne opuszczanie ustawień > stronicy itp. A skąd pomysł, że się znajduje? Kto niby miał wstawić te wartości? Jeśli raz wstawiliśmy, a z opisu funkcji wynika, że zostały, to ok, ale jeśli nic nie wstawiliśmy, to np. możemy pisać czarno na czarnym, bo nie ustawiliśmy koloru znaku, a w rejestrze było 0.
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 14 Sep 2006 08:13
Date: Thu, 14 Sep 2006 08:13
13 lines
1605 bytes
1605 bytes
Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy... Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy, że po sobie następuje odczyt położenia ah,3h i ustawienie położenia wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno zero? Przecież to jest nadmiarowa instrukcja w tym wypadku. -- Johnny
Re: Problem z przesunięciem ekranu
Author: Bogdan (bogdro)
Date: Thu, 14 Sep 2006 08:28
Date: Thu, 14 Sep 2006 08:28
27 lines
2182 bytes
2182 bytes
Johnny napisał(a): > Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym > co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie > podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy... > > Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma > określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy, > że po sobie następuje odczyt położenia ah,3h i ustawienie położenia > wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji > ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno > zero? Przecież to jest nadmiarowa instrukcja w tym wypadku. Jeśli RBIL (a najlepiej też debuger) mówi, że dany rejestr nie jest modyfikowany przez dane przerwanie, można nie powtarzać instrukcji, np. mov ah,0eh mov al,'A' int 10h mov al,'B' int 10h ; AH=0eh -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Prawdziwy, bezpieczny komunikator: www.JabberPL.org
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 14 Sep 2006 09:32
Date: Thu, 14 Sep 2006 09:32
106 lines
3271 bytes
3271 bytes
Mam kolejny problem. Wszystko u mnie działa pięknie do momentu gdy wskaźnik nie dojdzie do ostatniego wiersza i przedostatniej kolumny wówczas wprowadzony znak nie zostaje wyświetlony, pojawia się on dopiero wtedy gdy następuje przewinięcie okna. I tak się dzieje cały czas znak z przedostatniej kolumny nie jest wyświetlany. Nie mam pojęcia dlaczego. Podejrzewam, że może atrybut w pamięci dla tego obszaru jest "dziwny" ale po pierwsze niby dlaczego po drugie nie potrafię go podejrzeć (podgląd B800 w trybie debugowania CodeView pokazuje mi oczywiście zawartość bieżącego okna). Poniżej zamieszczam kod programu. Może ktoś wie w czym rzecz. title 6_04 .model small .stack 100h .386 .code ;--------------------------------------------- ; main ;--------------------------------------------- main proc mov ax,@data ; inicjalizacja ds mov ds,ax mov ah,0h ; ustawienie trybu grafiki mov al,1h mov bh,0h int 10h mov ah,3h ; odczytanie położenia wskaźnika int 10h odczytaj: ; odczyt znaku mov ah,10h mov bh,0h int 16h cmp ah,1h ; jeżeli wprowadzono ESC zakończ program je exit cmp ah,2h ; jeżeli wprowadzono znak z zakresu 0-9 jb odczytaj ; wyświetl go i przesuń wskaźnik cmp ah,0Bh ja odczytaj ;mov ah,0Ah ; wyświetl znak ;mov bh,0h ;mov cx,1h ;int 10h mov ah,9h ; wyświetl znak mov bh,0h mov bl,7h mov cx,1h int 10h inc dl ; zwiększ wskaźnik kolumny ;cmp dl,4Fh ; sprawdź czy to nie jest ostatnia kolumna cmp dl,27h ja next_row ; jeśli tak to przejdź do następnego wiersza mov ah,2h ; ustaw wskaźnik kolumnę dalej int 10h jmp odczytaj next_row: ; przejście do następnego wiersza inc dh ; zwiększ wskaźnik wiersza cmp dh,18h ; sprawdź czy to nie jest ostatni wiersz ja scroll ; jeśli tak skocz do sekcji przewijania okna mov ah,2h ; ustaw wskaźnik w nowym wierszu mov dl,0h int 10h jmp odczytaj ; odczytaj kolejny znak scroll: ; przewiń okno mov ah,6h mov al,1h xor cx,cx ;mov dl,4Fh mov dl,27h mov dh,18h mov bh,7h int 10h mov ah,2h ; ustaw wskaźnik w nowym wierszu mov bx,0h mov dl,0h mov dh,18h int 10h jmp odczytaj ; odczytaj kolejny znak exit: mov ax,4C00h ; zakończenie procedury int 21h main endp .data end main -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 14 Sep 2006 10:20
Date: Thu, 14 Sep 2006 10:20
33 lines
2768 bytes
2768 bytes
Bogdan (bogdro) napisał(a): > Johnny napisał(a): > > Dzięki wszystkim za pomoc. Namierzyłem przyczynę błędu i zgodnie z tym > > co pisał Bernard zemściło się nie podawanie niektórych parametrów: nie > > podałem atrybutu w sekcji przewijania okna, stąd BH był zerowy... > > > > Ale wracając do tego fragmentu. Czy mając pewność, że dany rejestr ma > > określoną wartość należy mu przypisać ponownie wartość czy nie? Załóżmy, > > że po sobie następuje odczyt położenia ah,3h i ustawienie położenia > > wskaźnika ah,2h. W sekcji odczytu ustawiłem stronicę bh,0h czy w sekcji > > ustawienia powtórzyć linię mov bh,0h skoro wiem, że tam jest na pewno > > zero? Przecież to jest nadmiarowa instrukcja w tym wypadku. > > Jeśli RBIL (a najlepiej też debuger) mówi, że dany rejestr nie jest > modyfikowany przez dane przerwanie, można nie powtarzać instrukcji, np. > > mov ah,0eh > mov al,'A' > int 10h > mov al,'B' > int 10h ; AH=0eh Tak zgadza się, jednak z wielu powodów lepiej jest powtórzyć choćby wiersz niżej tą samą instrukcje (np. dla tego, że: kod jest przejżystrzy, czasem nie można mieć 100% pewności czy nie zostanie zmieniony, jakiś błąd może spowodować zmiane) Co prawda do w/w przykładu przez Bogdana raczej się nie trzeba tego trzymać, ale ja i tak bym powtózył te ah :] może i kod byłby większy o te pięć bajtów, ale za to pewny i przejrzysty. Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 14 Sep 2006 14:43
Date: Thu, 14 Sep 2006 14:43
230 lines
5287 bytes
5287 bytes
Johnny napisał(a): > Mam kolejny problem. Wszystko u mnie działa pięknie do momentu gdy > wskaźnik nie dojdzie do ostatniego wiersza i przedostatniej kolumny > wówczas wprowadzony znak nie zostaje wyświetlony, pojawia się on dopiero > wtedy gdy następuje przewinięcie okna. I tak się dzieje cały czas znak z > przedostatniej kolumny nie jest wyświetlany. Nie mam pojęcia dlaczego. > Podejrzewam, że może atrybut w pamięci dla tego obszaru jest "dziwny" > ale po pierwsze niby dlaczego po drugie nie potrafię go podejrzeć > (podgląd B800 w trybie debugowania CodeView pokazuje mi oczywiście > zawartość bieżącego okna). > > Poniżej zamieszczam kod programu. Może ktoś wie w czym rzecz. > > title 6_04 > .model small > .stack 100h > .386 > .code > ;--------------------------------------------- > ; main > ;--------------------------------------------- > main proc > mov ax,@data ; inicjalizacja ds > mov ds,ax > > mov ah,0h ; ustawienie trybu grafiki > mov al,1h > mov bh,0h > int 10h > > mov ah,3h ; odczytanie położenia wskaźnika > int 10h > > odczytaj: ; odczyt znaku > mov ah,10h > mov bh,0h > int 16h > > cmp ah,1h ; jeżeli wprowadzono ESC zakończ program > je exit > > cmp ah,2h ; jeżeli wprowadzono znak z zakresu 0-9 > jb odczytaj ; wyświetl go i przesuń wskaźnik > cmp ah,0Bh > ja odczytaj > > ;mov ah,0Ah ; wyświetl znak > ;mov bh,0h > ;mov cx,1h > ;int 10h > > mov ah,9h ; wyświetl znak > mov bh,0h > mov bl,7h > mov cx,1h > int 10h > > inc dl ; zwiększ wskaźnik kolumny > ;cmp dl,4Fh ; sprawdź czy to nie jest ostatnia kolumna > cmp dl,27h > ja next_row ; jeśli tak to przejdź do następnego wiersza > > mov ah,2h ; ustaw wskaźnik kolumnę dalej > int 10h > jmp odczytaj > > next_row: ; przejście do następnego wiersza > inc dh ; zwiększ wskaźnik wiersza > cmp dh,18h ; sprawdź czy to nie jest ostatni wiersz > ja scroll ; jeśli tak skocz do sekcji przewijania okna > > mov ah,2h ; ustaw wskaźnik w nowym wierszu > mov dl,0h > int 10h > > jmp odczytaj ; odczytaj kolejny znak > > scroll: ; przewiń okno > mov ah,6h > mov al,1h > xor cx,cx > ;mov dl,4Fh > mov dl,27h > mov dh,18h > mov bh,7h > int 10h > > mov ah,2h ; ustaw wskaźnik w nowym wierszu > mov bx,0h > mov dl,0h > mov dh,18h > int 10h > > jmp odczytaj ; odczytaj kolejny znak > > > exit: > mov ax,4C00h ; zakończenie procedury > int 21h > main endp > > .data > end main > > > -- > Johnny W wolnej chwili napisałem to co chcesz zrobić. ; ============================= title numberblock .model small .stack 100h .386 _TEXT segment start: ; tryb wideo mov ah, 0 mov al, 3 int 10h ; stronica mov ah, 5 mov al, 0 int 10h loop1: mov ah, 1 int 10h cmp al, 1bh ; esc je short exit call WriteChar call Scroll jmp short loop1 exit: mov ax, 4c00h int 21h WriteChar proc mov ah, 1 mov cx, 0607h int 10h mov ah, 10h int 16h ; wypisujemy tylko cyfry od 0 do 9 cmp al, '0' jb short loop1 cmp al, '9' ja short loop1 mov ah, 9 ; al jest już wypełnione xor bh, bh mov bl, 0000111b ; (000) - czarne tło, (0111) - białe litery mov cx, 1 int 10h ret WriteChar endp ; ----------------------- Scroll proc ; pobranie wskaźnika mov ah, 3 xor bh, bh int 10h ; ustawienie wskaźnika mov ah, 2 cmp dl, (4fh - 60) ; ilość znaków w wierszu ja short ch1 inc dl xor bx, bx int 10h ret ch1: inc dh cmp dh, 18h ja short ch2 xor dl, dl xor bx, bx int 10h ret ch2: mov dh, 18h xor dl, dl xor bx, bx int 10h ; przewinięcie okna mov ah, 6 mov al, 1 xor cx, cx mov dh, 18h mov dl, 4fh mov bh, 7 int 10h ret Scroll endp _TeXT ends end start ; ============================= Tobie zostawiam optymalizacje i poprawki (poprawki w sęsie przejżystości i złożoności kodu, bo działa bez problemów, przynajmniej mnie się nie udało ich znaleść :) ) Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 14 Sep 2006 15:31
Date: Thu, 14 Sep 2006 15:31
174 lines
3781 bytes
3781 bytes
Matuzalem napisał(a): > W wolnej chwili napisałem to co chcesz zrobić. > > ; ============================= > title numberblock > > .model small > .stack 100h > .386 > > _TEXT segment > start: > > ; tryb wideo > mov ah, 0 > mov al, 3 > int 10h > > ; stronica > mov ah, 5 > mov al, 0 > int 10h > > loop1: > > mov ah, 1 > int 10h > > cmp al, 1bh ; esc > je short exit > > call WriteChar > call Scroll > > jmp short loop1 > > exit: > > mov ax, 4c00h > int 21h > > WriteChar proc > > mov ah, 1 > mov cx, 0607h > int 10h > > mov ah, 10h > int 16h > > ; wypisujemy tylko cyfry od 0 do 9 > cmp al, '0' > jb short loop1 > cmp al, '9' > ja short loop1 > > mov ah, 9 > ; al jest już wypełnione > xor bh, bh > mov bl, 0000111b ; (000) - czarne tło, (0111) - białe litery > mov cx, 1 > int 10h > > ret > WriteChar endp > > ; ----------------------- > Scroll proc > > ; pobranie wskaźnika > mov ah, 3 > xor bh, bh > int 10h > > ; ustawienie wskaźnika > mov ah, 2 > > cmp dl, (4fh - 60) ; ilość znaków w wierszu > ja short ch1 > > inc dl > xor bx, bx > int 10h > ret > > ch1: > inc dh > cmp dh, 18h > ja short ch2 > > xor dl, dl > xor bx, bx > int 10h > ret > > ch2: > > mov dh, 18h > xor dl, dl > xor bx, bx > int 10h > > ; przewinięcie okna > mov ah, 6 > mov al, 1 > xor cx, cx > mov dh, 18h > mov dl, 4fh > mov bh, 7 > int 10h > > ret > Scroll endp > > _TeXT ends > end start > ; ============================= > > Tobie zostawiam optymalizacje i poprawki (poprawki w sęsie > przejżystości i złożoności kodu, bo działa bez problemów, > przynajmniej mnie się nie udało ich znaleść :) ) A to troche bardziej zoptymalizowana wersja procedury 'Scrool' :) : ; ------------------------------------------------------- Scroll proc ; pobranie wskaźnika mov ah, 3 xor bx, bx int 10h ; ustawienie wskaźnika mov ah, 2 cmp dl, (4fh - 60) ; ilość znaków w wierszu ja short ch1 inc dl int 10h ret ch1: inc dh xor dl, dl cmp dh, 18h ja short ch2 int 10h ret ch2: mov dh, 18h int 10h ; przewinięcie okna mov ah, 6 mov al, 1 xor cx, cx mov dh, 18h mov dl, 4fh mov bh, 7 int 10h ret Scroll endp ; ------------------------------------------------------- Miłej zabawy ;] Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 14 Sep 2006 15:31
Date: Thu, 14 Sep 2006 15:31
174 lines
3806 bytes
3806 bytes
Matuzalem napisał(a): > W wolnej chwili napisałem to co chcesz zrobić. > > ; ============================= > title numberblock > > .model small > .stack 100h > .386 > > _TEXT segment > start: > > ; tryb wideo > mov ah, 0 > mov al, 3 > int 10h > > ; stronica > mov ah, 5 > mov al, 0 > int 10h > > loop1: > > mov ah, 1 > int 10h > > cmp al, 1bh ; esc > je short exit > > call WriteChar > call Scroll > > jmp short loop1 > > exit: > > mov ax, 4c00h > int 21h > > WriteChar proc > > mov ah, 1 > mov cx, 0607h > int 10h > > mov ah, 10h > int 16h > > ; wypisujemy tylko cyfry od 0 do 9 > cmp al, '0' > jb short loop1 > cmp al, '9' > ja short loop1 > > mov ah, 9 > ; al jest już wypełnione > xor bh, bh > mov bl, 0000111b ; (000) - czarne tło, (0111) - białe litery > mov cx, 1 > int 10h > > ret > WriteChar endp > > ; ----------------------- > Scroll proc > > ; pobranie wskaźnika > mov ah, 3 > xor bh, bh > int 10h > > ; ustawienie wskaźnika > mov ah, 2 > > cmp dl, (4fh - 60) ; ilość znaków w wierszu > ja short ch1 > > inc dl > xor bx, bx > int 10h > ret > > ch1: > inc dh > cmp dh, 18h > ja short ch2 > > xor dl, dl > xor bx, bx > int 10h > ret > > ch2: > > mov dh, 18h > xor dl, dl > xor bx, bx > int 10h > > ; przewinięcie okna > mov ah, 6 > mov al, 1 > xor cx, cx > mov dh, 18h > mov dl, 4fh > mov bh, 7 > int 10h > > ret > Scroll endp > > _TeXT ends > end start > ; ============================= > > Tobie zostawiam optymalizacje i poprawki (poprawki w sęsie > przejżystości i złożoności kodu, bo działa bez problemów, > przynajmniej mnie się nie udało ich znaleść :) ) A to troche bardziej zoptymalizowana wersja procedury 'Scrool' :) : ; ------------------------------------------------------- Scroll proc ; pobranie wskaźnika mov ah, 3 xor bx, bx int 10h ; ustawienie wskaźnika mov ah, 2 cmp dl, (4fh - 60) ; ilość znaków w wierszu ja short ch1 inc dl int 10h ret ch1: inc dh xor dl, dl cmp dh, 18h ja short ch2 int 10h ret ch2: mov dh, 18h int 10h ; przewinięcie okna mov ah, 6 mov al, 1 xor cx, cx mov dh, 18h mov dl, 4fh mov bh, 7 int 10h ret Scroll endp ; ------------------------------------------------------- Miłej zabawy ;] Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Fri, 15 Sep 2006 06:18
Date: Fri, 15 Sep 2006 06:18
7 lines
1375 bytes
1375 bytes
Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja wersja zachowuje się tak samo na Twoim komputerze? -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Fri, 15 Sep 2006 10:05
Date: Fri, 15 Sep 2006 10:05
25 lines
2486 bytes
2486 bytes
Johnny napisał(a): > Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki > więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej > wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja > wersja zachowuje się tak samo na Twoim komputerze? Tak, a to jest powód: > odczytaj: ; odczyt znaku > mov ah,10h > int 16h Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie. Zauważ, że w moim przykładzie, jest funkcja mov ah, 1/int 10h która wykonuje to samo, tyl, że nie czeka na wypełnienie bufora i działa w pętli, więc nic nie "blokuje" programu. mov ah, 10h blokuje program w tym miejscu, ponieważ wskaźnik zmienia położenie, a bufor jeszcze nie jest pełny - bądź program w związku z przesunięciem gdzieś "gubi" naciśnięcie klawisza przez jakiś skok - i dlatego dopiero gdy wskaźnik zostanie ustawiony na nowej pozycji sygnał naciśnięcia dociera do bufora i znak zostaje wpisany. Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Fri, 15 Sep 2006 10:20
Date: Fri, 15 Sep 2006 10:20
44 lines
3000 bytes
3000 bytes
Matuzalem napisał(a): > Johnny napisał(a): > > Dzięki za przesłany program. To co piszę to zwykłe ćwiczenie z książki > > więc równie ważne dla mnie jest zrozumienie przyczyny znikania w mojej > > wersji znaku w przedostatniej kolumnie ostatniego wiersza. Czy moja > > wersja zachowuje się tak samo na Twoim komputerze? > > Tak, a to jest powód: > > > odczytaj: ; odczyt znaku > > mov ah,10h > > int 16h > > Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie. > Zauważ, że w moim przykładzie, jest funkcja mov ah, 1/int 10h > która wykonuje to samo, tyl, że nie czeka na wypełnienie bufora i > działa w pętli, więc nic nie "blokuje" programu. > mov ah, 10h blokuje program w tym miejscu, ponieważ wskaźnik zmienia > położenie, a bufor jeszcze nie jest pełny - bądź program w > związku z przesunięciem gdzieś "gubi" naciśnięcie klawisza przez > jakiś skok - i dlatego dopiero gdy wskaźnik zostanie ustawiony na > nowej pozycji sygnał naciśnięcia dociera do bufora i znak zostaje > wpisany. "sygnał naciśnięcia dociera" - ściślej: zostaje wykonany z kolejki. Tak mi jeszcze do głowy przyszło.. :P Skoro uczysz się asm, sprubuj samemu zanalizować program który stworzyłeś, będzie to niezła zabawa i dokładnie dowiesz się "dla czego...". Nie zapomnij dodać informacji debugowych. Korzystasz z TASM, więc tak to będzie: tasm /l/n/zi program.asm tlink /3/m/v program.obj td program.exe 'td' to Turbo Debugger. Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Fri, 15 Sep 2006 13:26
Date: Fri, 15 Sep 2006 13:26
12 lines
1815 bytes
1815 bytes
>> Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie. >> Zauważ, że w moim przykładzie, jest funkcja mov ah, 1/int 10h Czegoś tu nie rozumiem. Funkcja 1h przerwania 10h to ustawienie wierszy wskaźnika, chyba, że chodziło Ci o przerwanie 16h ale to też się kupy nie trzyma bo 1h jest sprawdzeniem buforu klawiatury dla starszych typów klawiatur a odpowiednikiem mojej 10h jest 00h również jako alternatywa dla starszych klawiatur. Czy podany przykład sprawdziłeś czy to była tylko teoria? -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Fri, 15 Sep 2006 13:55
Date: Fri, 15 Sep 2006 13:55
33 lines
2616 bytes
2616 bytes
Johnny napisał(a):
> >> Ta funkcja czeka na naciśnięcie znaku, a potem jego wyświetlenie.
> >> Zauważ, że w moim przykładzie, jest funkcja mov ah, 1/int 10h
>
> Czegoś tu nie rozumiem. Funkcja 1h przerwania 10h to ustawienie wierszy
> wskaźnika, chyba, że chodziło Ci o przerwanie 16h ale to też się kupy
> nie trzyma bo 1h jest sprawdzeniem buforu klawiatury dla starszych typów
> klawiatur a odpowiednikiem mojej 10h jest 00h również jako alternatywa
> dla starszych klawiatur. Czy podany przykład sprawdziłeś czy to była
> tylko teoria?
sorry jak się robi dwie rzeczy na raz to tak jest :P
Ten przykład co Ci napisałem działa, ale znalazłem błąd:
loop1:
mov ah, 1
int 10h
ma być:
loop1:
mov ah, 10h
int 16h
Tak 1/11 jest dla starszych klawiatur, ale zwróć uwage na ZF w opisie
tych dwuch funkcji.
Po prostu tak jak pisałem kolejka zanim się wypełni, jest wykonany
skok i dla tego dopiero znak jest wypisany po przesunięciu wskaźnika.
Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Fri, 15 Sep 2006 14:09
Date: Fri, 15 Sep 2006 14:09
41 lines
2624 bytes
2624 bytes
Jeszcze tak przy okazji... :] Po co iniciujesz _DATA: mov ax,@data ; inicjalizacja ds mov ds,ax Nie używasz tego segmentu (przynajmniej ja nigdzie tego nie zaobserwowałem :) ) to go nie iniciuj. Twój kod jest okropnie chaotyczny, co sprawia, że jest trudny do odczytu dla człowieka i procesora :). Wiem, że uczysz się, ale postaraj się najpierw przemyśleć to co chcesz napisać, potem poukładać to w taki sposób, aby jednak skoków (czy wywołań) było w miare mało - albo, przynajmniej, aby skoki nie były dalekie i nie rozmieszczone chaotycznie. Staraj się rónież używać optymalniejszych rozwiązań np. mov ah, 0 itd. lepiej zastąpić xor ah, ah (na pewno wiesz czemu) Pisze o tym bo np. (twój kod): mov ah,2h mov dl,0h ; lepiej użyć xor dl, dl int 10h a za chwile: mov ah,6h mov al,1h xor cx,cx ; tu już urzyłeś xor mov dl,5h int 10h W/w przykład dowodzi, że jeszcze piszesz chaotycznie (co tam dobrze jest czepiam się :P ) Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Mon, 18 Sep 2006 08:09
Date: Mon, 18 Sep 2006 08:09
20 lines
2095 bytes
2095 bytes
> ma być: > > loop1: > > mov ah, 10h > int 16h > Aleś zakręcił. Tak właśnie wygląda moja funkcja odczytująca znak przed Twoimi poprawkami. No może bez tego loop1. Poza tym mam wątpliwości co do Twojej diagnozy. Gdyby tak było to znaki znikałyby losowo a przynajmniej w wielu miejscach. Tymczasem efekt "nie wyświetlenia" znaku występuje tylko w ostatnim wierszu i w przedostatniej kolumnie. Co więcej znak zostaje wczytany do pamięci ekranu ponieważ przesunięcie ekranu o wiersz skutkuje pojawieniem się tegoż. Może atrybut znaku w ostatnim wierszu i przedostatniej kolumnie jest "inny". Tylko jak to podejrzeć? W trybie debuggera pamięci ekranu znajduje się okno debuggera.... -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Mon, 18 Sep 2006 17:37
Date: Mon, 18 Sep 2006 17:37
57 lines
3420 bytes
3420 bytes
Johnny napisał(a): > > ma być: > > > > loop1: > > > > mov ah, 10h > > int 16h > > > > Aleś zakręcił. Troszeczke ... :] > Tak właśnie wygląda moja funkcja odczytująca znak przed > Twoimi poprawkami. No może bez tego loop1. No nie do końca, choćby dla tego, że wszystkie potrzebne parametry są przekazywane do funkcji, jest mniej "niepotrzebnych" skoków/wywołań, no i jest w miare bardziej czytelna :] > Poza tym mam wątpliwości co do Twojej diagnozy. Nie debugowałem twojego programu, ja tylko przypuszczam, debugowanie/analize/optymalizacje zostawiam Tobie... > Gdyby tak było to znaki znikałyby losowo a przynajmniej w wielu miejscach. No i właśnie, że nie jest to losowe, oznacza to iż prawdopodobnie właśnie tak się dzieje jak pisałem (jeszcze trzeba wziąść pod uwage, że może gdzieć "zjadłeś" wymagany parametr, lub ekran jest najpierw "przesunięty", a potem znak jest nadpisywany w pamięci) > Tymczasem efekt "nie wyświetlenia" znaku występuje tylko w ostatnim > wierszu i w przedostatniej kolumnie. Jeśli występuje jakaś powtarzająca się zależność i za każdym razem app reaguje tak samo, to oznacza, że błąd musi znajdować się w implementacji. > Co więcej znak zostaje wczytany do pamięci ekranu ponieważ przesunięcie ekranu > o wiersz skutkuje pojawieniem się tegoż. Bo prawdopodobnie najpierw znak jest wczytany, a potem następuje przesunięcie (czyli tak jak pisałem: kolejka...) > Może atrybut znaku w ostatnim wierszu i przedostatniej kolumnie jest "inny". Jeśli gdzieś "zjadłeś" wymagany parametr funkcji, również może tak być. > Tylko jak to podejrzeć? Za pomocą debugera... :] Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 20 Sep 2006 08:31
Date: Wed, 20 Sep 2006 08:31
94 lines
3071 bytes
3071 bytes
No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło. Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą wersję z wykorzystaniem tych samych funkcji? Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę. title ekran .model small .stack 100h .386 .code ;--------------------------------------------- ; main ;--------------------------------------------- main proc mov ax,@data ; inicjalizacja ds mov ds,ax xor ah,ah ; minimalny tryb wideo mov al,1h int 10h mov ah,0fh ; odczyt liczby kolumn int 10h dec ah ; l kolumn - 1 bo indeks zaczyna się od zera mov lcol,ah mov cx,040ah ; licznik odczyt: mov ah,8h int 21h cmp al,1bh ; czy ESC je exit mov ah,0ah ; zapis znaku xor bh,bh push cx mov cx,1h int 10h pop cx call przesun loop odczyt exit: mov ax,4C00h ; zakończenie procedury int 21h main endp ;--------------------------------------------- ; przesun ;--------------------------------------------- przesun proc pusha ; wszystko na stos mov ah,3h ; odczytaj położenie wskaźnika xor bh,bh int 10h mov ah,2h ; przesuń wskaźnik xor bh,bh cmp dl,lcol je nwiersz inc dl jmp exec nwiersz: mov dl,0h inc dh exec: int 10h popa ret przesun endp .data lcol db ? end main -- Johnny
Re: Problem z przesunięciem ekranu
Author: Bernard
Date: Wed, 20 Sep 2006 10:33
Date: Wed, 20 Sep 2006 10:33
100 lines
3334 bytes
3334 bytes
Johnny wrote: > No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i > ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam > uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji > 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło. > > Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą > wersję z wykorzystaniem tych samych funkcji? > Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii > podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę. > title ekran > .model small > .stack 100h > .386 > .code > ;--------------------------------------------- > ; main > ;--------------------------------------------- > main proc > mov ax,@data ; inicjalizacja ds > mov ds,ax > > xor ah,ah ; minimalny tryb wideo 40 kolumn? O to Ci chodziło? > mov al,1h > int 10h > > mov ah,0fh ; odczyt liczby kolumn > int 10h > dec ah ; l kolumn - 1 bo indeks zaczyna się od zera > mov lcol,ah > > mov cx,040ah ; licznik Będziemy powtarzali pętlę 1034 razy? > odczyt: > mov ah,8h > int 21h Ciekawe czy wartość CX przeżyje to wywołanie... > cmp al,1bh ; czy ESC > je exit > > mov ah,0ah ; zapis znaku > xor bh,bh > push cx > mov cx,1h > int 10h > pop cx > > call przesun > > loop odczyt > > exit: > mov ax,4C00h ; zakończenie procedury > int 21h > main endp > > > ;--------------------------------------------- > ; przesun > ;--------------------------------------------- > przesun proc > pusha ; wszystko na stos > > mov ah,3h ; odczytaj położenie wskaźnika > xor bh,bh > int 10h > > mov ah,2h ; przesuń wskaźnik > xor bh,bh > cmp dl,lcol > je nwiersz > inc dl > jmp exec > > nwiersz: > mov dl,0h > inc dh I przesuwamy do nieistniejącego wiersza ekranu... > exec: > int 10h > > popa > ret > > przesun endp > > .data > lcol db ? > end main > >
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Wed, 20 Sep 2006 12:15
Date: Wed, 20 Sep 2006 12:15
30 lines
2198 bytes
2198 bytes
Bernard napisał(a): >> xor ah,ah ; minimalny tryb wideo > > 40 kolumn? O to Ci chodziło? Tryb 1 to raczej 28 kolumn. Ale to nie jest istotne. >> mov cx,040ah ; licznik > > Będziemy powtarzali pętlę 1034 razy? Tak. Mniej więcej tyle trzeba aby zapełnić ten ekran. To jest wersja robocza na potrzeby wyłapania przyczyny błędu, więc proponuję nie czepiać się takich rzeczy. > >> odczyt: >> mov ah,8h >> int 21h > > Ciekawe czy wartość CX przeżyje to wywołanie... Przeżyje. > I przesuwamy do nieistniejącego wiersza ekranu... Patrz wyżej. Nie bawiłem się w przesuwanie ekranu. Chcę wyłapać przyczynę błędu. Problem nadal aktualny... -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Wed, 20 Sep 2006 15:50
Date: Wed, 20 Sep 2006 15:50
69 lines
3987 bytes
3987 bytes
Johnny napisał(a): > Bernard napisał(a): > >> xor ah,ah ; minimalny tryb wideo > > > > 40 kolumn? O to Ci chodziło? > > Tryb 1 to raczej 28 kolumn. Ale to nie jest istotne. > > >> mov cx,040ah ; licznik > > > > Będziemy powtarzali pętlę 1034 razy? > > Tak. Mniej więcej tyle trzeba aby zapełnić ten ekran. To jest wersja > robocza na potrzeby wyłapania przyczyny błędu, więc proponuję nie > czepiać się takich rzeczy. > > > >> odczyt: > >> mov ah,8h > >> int 21h > > > > Ciekawe czy wartość CX przeżyje to wywołanie... > Przeżyje. > > > I przesuwamy do nieistniejącego wiersza ekranu... > Patrz wyżej. Nie bawiłem się w przesuwanie ekranu. Chcę wyłapać > przyczynę błędu. > > Problem nadal aktualny... > > -- > Johnny Johnny, Johnny, Johnny ... :) Napisałem Ci gotową wersje programu, który robi to co chcesz... Teraz wystarczy porównać to co Ci napisałem z twoim kodem, i wyszukać różnic, ewentualnie błędów. Jeśli kompilowałeś mój kod, to zauważyłeś, że w nim tego problem nie ma, czyli popełniasz gdzieś błąd, jednak to do Ciebie należy znalezienie go - po pierwsze: życie nie jest łatwe, jeśli sami coś "popsujemy", sami musimy to "naprawić"; po drugie: dla Ciebie będzie lepiej, jak sam znajdziesz ten błąd, bo przy okazji dowiesz się więcej. Johnny napisał(a): > No więc poddaję się. Nigdy się nie poddawaj, to byłby największy błąd. > Próbuję przewalczyć "błąd przedostatniej i ostatniej kolumny" > ale bez pozytywnych rezultatów. Poniżej zamieszczam > uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji > 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło. Problem nie tkwi w funkcjach które używasz, ale w implementacji kodu... > Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na działającą > wersję z wykorzystaniem tych samych funkcji? Ja Ci już podałem... :) > Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii > podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę. Bo widać nie starałeś się za bardzo... :P Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 21 Sep 2006 07:38
Date: Thu, 21 Sep 2006 07:38
112 lines
3429 bytes
3429 bytes
Po pierwsze to palnąłem z odpowiedzią o 28 kolumnach. Oczywiście Bernard ma rację chodzi o 40 kolumn czyli... 28h ;-) Po drugie: Matuzalem, Matuzalem, Matuzalem Twój program działa dokładnie w taki sam sposób jak mój (przynajmniej u mnie) czyli gubi znak w przedostatniej kolumnie ostatniego wiersza. Poniżej zamieszczam Twoją procedurę z małymi zmianami, tj. ustawienie "małego" trybu video no i pętla do odczytu znaków z wywołaniem Twojej procedury. W Twojej procedurze zmieniłem jedynie wiersz cmp dl, (4fh - 60) ; ilość znaków w wierszu na cmp dl,26h Doceniam Twoją pomoc. Próbuję samemu dojść przyczyny takiego zachowania. Ale po kilku dniach takich poszukiwań i po wykonaniu wielu prób warto zapytać innych, prawda? -- Johnny title ekran .model small .stack 100h .386 .code ;--------------------------------------------- ; main ;--------------------------------------------- main proc mov ax,@data ; inicjalizacja ds mov ds,ax xor ah,ah ; minimalny tryb wideo mov al,1h int 10h odczyt: mov ah,8h int 21h cmp al,1bh ; czy ESC je exit mov ah,0ah ; zapis znaku xor bh,bh mov cx,1h int 10h call Scroll loop odczyt exit: mov ax,4C00h ; zakończenie procedury int 21h main endp ;--------------------------------------------- ; Scroll ;--------------------------------------------- Scroll proc ; pobranie wskaźnika mov ah, 3 xor bx, bx int 10h ; ustawienie wskaźnika mov ah, 2 ;cmp dl, (4fh - 60) ; ilość znaków w wierszu cmp dl,26h ja short ch1 inc dl int 10h ret ch1: inc dh xor dl, dl cmp dh, 18h ja short ch2 int 10h ret ch2: mov dh, 18h int 10h ; przewinięcie okna mov ah, 6 mov al, 1 xor cx, cx mov dh, 18h mov dl, 4fh mov bh, 7 int 10h ret Scroll endp end main
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 21 Sep 2006 09:33
Date: Thu, 21 Sep 2006 09:33
43 lines
2346 bytes
2346 bytes
Zrobiłem jeszcze jedną rzecz (kod niżej). Skorzystałem z funkcji 0eh dla int 10h, która "sama" przesuwa znak. I efekt mam ten sam. Więc może to jest kwestia jakichś moich ustawień dla okna DOS-owego. -- Johnny title ekran .model small .stack 100h .386 .code ;--------------------------------------------- ; main ;--------------------------------------------- main proc mov ax,@data ; inicjalizacja ds mov ds,ax xor ah,ah ; minimalny tryb wideo mov al,1h int 10h odczyt: mov ah,8h int 21h cmp al,1bh ; czy ESC je exit mov ah,0eh ; zapis znaku xor bh,bh int 10h jmp odczyt exit: mov ax,4C00h ; zakończenie procedury int 21h main endp .data end main
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 21 Sep 2006 11:19
Date: Thu, 21 Sep 2006 11:19
12 lines
2350 bytes
2350 bytes
Johnny napisał(a): > Zrobiłem jeszcze jedną rzecz (kod niżej). Skorzystałem z funkcji 0eh dla > int 10h, która "sama" przesuwa znak. I efekt mam ten sam. Więc może to > jest kwestia jakichś moich ustawień dla okna DOS-owego. Czekałem kiedy na to wpadniesz... :P Nie Johnny, to nie ma nic wspulnego z żadnymi ustawieniami... Skompiluj to co Ci napisałem - sprawdź czy działa poprawni, jak tak, zanalizuj... Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 21 Sep 2006 11:24
Date: Thu, 21 Sep 2006 11:24
25 lines
2482 bytes
2482 bytes
Johnny napisał(a): > Po pierwsze to palnąłem z odpowiedzią o 28 kolumnach. Oczywiście Bernard > ma rację chodzi o 40 kolumn czyli... 28h ;-) > > Po drugie: Matuzalem, Matuzalem, Matuzalem > > Twój program działa dokładnie w taki sam sposób jak mój (przynajmniej u > mnie) czyli gubi znak w przedostatniej kolumnie ostatniego wiersza. A to dziwne... ? czyli np. 4444444444444444 4444444444444444 4444444444444444 4444444444444400 i tam gdzie są '0' nie wywietla się dopuki nie zejdzie wiersz niżej...? U mnie to co napisałem działa pod 98 ME XP... Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 21 Sep 2006 11:46
Date: Thu, 21 Sep 2006 11:46
10 lines
1858 bytes
1858 bytes
> U mnie to co napisałem działa pod 98 ME XP... > > Pozdrawiam > A jaki XP? Bo ja to testowałem na dwóch komputerach z XP Pro i na obu ten sam efekt... -- Johnny
Re: Problem z przesunięciem ekranu
Author: Matuzalem
Date: Thu, 21 Sep 2006 12:47
Date: Thu, 21 Sep 2006 12:47
22 lines
2449 bytes
2449 bytes
Johnny napisał(a): > > U mnie to co napisałem działa pod 98 ME XP... > > > > Pozdrawiam > > > > A jaki XP? Bo ja to testowałem na dwóch komputerach z XP Pro i na obu > ten sam efekt... XP Home i Pro Zapomniałem dodać, że testowałem jako .exe i jako .com, oba działają poprawnie na: win: 98, ME, XP Home/Pro... .exe działa troche wolniej, ale poprawnie. Dziwna sprawa, a jakiego kompilatora używasz? (TASM wiem, ale wersja) Pozdrawiam
Re: Problem z przesunięciem ekranu
Author: Johnny
Date: Thu, 21 Sep 2006 20:32
Date: Thu, 21 Sep 2006 20:32
10 lines
2265 bytes
2265 bytes
> Dziwna sprawa, a jakiego kompilatora używasz? (TASM wiem, ale wersja) > No właśnie... To jest stary MASM a nie TASM dołączony do książki (v6.13). Jeśli mógłbyś na priva podesłać mi skompilowany przez Ciebie program, a ja podesłałbym Ci mój. Porównalibyśmy przynajmniej czy to nie jest wina kompilatora. Pozdrowienia Johnny
Re: Problem z przesunięciem ekranu
Author: Wiktor S.
Date: Fri, 22 Sep 2006 09:20
Date: Fri, 22 Sep 2006 09:20
100 lines
3392 bytes
3392 bytes
> No więc poddaję się. Próbuję przewalczyć "błąd przedostatniej i > ostatniej kolumny" ale bez pozytywnych rezultatów. Poniżej zamieszczam > uproszczoną wersję bez przesuwania ekranu. Nie korzystam już z funkcji > 10h przerwania 16h lecz 8h - 21h ale to niewiele zmieniło. > > Czy ktoś potrafi wskazać gdzie leży błąd lub przerobić to na > działającą wersję z wykorzystaniem tych samych funkcji? > > Kolega Matuzalem bardzo się starał i za to mu dziękuję. Jednak teorii > podanej w jego odpowiedziach nie udało mi się przełożyć na praktykę. > title ekran > .model small > .stack 100h > .386 > .code > ;--------------------------------------------- > ; main > ;--------------------------------------------- > main proc > mov ax,@data ; inicjalizacja ds > mov ds,ax > > xor ah,ah ; minimalny tryb wideo > mov al,1h > int 10h > > mov ah,0fh ; odczyt liczby kolumn > int 10h > dec ah ; l kolumn - 1 bo indeks zaczyna się od zera > mov lcol,ah > > mov cx,040ah ; licznik > > odczyt: > mov ah,8h > int 21h > > cmp al,1bh ; czy ESC > je exit > > mov ah,0ah ; zapis znaku > xor bh,bh > push cx > mov cx,1h > int 10h > pop cx > > call przesun > > loop odczyt > > exit: > mov ax,4C00h ; zakończenie procedury > int 21h > main endp > > > ;--------------------------------------------- > ; przesun > ;--------------------------------------------- > przesun proc > pusha ; wszystko na stos > > mov ah,3h ; odczytaj położenie wskaźnika > xor bh,bh > int 10h > > mov ah,2h ; przesuń wskaźnik > xor bh,bh > cmp dl,lcol > je nwiersz > inc dl > jmp exec > > nwiersz: > mov dl,0h > inc dh > > exec: > int 10h > > popa > ret > > przesun endp > > .data > lcol db ? > end main SOA#1. Program po zapełnieniu całego ekranu (nie brakuje żadnego znaku) zaczyna mazać po nieistniejącym wierszu poniżej ekranu, co skutkuje rychłym wysypaniem. -- Azarien
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads