budowa i parametry pliku exe




Kurs Assemblera by Skowik
















var napis=new Array("O","P","E","R","A","C","J","E ","N","A ","P","L","I","K","A","C","H","","");
var kolory=new Array("EE00EE","FF00CC","FF00BB","FF00AA","FF0099",
"FF0077","FF0055","FF0033","FF0055","FF0077",
"FF0099","FF00BB","FF00CC","EE00DD","EE00EE",
"DD00EE","CC00EE","BB00EE","AA00EE");
for(i=0; i< 19; i++)
document.write(napis[i].fontcolor(kolory[i]));


Aby dobrze zrozumieć ten
dział musisz koniecznie zapoznać się ze spisem przerwań DOS'a. Wyjaśnię tutaj
podstawowe funkcje dotyczące tworzenia i zapisu do plików. Na początek
chcemy stworzyć plik. Parametry przerwania 21h są następujące:

CX - atrybuty
DS:DX - adres łańcucha w kodzie asciz zawierającego nazwę pliku
AH = 03Ch





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


03CH

-

-

-

atrybuty pliku

atrybuty pliku

offset adresu łańcucha

offset adresu łańcucha

-

-


Powrót po INT 21H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


Id pliku

Id pliku

-

-

-

-

-

-

-

-Funkcja ta tworzy plik o
danej nazwie,(wymazuje jego poprzednią treść jeżeli istniał), ustala jego
długość w pamięci syskowej na 0 bajtów , otwiera go i daje prawo do
zapisu.Po wywołaniu INT 21h funkcja zwraca w AX uchwyt(identyfikator) pliku.
Jest to jego numer w katalagu potrzebny np. aby zapisać coś do pliku (funkcja
zapisu wymaga podania uchwytu/dojścia/numeru).Kod ASCIZ to normalny ciąg
bajtów zakończony znakiem #0 (NUL) po to, aby system wiedział, gdzie się kończy
łańcuch znaków. Skoro wszystko jasne to stwórzmy sobie plik:

ASSUME CS:KOD,DS:DANE,SS:STOSIK;

STOSIK SEGMENT
dw 100h dup(?)
ENDS

DANE SEGMENT
Plik db 'FILE.TXT',0
DANE ENDS

szczyt label word;

KOD SEGMENT
START:
mov ax,kod
mov cs,ax
mov ax,seg Plik
mov ds,ax
mov dx,offset Plik
mov cx,0
mov ax,stosik
mov ss,ax
mov sp,offset szczyt

mov ah,3ch
int 21h

ZakonczProgram:
mov ax,4C01h
int 21h

KOD ENDS
END START
Gdy uruchomimy program w bieżącym katalogu stworzy się plik
"FILE.TXT". Jednak program nie jest do końca poprawny, bo nie zamyka pliku.
Zamykamy plik funkcją 03Eh przewania 21h z parametrem - uchwytem(identyfikatorem
pliku) w BX.





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


03EH

-

ID pliku

ID pliku

-

-

-

-

-

-


Powrót po INT 21H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


kod błędu

kod błędu

-

-

-

-

-

-

-

-Inną funkcją do tworzenia
pliku na dysku jest funkcja 05BH przerwania 21H. Różni się ona od funkcji 03CH
tym , że funkcja 03CH nie sprawdza przed utworzeniem czy plik o podanej nazwie
istnieje natomiast funkcja 05BH po stwierdzeniu iż dany plik istnieje zakończy
się błedem o numerze 80 i nie wymaże jego poprzedniej zawartości.





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


05BH

-

-

-

atrybuty pliku

atrybuty pliku

offset adresu łańcucha

offset adresu łańcucha

-

-


Powrót po INT 21H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


Id pliku lub kod błędu

Id pliku lub kod błędu

-

-

-

-

-

-

-

Znacznik CF=1 - błądZnacznik CF=0 OK
Po co tworzyć plik jeżeli nic w nim nie
zapiszemy. Teraz będziemy zapisywać coś w tym pliku. Parametry funcji:

