Otwieranie pliku (zakladamy że nazwa jest w ds:dx)
otworz_plik:
mov al,0 ; plik otwieramy do odczytu
mov ah,03dh ; otwieranie istniejącego pliku
int 21h ;wywołanie przerwania otwarcia
jc blad_odczytu ;carry flag ustawione gdy bląd odczytu pliku
ret
blad_odczytu: ;blad otwarcia pliku
mov dx, offset blad_plik ; wypisujemy sobie jakiś komunikat błędu
mov ah,09h
int 21h;
jmp koniec
Po wykonaniu tego kodu w ax mamy uchwyt do pliku. Proponuje go sobie gdzieś na boku zapisać. Deklarujemy sobie w segmencie danych zmienną na to:
uchwyt dw ? ;uchwyt do pliku z danymi
I wykonujemy
mov dx,offset nazwa ;nazwa pliku ma byc w ds:dx
call otworz_plik ; otwiera plik z ds:dx i zwraca uchwyt do ax
mov ds:[uchwyt],ax ;kopiujemy zwrócony uchwyt do zmiennej uchwyt
Czytanie intów:
czytajint:
xor ax,ax ;zerowanie wyniku
czytajznaki:
push ax ;wrzucenie aktualnego wyniku na stos
call czytajplik
cmp ax,0
je koniecn
mov al,ds:[znak]
cmp al,0Dh ; CR
je koniecn
cmp al,24h ;koniec pliku
je koniecn
cmp al,'0'
jb zlyznak
cmp al,'9'
ja zlyznak
sub al,'0' ;wyznaczenie cyfry
mov dl,al ;zapamiętanie cyfry w dl
xor dh,dh ;cyfra zapisana w dx
pop ax ;pobranie aktualnej liczby ze stosu
push bx
mov bl,10
mul bl ;wynik mnożenia al*bl w ax
pop bx
add ax,dx
jmp czytajznaki
koniecn:
pop ax
mov word ptr ds:[n],ax ; zapisujemy wynik w zmiennej 'n'
ret
Gdzie czytajplik to:
czytajplik: ;czyta jeden znak z pliku
push cx ; na wszelki wypadek
mov bx,ds:[uchwyt] ;kopiujemy uchwyt do bx
mov cx,1 ; ile znaków pomieści bufor
mov ah,03fh ;tryb czytania z uchwytu
mov dx, offset znak ; gdzie zapisujemy wczytaną wartość
int 21h ;odczyt do ds:dx -> ds:[znak]
pop cx
ret
Da sie pewnie prościej i krócej ;)