Ĺadny brzuch
Tak jak w temacie mam problem z pętlą, wyświetlajacą napis znak po znaku za pomoca int 10h
Program wyświetla tylko rządek spacji, zamiast liter <_<
Oto ona:
mov es, cs mov bp, napis write: call znak call kursor add bp, 1 sub si, 1 cmp si, 0 jne write
Procedura kursor zajmuje się kursorem, bez niej mam to samo, ale tylko 1 spacja :D .
znak: mov ah, 9 mov bl, 7 xor bh, bh mov cx, 1 mov al, [es:bp]; [b]es[/b] wskazuje segment progsa, a [b]bp[/b] offset bieżacego znaku int 10h ret
Jest wśród was jakiś znawca asma, który mógłby coś poradzić ??
Jest wśród was jakiś znawca asma, który mógłby coś poradzić ??
Czy znawcą jestem tego nie wiem, ale kiedyś bawiłem się w asm :) . Mogłeś również podać procedurę "kursor" może bym lepiej pomógł. Z tego co pamiętam kiedy robisz pętle to operuje ona na rejestrze (E)CX zmniejszając go o jeden. W procedurze "znak" zmieniasz jego zawartość dlatego zaraz po write: odłóż go na stos - push CX i zdejmij jego zawartość przed końcem pętli, czyli jne write - pop CX.
Jeżeli chcesz wypisać od razu cały tekst to może lepiej skorzystać z funkcji 0EBH lub 13h przerwania 10H?
Ten sposób nie działa, moja pętla nie jest typową przez loop tylko rolę licznika spełnia si, którego dekrementuje ręcznie.
Najbardziej to mnie dziwi ten rządek spacji (albo nulli), napis ma 24 znaki to pojawiają się 24 spacje.
kursor: mov ah, 2 inc dl xor bh, bh int 10h ret
ps. Piszę ten program pod bardzo stary DOS, i nie działa a jak uruchamiam go w winxp to działa.
A w czym to kompilujesz? Na razie może wypróbuj to (kompilowane w NASM). Do BX wrzucasz zmienną zakończoną zerem i wywołujesz procedurę.
PrintText: pusha mov AH, 0EH PrintTextOne: mov AL, [BX] cmp AL, 0 je PrintTextEnd inc BX push BX xor BX, BX int 10H pop BX jmp PrintTextOne PrintTextEnd: popa ret
Użycie:
Tekst db 'Tekst', 0 ... mov BX, Tekst call PrintText
Użytkownik Sid7 edytował ten post 17 kwiecień 2007, 15:18
Właśnie w NASMie kompiluje. Teraz próbowałem tego sposobu z funkcją 13h
write: mov ah, 13h mov al, 1 mov bl, 7 xor bh, bh mov cx, si xor dh, dh; wrs i kol xor dl, dl mov bp, cs; adres mov es, bp mov bp, napis int 10h; jazda!
W si mam tym razem ilość znaków.
I uzyskałem zaskakujący rezultat - w winxp działa , w czystym DOSie NIC się nie wyświetla. :o
W najbliższym czasie przetestuje ten PrintText :)
Procedura, która ma wypisać tekst sprawia tyle problemów? o_O
Write: cld mov ah, 0xe 1: lodsb cmp al,0 je 2 int 0x10 jmp 1 2: ret
Pisałem z głowy, ale powinno działać i chyba idea jest widoczna :>
I nie wywołuj kolejnego przerwania tylko po to aby przesunąć kursor. Jest to bez sensu kompletnie.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Program wyświetla tylko rządek spacji, zamiast liter <_<
Oto ona:
mov es, cs mov bp, napis write: call znak call kursor add bp, 1 sub si, 1 cmp si, 0 jne write
Procedura kursor zajmuje się kursorem, bez niej mam to samo, ale tylko 1 spacja :D .
znak: mov ah, 9 mov bl, 7 xor bh, bh mov cx, 1 mov al, [es:bp]; [b]es[/b] wskazuje segment progsa, a [b]bp[/b] offset bieżacego znaku int 10h ret
Jest wśród was jakiś znawca asma, który mógłby coś poradzić ??
Jest wśród was jakiś znawca asma, który mógłby coś poradzić ??
Czy znawcą jestem tego nie wiem, ale kiedyś bawiłem się w asm :) . Mogłeś również podać procedurę "kursor" może bym lepiej pomógł. Z tego co pamiętam kiedy robisz pętle to operuje ona na rejestrze (E)CX zmniejszając go o jeden. W procedurze "znak" zmieniasz jego zawartość dlatego zaraz po write: odłóż go na stos - push CX i zdejmij jego zawartość przed końcem pętli, czyli jne write - pop CX.
Jeżeli chcesz wypisać od razu cały tekst to może lepiej skorzystać z funkcji 0EBH lub 13h przerwania 10H?
Ten sposób nie działa, moja pętla nie jest typową przez loop tylko rolę licznika spełnia si, którego dekrementuje ręcznie.
Najbardziej to mnie dziwi ten rządek spacji (albo nulli), napis ma 24 znaki to pojawiają się 24 spacje.
kursor: mov ah, 2 inc dl xor bh, bh int 10h ret
ps. Piszę ten program pod bardzo stary DOS, i nie działa a jak uruchamiam go w winxp to działa.
A w czym to kompilujesz? Na razie może wypróbuj to (kompilowane w NASM). Do BX wrzucasz zmienną zakończoną zerem i wywołujesz procedurę.
PrintText: pusha mov AH, 0EH PrintTextOne: mov AL, [BX] cmp AL, 0 je PrintTextEnd inc BX push BX xor BX, BX int 10H pop BX jmp PrintTextOne PrintTextEnd: popa ret
Użycie:
Tekst db 'Tekst', 0 ... mov BX, Tekst call PrintText
Użytkownik Sid7 edytował ten post 17 kwiecień 2007, 15:18
Właśnie w NASMie kompiluje. Teraz próbowałem tego sposobu z funkcją 13h
write: mov ah, 13h mov al, 1 mov bl, 7 xor bh, bh mov cx, si xor dh, dh; wrs i kol xor dl, dl mov bp, cs; adres mov es, bp mov bp, napis int 10h; jazda!
W si mam tym razem ilość znaków.
I uzyskałem zaskakujący rezultat - w winxp działa , w czystym DOSie NIC się nie wyświetla. :o
W najbliższym czasie przetestuje ten PrintText :)
Procedura, która ma wypisać tekst sprawia tyle problemów? o_O
Write: cld mov ah, 0xe 1: lodsb cmp al,0 je 2 int 0x10 jmp 1 2: ret
Pisałem z głowy, ale powinno działać i chyba idea jest widoczna :>
I nie wywołuj kolejnego przerwania tylko po to aby przesunąć kursor. Jest to bez sensu kompletnie.