BX - uchwyt pliku
CX - ilość bajtów do zapisania
DS:DX - adres bufora zawierającego text, który ma się znaleźć w pliku
AH = 040h





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


040H

-

ID pliku

ID pliku

Liczba bajtów do zapisu

Liczba bajtów do zapisu

-

-

DS:DX

-


Powrót po INT 21H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


Id pliku lub kod błędu

Id pliku lub kod błędu

-

-

-

-

-

-

-

Znacznik CF=1 - błądZnacznik CF=0 OK
Oto program, który tworzy plik, zapisuje
do niego dane, a następnie zamyka go:

ASSUME CS:KOD,DS:DANE,SS:STOSIK;

STOSIK SEGMENT
dw 100h dup(?)
ENDS

szczyt label word;

DANE SEGMENT
Plik db 'FILE.TXT',0
Text db 'Assembler jest super!'
DANE ENDS

KOD SEGMENT
START:

mov ax,kod
mov cs,ax
mov ax,seg Plik
mov ds,ax
mov dx,offset Plik
mov cx,0
mov ax,stosik
mov ss,ax
mov sp,offset szczyt

mov ah,05Bh
int 21h

;teraz AX zawira uchwyt pliku FILE.TXT

;ponieważ seg Plik==seg Text więc
;nie wykonujemy ponownie "mov ax,seg Text;mov ds,ax"

mov bx,ax ;uchwyt idzie do BX
mov dx,offset Text ;offset textu
mov cx,20 ;ile bajtów zapisać
mov ah,40h ;funkcja zapis do dojścia
int 21h ;wywołaj funkcje DOS

mov ah,3eh ;zamknij plik w BX-uchwyt
int 21h ;wywołaj przerwanie DOS z funkcją 3eH

ZakonczProgram:
mov ax,4C01h
int 21h

KOD ENDS
END START
Utwrzony plik możemy otworzyć by coś do niego dopisać lub
coś z niego odczytać.Aby otworzyć istniejący plik należy posłużyć się
funkcją 03Dh przerwania 21H która posiada następujące parametry:

ds:dx - adres łańcucha w kodzie ASCIZ zawierającego nazwę pliku
ah = 03Dh
al = 0 - prawo do odczytu, 1 - prawo do zapisu, 2 - prawo do odczytu i
zapisu





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


03DH

Typ dostępu:0 - prawo do czytania1 - prawo do
pisania2 - prawo do czytania i pisania16 - prawo do
czytania(pełna wyłączność)17 - prawo do pisania(pełna
wyłączność)18 - prawo do czytania i pisania(pełna
wyłączność)

-

-

-

-

-

-

DS:DX - nazwa pliku

-


Powrót po INT 21H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


Id pliku lub kod błędu

Id pliku lub kod błędu

-

-

-

-

-

-

-

Znacznik CF=1 - błądZnacznik CF=0 OK
Funcja zwraca w BX dojście do pliku. W
wypadku, gdy jest błąd znacznik C jest ustawiany, a AX zawiera kod błędu (taką
obsługę ma większość funkcji przerwań - C jest ustawiany, gdy błąd).

ASSUME CS:KOD,DS:DANE,SS:STOSIK;

STOSIK SEGMENT
dw 100h dup(?)
ENDS

szczyt label word;


DANE SEGMENT
Plik db 'C:\AUTOEXEC.BAT',0
Text db 'echo Czesc!',13,10,0 ;znaki 13,10 to ENTER
DANE ENDS ;0 - koniec stringa

KOD SEGMENT
START:

mov ax,kod
mov cs,ax
mov ax,seg Plik
mov ds,ax
mov dx,offset Plik ;adres DS:DX zawiera nazwę pliku
mov cx,0
mov ax,stosik
mov ss,ax
mov sp,offset szczyt

mov ah,3Dh ;funkcja otwórz plik
mov al,2 ;Tryb otwarcia: prawo do odczytu i zapisu
int 21h

;teraz AX zawiera uchwyt pliku AUTOEXEC.BAT

;ponieważ seg Plik==seg Text więc
;nie wykonujemy ponownie "mov ax,seg Text;mov ds,ax"

mov bx,ax ;uchwyt idzie do BX
mov dx,offset Text ;offset textu
mov cx,13 ;ile bajtów zapisać
mov ah,40h ;funkcja zapis do dojścia
int 21h ;wywołaj funkcje DOS

mov ah,3eh ;zamknij plik w BX-uchwyt
int 21h ;


ZakonczProgram:
mov ax,4C01h
int 21h

KOD ENDS
END START
Program nadpisuje to co było na początku pliku (zmienia
zawartość początku pliku)... Aby skoczyć do końca pliku posłużymy się
funkcją przesuwającą wskaźnik w pliku.Dane w pliku zapisywane(odczytywane) są
zawsze tam gdzie znajduje się wskaźnik pliku. Po każdej operacji zapisu i
odczytu wskaźnik jest przesuwany na następny element pliku. Wskaźnik można
przesuwać "ręcznie" w dowolne miejsce pliku, suzy do tego funkcja 042H przewania
21H:

BX - uchwyt pliku
CX:DX - Liczba bajtów przesunąć np. cx=1 dx=5 przesunie wskaźnik
65536*cx+dx=65541
AH = 042h
AL = 0 - liczymy przesunięcie od początku pliku w przód, 1 - od bieżącej
pozycji w przód, 2 - od końca pliku w tył Funkcja zwraca w DX:AX
nową pozycję w pliku. Aby skoczyć do końca pliku robimy tak:

mov bx,Uchwyt
mov cx,0 ;liczymy 0 bajtów od końca pliku
mov dx,0 ;czyli lądujemy na samym końcu pliku
mov ax,4202h ;rownoznaczne z "mov ah,42h;mov al,2h"
int 21h
Aby wrócić z powrotem na początek:


mov bx,Uchwyt
mov cx,0 ;liczymy 0 bajtów od końca pliku
mov dx,0 ;czyli lądujemy na samym końcu pliku
mov ax,4200h ;mov ah,042h ; mov al,00h
int 21h
Dzięki tej funkcji łatwo można policzyć długość
pliku. Po prostu będąc na początku skaczemy na koniec, a po wywołaniu int 21h
para rejestrów DX:AX zawiera długość pliku. Wygląda to tak:


mov bx,Uchwyt
mov cx,0 ;liczymy 0 bajtów od końca pliku
mov dx,0 ;czyli lądujemy na samym końcu pliku
mov ax,4200h ;mov ah,042h ; mov al,00h
int 21h

mov cx,0
mov dx,0
mov ax,4202h ;rownoznaczne z "mov ah,42h;mov al,2h"
int 21h

;teraz w DX:AX mamy długość pliku = 65536*DX+AX
Jeszcze nam została sprawa odczytu z pliku.
Najpierw standartowa funkcja (3fh/21h):

BX - uchwyt (identyfikator)pliku
CX - Liczba bajtów do odczytania
DS:DX - adres bufora do którego ma zostać zapisany odczytany z pliku tekst

AH = 3Fh Po wywołaniu int 21h w buforze mamy potrzebny tekst. No
to czas na program ukazujący działanie na plikach. Poniższy program odczytuje
zawartość pliku "autoexec.bat" i wypisuje ją na ekranie.

ASSUME CS:KOD,DS:DANE,SS:STOSIK;

STOSIK SEGMENT
dw 100h dup(?)
ENDS

szczyt label word;


DANE SEGMENT
Plik db 'C:\AUTOEXEC.BAT',0
Dlugosc dw ? ;długość pliku jeszcze nie znana
Text db 30000 dup ('$') ;tworzy tablicę złożoną
;z 30000 znaków '$'.
;spójrz na funkcje 9h/21h dlaczego "$"

DANE ENDS ;0 - koniec stringa

KOD SEGMENT
START:
mov ax,kod
mov cs,ax
mov ax,seg Plik
mov ds,ax
mov dx,offset Plik ;adres DS:DX zawiera nazwę pliku
mov cx,0
mov ax,stosik
mov ss,ax
mov sp,offset szczyt

mov ax,3d02h ;Funkcja otwarcia pliku do odczytu i zapisu
int 21h
mov bx,ax ;uchwyt idzie do BX i już tam jest CAŁY CZAS

mov cx,0 ;pobierz długość za pomocą przesuwania
mov dx,0 ;wskaźnika w pliku
mov ax,4202h;Funkcja przesuwania wskaźnika do końca pliku
int 21h
mov Dlugosc,ax;długość pliku jest zapisana do rejestru AX

mov cx,0 ;wróć na początek pliku
mov dx,0
mov ax,4200h
int 21h

mov dx,offset Text
mov cx,Dlugosc
mov ah,3fh ;odczytaj z pliku tyle bajtów
int 21h ;ile plik ma od długości

mov ah,3eh ;zamknij plik
int 21h

mov dx,offset Text
mov ah,9h ;napisz zawartość bufora TEXT na ekranie
int 21h

ZakonczProgram:
mov ax,4C01h
int 21h

KOD ENDS
END START
To tyle jeśli chodzi o podstawowe działania na plikach.



var napis=new Array("B","U","D","O","W","A ","P","L","I","K","U ","E","X","E","","","","","");
var kolory=new Array("EE00EE","FF00CC","FF00BB","FF00AA","FF0099",
"FF0077","FF0055","FF0033","FF0055","FF0077",
"FF0099","FF00BB","FF00CC","EE00DD","EE00EE",
"DD00EE","CC00EE","BB00EE","AA00EE");
for(i=0; i< 19; i++)
document.write(napis[i].fontcolor(kolory[i]));


Pliki typu EXE zawierają programy w postaci przemieszczalnej i
muszą być poprzedzone nagłówiem określającym adres punktu startowego programu
oraz wartości przemieszczeń. Typowy plik EXE dla systemu operacyjnego DOS składa
się z następujących części:




OFFSSSET
Rozmiar w bajtach
Zawartość

+0
2
4DH 5AH - symbol pliku typu EXE(sygnatura 'MZ')

+2
2
Długość ostatniej strony

+4
2
Długość programu wraz z nagłówkiem w stronach (po 512B)

+6
2
Liczba elementów w tablicy przemieszczeń

+8
2
Rozmiar nagłówka w paragrafach(po 16B)

+0AH
2
Minimalna ilość pamięci potrzebna do uruchomienia programu(w
paragrafach)

+0CH
2
Maksymalana ilość pamięci ponad program (w paragrafach)

+0EH
2
Przesunięcie segmentu stosu(do ustanienia SS na początek
procesu)

+10H
2
Wartość rejestru SP na początek procesu

+12H
2
Suma kontrolna pliku (negatywna suma wszystkich bajtów)

+14H
2
Wartość rejestru IP na początek procesu

+16H
2
Przesunięcie segmentu CS

+18H
2
Początek tablicy przemieszczeń

+1AH
2
Numer nakładki (0 to moduł bazowy)

+1CH
2
Inne informacje(np. ikona programu w MS-WINDOWS)

[18H]
4*[6H]
Tablica prezmieszczeń w formie
OFFSET-SEGMENT-OFFSET-...-OFFSET-SEGMENT

?
?
Wypełnianie zerami do końca paragrafu

?
?
Początek obrazu programuProgram
wraz ze swoim otoczeniem nosi nazwę procesu. DOS w jednej chwili może wykonywać
tylko jeden proces nierezydentny. Każdy z procesów może wywoływać swój proces
potomy zawieszając jednocześnie swoje działanie. Podczas uruchamiania procesu w
systemie utworzony zostaje przedrostek procesu PSP i ustawiony zostaje adres
bufora roboczego operacji dyskowych DTA na PSP:0080




OFFSSSET
Rozmiar w bajtach
Zawartość

+0
2
adres funkcji zakończenia procesu (CD 20H)

+2
2
Pułap pamięci programu(pierwszy wolny segment)

+4
1
zarezerwowane

+5
5
Dalekie wywołanie procedury obdługującej funkcje systemowe

+0Ah
4
adres procedury obsługi przerwania 22H

+0Eh
4
adres procedury obsługi przerwania 23H

+012h
4
adres procedury obsługi przerwania 24H

+016h
16H
zarezerwowane dla DOS

+02Ch
2
nr środowiska systemowego

+02Eh
2EH
zarezerwowane dla DOS

+05Ch
10H
Blok FCB pierwszego argumentu programu

+06Ch
14H
Blok FCB drugiego argumentu programu

+080h
1H
Długość znaków w parametrach (początek bufora roboczego)

+081h
7FH
Tekst parametrów programu

+100h
?
Początek programuDla programów typu EXE w
rejestrach DS i ES umieszczany jest adres segmentu PSP. Rejestry CS, IP,SS,SP są
ustawiane na podstawie wartości z nagłowka pliku EXE.



var napis=new Array("P","A","R","A","M","E","T","R","Y ","P","L","I","K","U ","E","X","E","","");
var kolory=new Array("EE00EE","FF00CC","FF00BB","FF00AA","FF0099",
"FF0077","FF0055","FF0033","FF0055","FF0077",
"FF0099","FF00BB","FF00CC","EE00DD","EE00EE",
"DD00EE","CC00EE","BB00EE","AA00EE");
for(i=0; i< 19; i++)
document.write(napis[i].fontcolor(kolory[i]));


Po przeczytaniu poprzedniego akapitu wiesz już, że parametry
pamiętane są w prefiksie PSP wykonywanego procesu. Wiadomo, że liczba znaków w
parametrze jest pamiętana pod adresem o przesunięciu 0080H względem początku
PSP, natomiast znaki parametrów o 1 bajt dalej.Do odczytu parametrów z
prefiksu PSP służy funkcja 62H przerwania 21H.





Wywołanie

AH
AL
BH
BL
CH
CL
DH
DL
Bufor
inne


62H

00H

-

-

-

-

-

-

-

-


Powrót po INT 10H


AH

AL

BH

BL

CH

CL

DH

DL

Bufor

inne


-

-

starsza część adresu początku prefiksu PSP

młodsza część adresu początku prefiksu PSP

-

-

-

-

-

-Poniższy fragment kodu
odczytuje parametry programu z prefiksu PSP :
MOV AH, 62H
INT 21H
MOV ES,BX
MOV liczba_znakow_w_parametrze,ES:[0080H]
SUB liczba_znakow_w_parametrze,2;zmniejszamy liczbę znaków o znak entera CR LF
XOR SI,SI
MOV CX,liczba_znakow_w_parametrze;
petla:
INC SI;
MOV znaki parametru,ES:[0081H+SI+1]
Loop petla;
Przykład programu czytającego z parametrów. Poniższy
program odczytuje z parametrów nazwę pliku z muzyczką otwiera ten plik i wygrywa
muzyczkę przez głośniczek.

;podzielniki czestotliwosci

TC equ 34546; 1.19MHz/33Hz
TD equ 30811; 1.19MHz/37Hz
TE equ 27805; 1.19MHz/41Hz
TF equ 25909; 1.19MHz/44Hz
TG equ 23265; 1.19MHz/49Hz
TA equ 20727; 1.19MHz/55Hz
TH equ 18387; 1.19MHz/62Hz
TP equ 1;pauza

;Q00 koniec melodii

kod segment


; *************************************************************
; * Program "Muzyczka" *
; * Autor programu : Rafal Skowronek e-mail:skowik@go2.pl *
; * (c) 2001 wersja 2.3 *
; *************************************************************


assume cs:kod,ss:stosik,ds:dane;logiczne przyporzadkowanie nazw segmentow do segmentow
;przydatne do szukania nazw zmiennych w segmentach



; ******************************************************
; * PROCEDURY *
; ******************************************************
naekran proc
mov ah,09h;Funkcja wypisująca na ekran napis o adresie zawartym w rejestrze DX
int 21h;Wywołanie przerwania DOSa z funkcją 09H
ret;Powrót z procedury
endp

brak_pliku proc
lea dx,napis2;Wpisanie adresu napisu do rejestru DX
call naekran;Wywołanie procedury NaEkran

kbhit: mov ah,0Bh;Funkcja sprawdzająca czy jakikolwiek klawisz został naciśnięty
int 21h;Przerwanie DOS'a z funkcją 0BH
cmp al,0;Porównanie wyniku przerwania z zerem(znakiem pustym)
je kbhit;Jeżeli wynik jest zerem to powróć do etykiety KBHIT
jmp exit;Jeżeli klawisz został naciśnięty to skocz bezwarunkowo do etykiety EXIT

endp

otworz_plik proc Początek procedury
mov ah,3dh; funkcja przerwania 21H otwierajaca plik
mov al,0; otwarcie tylko do czytania
mov dx,offset nazwa; nazwa pliku ktory ma byc otwarty
int 21h; przerwanie
jc brak_pliku;Jeżeli przerwanie zwróciło błąd to skocz do procedury "BREAK_PLIKU"
mov dojscie,ax; zapisanie numeru identyfikatora pliku do zmiennej dojscie
ret ; powrot z procedury
endp; koniec procedury

zamknij_plik proc
mov ah,3Eh; funkcja przerwania 21H zamykajaca plik
mov bx,dojscie; identyfikator pliku ktory ma byc otwarty
int 21h; przerwanie
ret ; powrot z procedury
endp

czytaj_z_pliku proc
push cx; odłuż na stos zawartość rejestru CX
push dx;
mov ah,3Fh; funkcja przerwania 21H czytajaca z pliku
mov bx,dojscie; identyfikator pliku ktory ma byc otwarty
mov cx,3; liczba bajtow do przeczytania
lea dx,bufor;
int 21h; przerwanie
pop dx;
pop cx; zdejmij ze stosu i zapisz zawartość do rejestru CX
ret;
endp;

sound proc
mov ax,ton
mov dx,42h
out dx,al
mov al,ah
out dx,al

;zalaczenie glosnika
mov dx,61h
in al,dx;pobranie zawartosci portu 61h do rejestru AL
or al,00000011B; maska or (ustawienie najmlodszych bitow na 1);
out dx,al;wysłanie zawartości rejestru AL do portu DX
ret
endp

nosound proc
mov dx,61h
in al,dx;pobranie zawartosci portu 61h do rejestru AL
and al,11111100B; maska and (ustawienie najmlodszych bitow na 0);
out dx,al;

ret
endp;

play proc
call sound
push cx;
push dx;
mov cx,czas;ustawianie wiekszej czesci czasu na czas trwania dzwieku
mov dx,0; ustawianie mniejszej czesci czasu na 0
mov ah,86h; funkcja ktora nic nie robi przez CX:DX mikrosekund
int 15h
pop dx;
pop cx;
call nosound
ret
endp

readln proc; odczyt ciagu znakow z klawiatury
mov ah,0ah
int 21h;
ret
endp



;--------------------------------------------------------------------

start: mov ax,dane ;przypisanie wskaznika na segment dane do rejestru AX
mov ds,ax ;przypisanie wartosci AX do rejestru DS
mov ax,stosik ;
mov ss,ax
mov sp,offset szczyt
mov ah,00
mov al,03h
int 10h



mov ah,62h
int 21h
mov es,bx
mov al,es:[0080h]; przekazanie znakow z bufora do al
mov cl,al
mov si,0
dec cl
dec cl
cmp al,2
jbe przepisywanie2
przepisywanie:
mov al,es:[0081h+si+1]; przekazanie znakow z bufora do al


xor ah,ah; zerowanie zmiennej
lea bx,nazwa; w rejestrze bx jest offset zmiennej ;
mov ds:[bx+si],al; przekazanie znaku do zmiennej lancuchowej

cmp cl,0; porownanie rejestru CL z 0
je end_przepisywanie; jesli CL=0 to skocz do etykiety
dec cl; zmniejsz wartosc CL o jeden
inc si; zwieksz SI o 1
jmp przepisywanie;
przepisywanie2:

