 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
tyczka Gość
|
Wysłany: Pon Wrz 21, 2009 4:14 pm Temat postu: [FASM] Nie kończąca sie pętla |
|
|
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
|
Wysłany: Pon Wrz 21, 2009 4:52 pm Temat postu: |
|
|
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 |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
|
| Powrót do góry |
|
 |
VirtManx5
Dołączył: 26 Cze 2010 Posty: 21
|
Wysłany: Pon Lip 05, 2010 3:58 pm Temat postu: |
|
|
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 |
|
 |
marcinnowicki
Dołączył: 22 Sty 2011 Posty: 1
|
Wysłany: Sob Sty 22, 2011 2:04 pm Temat postu: Re: [FASM] Nie kończąca sie pętla |
|
|
| 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 |
|
 |
|
|
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
|