Jak sprawdzićw asmie czy nastąpił koniec pliku?
Tak samo jak w innych językach.
Jeśli w pętli odczytujesz n bajtów, to jeśli funkcja odczytująca zwróci liczbę < n to masz koniec.
A jeśli nie odczytujesz i chcesz sprawdzić, czy wewnętrzny kursor jest na końcu to porównaj aktualną pozycję z rozmiarem pliku.
Te sposoby, które mi podałeś wykorzystują długość plików, a ja mniej więcej <ort>chcĘ</ort> zrobić tak
1.Wczytuj znak
2.Jeżeli znak to koniec pliku to THE END
3.Jeżeli nie to idź na początek
Problem jest tylko z określeniem jaki znak odpowiada za koniec pliku. W C++ było to EOF.
Jak w C++ wykorzystujesz do tego EOF no to sorry... Po co to nie wiem.
Normalnie robi się to tak:
while (ile = ReadFile(...))
{//tu obsłuż odczytane dane
}
Więc w Assemblerze zrób tak samo.
Read:
call ReadFile ;zwróci liczbę odczytanych bajtów
or al,al ;test, czy al == 0
jz KoniecPliku
call DoSomethingWithData
jmp Read
KoniecPliku:
call DoSomethingElse
Ale skąd mam wiedzieć, że właśnie natrafiłem na koniec pliku??? Muszę porównać:
cmp znak, koniecpliku
Ale jaką wartość ma stała koniecpliku?
Nie nie nie!!
Nie ma czegoś takiego jak znak końca pliku (pomijam pliki tekstowe, dla których jest to wartość 0x1b).
Po prostu funkcja, która odczytuje dane z pliku zwraca ile bajtów wczytała. I teraz jeśli każesz jej odczytać 1 bajt, to ona będzie zwracała wartość 1 aż dojdzie do końca pliku i wtedy zwróci wartość 0. I Ty właśnie porównujesz z zerem to, co ta funkcja zwróci. Jak 0 to koniec pliku.
Nie ma czegoś takiego jak znak końca pliku (pomijam pliki tekstowe, dla których jest to wartość 0x1b)
hmpf myślałem, że nie tylko tekstowe :-)
Co to znaczy, że przerwanie zwróci aktualną pozycję pliku w DX:AX? To w końcu w DX czy AX?
Co to znaczy, że przerwanie zwróci aktualną pozycję pliku w DX:AX? To w końcu w DX czy AX?
Rejestry AX i DX są 16-to bitowe. Gdyby pozycja w pliku zwracana była tylko w jednym z nich to maksymalną wielkością pliku byłoby 216 = 65536 bajtów.
Natomiast max. wielkość pliku to 232 = 4GB. A to dlatego, że pozycja zwracana jest jako liczba 32 bitowa. Starsze 16 bitów w DX a młodsze w AX. Więc wielkość (pozycja) pliku obliczysz tak:
Pozycja = DX*216+AX
A dlaczego ci co wymyślali przerwania nie użyli do tego rejestru 32-bitowego, np. EAX?
A dlaczego ci co wymyślali przerwania nie użyli do tego rejestru 32-bitowego, np. EAX?
Ech... bo wtedy procesory były 16-to bitowe i nie było takich rejestrów.
Poczytaj historię komputerów bo widzę, że brakuje Ci podstaw.