Assembler - pobieranie danych z pliku

0

Witam.
Muszę napisać program w języku Assembler, który odtwarza dźwięk, zaś nuty i oktawa zapisana jest w pliku. Samo odtwarzanie dźwięku nie jest problemem. Jednak nie bardzo czuję się z plikami. Chciałbym w pliku umieści coś takiego:

C 2093
D 2349
E 2637

Chciałbym aby mój program pobierał te dane i wykorzystywał oktawę do odtworzenia dźwięku. Jednak mam problem z pobraniem danej z pliku do pamięci tak aby była to liczba. Jestem trochę zielony w kwestii Assemblera. Znam podstawowe operacje, ale to mnie odrobinę przerasta. Nie proszę o kod, a o podpowiedź w jaki sposób mógłbym ten problem rozwiązać.
Pozdrawiam.

dodanie znacznika <code> - fp

1

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 ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1