lea dx,napis1;
call naekran;

lea dx,dl_buf; oblicza offset bufora i zapisuje go do rejestru dx
call readln
mov si,0;
lea bx,ile_znak; bx = offset ile_znak -(adres informacji o ilosci znakow)
mov cx,ds:[bx]; ilosc znakow w buforze
dec cx; ignorowanie entera

przep:
lea bx,buf; bx = offset bufora -(adres informacji o znaku)
mov al,ds:[bx][si]; przekazanie znakow z bufora do al
xor ah,ah; zerowanie zmiennej
lea bx,nazwa; w rejestrze bx jest offset zmiennej liczba10;
mov ds:[bx+si],al; przekazanie znaku do zmiennej lancuchowej

cmp cl,0; porownanie rejestru CL z 0
je end_przepisywanie; jesli CL=0 to skocz do etykiety
dec cl; zmniejsz wartosc CL o jeden
inc si; zwieksz SI o 1
jmp przep;



end_przepisywanie:





end_przepisywanie:


;czyszczenie ekranu
mov ah,00
mov al,03h
int 10h

call otworz_plik;
lea dx,napis
call naekran;


melodia: call czytaj_z_pliku
lea bx,bufor
mov dl,ds:[bx+0];nuty
; koniec melodii
cmp dl,'Q'
je exit
; jesli wcisniety klawisz to zakoncz
mov ah,0Bh
int 21h
cmp al,0
jne exit;

jmp nuty;
exit:
call zamknij_plik;
mov ah,4ch
mov al,00h
int 21h;



nuty: cmp dl,'C'
je do
cmp dl,'D'
je re
cmp dl,'E'
je mi
cmp dl,'F'
je fa
cmp dl,'G'
je so
cmp dl,'A'
je la
cmp dl,'H'
je Zi
mov ton,1

;wprowadzenie oktawy
graj:
lea bx,bufor
mov cl,ds:[bx+1];oktawy
sub cl,30h

shr ton,cl;

lea bx,bufor
mov cl,ds:[bx+2];czasy
sub cl,30h
mov ch,0;
mov czas,cx




call play;
inc si;
jmp melodia;



do: mov ton,TC
jmp graj
re: mov ton,TD
jmp graj
mi: mov ton,TE
jmp graj
fa: mov ton,TF
jmp graj
so: mov ton,TG
jmp graj
la: mov ton,TA
jmp graj
zi: mov ton,TH
jmp graj




kod ends;


dane segment

ton dw 0
czas dw 0
dojscie dw 0

;plik
bufor db 3 dup(0)


;klawiatura
dl_buf db 12; dlugosc bufora
ile_znak db 0;
buf db 12 dup(0);


nazwa db 0,0,0,0,0,0,0,0,0,0,0,0,0; Nazwa pliku zakonczona #0

NAPIS DB '********************',10,13,'* MUZYCZKA Z PLIKU *',10,13,'********************','$';
napis1 DB 'Wpisz nazwe pliku z muzyka (*.DAT) : ',10,13,'$' ;
Napis2 db ' Plik nie istnieje !!!$';

dane ends

stosik segment ;Poczatek segmentu stosu
dw 100h dup(0) ;wypelnienie przestrzeni 100h slowami (16 bitowymi )o wartosci 0

szczyt label word ;
stosik ends ; koniec segmentu stosik

end start












Strona utworzona przez(c)2001-2


Wyszukiwarka

Podobne podstrony:
Dysk twardy budowa parametry konfiguracja
Budowa fizyczna i parametry techniczne
budowa fizyczna i parametry techniczne komputerow przenosnych
Budowa, sposób działania i podstawowe parametry dysków twardych
Ćwiczenie 4 3 Budowa pliku wsadowego Windows
budowa lunety?lowniczej
Budowa robotow dla poczatkujacych budrob
Makroskopowa budowa mięśnia
Budowanie wizerunku firmy poprzez architekturę
Budowa Linuxa rfc1350
1 parametry technniczne wymiary tablic zal nr1id?43

więcej podobnych podstron