Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[FASM] Nie kończąca sie pętla



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
tyczka
Gość





PostWysłany: Pon Wrz 21, 2009 4:14 pm      Temat postu: [FASM] Nie kończąca sie pętla Odpowiedz z cytatem Pisownia

Czesc pisze prosty program w jezyku assembler (fasm)
Kod:

format MZ
org 100h

start:
        mov ecx, 3
        petla:
                mov ah,9
                mov dx,tekst
                int 21h

                mov ax,0
                int 16h

                dec ecx
         loop petla

tekst db 10,"cos$"  


W sumie działa, lecz powinoo tylko 3 razy wyswietlić tekst a wyświetla w nieskończoność
Powrót do góry
soku11



Dołączył: 28 Gru 2007
Posty: 644
Skąd: Wola Karczewska

PostWysłany: Pon Wrz 21, 2009 4:52 pm      Temat postu: Odpowiedz z cytatem Pisownia

Fasma nie znam, ale z tego co widzę, to program nie ma się kiedy zakończyć, bo nie wrzuciłeś przerwania od zakończenia programu po końcu pętli... Jednak nie wiem czy po takim czymś program nie powinien wywalić jakiegoś seg faulta...
Dodatkowo z tego co znalazłem na necie, to int 16h korzysta z rejestru AH, a nie AL. Jeśli ma to wczytać klawisz, to AH ma być 0. W tym wypadku AH jest 9 (wcześniejsze przerwanie), więc zachowanie może być niezdefiniowane.
A instrukcja loop to 'nakładka' na skok warunkowy jeśli ecx != 0?

Pozdrawiam.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Pon Wrz 21, 2009 5:26 pm      Temat postu: Odpowiedz z cytatem Pisownia

tyczka:
Może należy zacząć od przestudiowania dokumentacji i sprawdzenia, co robi instrukcja loop w fasmie? Błąd leży w liniach 15-16.

_________________
Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok.
"Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
VirtManx5



Dołączył: 26 Cze 2010
Posty: 21

PostWysłany: Pon Lip 05, 2010 3:58 pm      Temat postu: Odpowiedz z cytatem Pisownia

można zrobić tak:
Kod:
format MZ
org 100h

start:
        mov ecx, 3
        petla:
                mov ah,9
                mov dx,tekst
                int 21h

                mov ax,0
                int 16h

                dec ecx
                cmp ecx,0

          ja petla

tekst db 10,"cos$"
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
marcinnowicki



Dołączył: 22 Sty 2011
Posty: 1

PostWysłany: Sob Sty 22, 2011 2:04 pm      Temat postu: Re: [FASM] Nie kończąca sie pętla Odpowiedz z cytatem Pisownia

tyczka napisał:
Czesc pisze prosty program w jezyku assembler (fasm)
Kod:

format MZ
org 100h

start:
        mov ecx, 3
        petla:
                mov ah,9
                mov dx,tekst
                int 21h

                mov ax,0
                int 16h

                dec ecx
         loop petla

tekst db 10,"cos$"  


W sumie działa, lecz powinoo tylko 3 razy wyswietlić tekst a wyświetla w nieskończoność



Przyjacielu po pierwsze jezeli używasz polecenia 'loop' do tworzenia petli to nie musisz ... nie możesz juz po kazdym przejsciu przez ta petle modyfikowac zawartosci rejestru ECX. Instrukcja ma postac :

Kod:
mov   ecx, jakasNwartosc
etykieta:
twoj kod programu ktory ma sie powtarzac jakasNwartosc_razy
loop   etykieta



wartosc rejestru ecx jest w tym momecie automatycznie zmniejszana o 1 (dec ecx ),
a sama petla 'LOOP' wykonuje sie do mometu gdy ECX bedzie = 0.
ECX=ZERO jes warunkiem zakonczenia petli zainicjowanej przy pomocy instrukcji LOOP .
zauważ że u ciebie ten warunek nigdy nie jest spelniony, bo juz po pierwszym przejsciu przez
petle pozostaje ci w rejestrze EAX wartosc = 1. Po drugim przejsciu ponownie rejestr ECX zostaje
zmniejszony o 1 automatycznie... no i ty go ponownie dodatkowo zmniejszasz 'recznie' ....
wiec po drogim przejsciu przez petle masz w ECX wartosc minus jeden, rejestr przewija sie ponownie
caly i ..... dlugo nie bedzie spelnial warunku zakonczenia petli LOOP


co do glosow, ze problem w zle wyzerowanym rejestrze Ah czy Al ...
Fakt ze metoda zerowania jest niezbyt dobra ale na tym etapie szybkosc wykonywania sie kodu mysle,
ze mozesz pominac smialo ..... ale na pewno wywolaniwe przerwania int 16 masz poprawne i musi dzialac .
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Elektronika, programowanie niskopoziomowe Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.13868 sekund, zapytan = 9
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |