[ Pobierz całość w formacie PDF ]
rejestru BX, więc ciągle w nim jest uchwyt do pliku i nie muszę tego uchwytu zapisywać do pamięci.
A teraz kod:
(przeskocz na_male.asm)
; Program zamienia wszystkie litery w podanym pliku z wielkich na male.
;
; Autor: Bogdan D.
; kontakt: bogdandr (at) op (dot) pl
;
; nasm -O999 -o na_male.com -f bin na_male.asm
; fasm na_male.asm na_male.com
org 100h
start:
mov dx, info
mov ah, 9
int 21h
mov ax, 3d02h ; otwórz do odczytu i zapisu,
; zabroń wszystkim dostępu
mov dx, plik ; adres nazwy pliku
int 21h
jnc otw_ok
call plik_blad ; uruchamiamy tą procedurę, gdy wystąpił błąd
jmp zamk_ok ; jeśli nie udało się nam nawet otworzyć
; pliku, to od razu wychodzimy z programu.
otw_ok:
mov bx, ax ; zapisujemy uchwyt do pliku
mov bp, 400h ; BP = rozmiar bufora.
czytaj:
mov ah, 3fh ; funkcja czytania
104 Bogdan Drozdowski
2007-11-12 Język asembler dla każdego Bogdan Drozdowski
; BX = uchwyt
mov dx, bufor ; adres bufora, dokąd czytamy
mov cx, bp ; kilobajt - rozmiar bufora
int 21h ; odczyt
jnc czyt_ok
call plik_blad ; uruchamiamy tą procedurę, gdy wystąpił błąd
czyt_ok:
xor di, di ; DI będzie wskaznikiem do bufora.
; Na początku go zerujemy.
cmp ax, cx ; Czy ilość bajtów odczytana (AX) =
; = ilość żądana (CX) ?
jne przy_eof ; jeśli nie, to plik się skończył
zamiana:
mov dl, [bufor+di] ; wczytujemy znak z bufora do DL
cmp dl, "A"
jb znak_ok
cmp dl, "Z"
ja znak_ok
or dl, 20h ; jeśli okazał się wielką literą, zamieniamy
; go na małą
mov [bufor+di], dl ; i zapisujemy w miejsce,
; gdzie poprzednio był
znak_ok:
inc di ; przechodzimy do innych znaków
loop zamiana ; aż przejdziemy przez cały bufor
; (CX=BP=400h)
mov dx, ax ; DX = ilość przeczytanych bajtów
mov ax, 4201h ; idz do ... od pozycji bieżącej.
; aby zapisać zmienione litery,
; musimy przejść
; się w pliku o 1 kilobajt wstecz.
; Do CX:DX wpisujemy odległość
neg dx ; DX = -DX
; dec cx ; CX po wyjściu z pętli jest zerem,
; więc wykonanie DEC zrobi z niego -1.
mov cx, 0ffffh ; CX = -1
; CX:DX = -DX = -ilość przeczytanych bajtów
; BX = uchwyt
int 21h ; wykonujemy przeskok w pliku
jnc idz_ok
call plik_blad
idz_ok: ; po udanym przeskoku
mov dx, bufor ; DX = adres bufora, skąd będziemy brać dane
; do zapisania
; BX = uchwyt
mov ah, 40h ; funkcja zapisz
mov cx, bp ; CX = BP = 400h = długość bufora.
int 21h ; zapisujemy
jmp short czytaj ; i idziemy czytać nową partię danych.
Bogdan Drozdowski 105
Bogdan Drozdowski Język asembler dla każdego 2007-11-12
przy_eof: ; gdy jesteśmy już przy końcu pliku.
; xor di, di ; DI już = 0 (wcześniej to zrobiliśmy)
mov bp, ax ; BP = ilość przeczytanych znaków
mov cx, ax ; CX = ilość przeczytanych znaków
zamiana2:
mov dl, [bufor+di] ; pobieramy znak z bufora do DL
cmp dl, "A"
jb znak_ok2
cmp dl, "Z"
ja znak_ok2
or dl, 20h ; jeśli okazał się wielką literą,
; zamieniamy go na małą
mov [bufor+di], dl ; i zapisujemy w miejsce,
; gdzie poprzednio był
znak_ok2:
inc di ; przechodzimy do innych znaków
loop zamiana2 ; aż przejdziemy przez cały bufor
; (CX = BP = ilość bajtów)
mov dx, bp
; dec cx ; CX po wyjściu z pętli jest zerem, więc
; wykonanie DEC zrobi z niego -1.
mov cx, 0ffffh ; CX = -1
; CX:DX = -DX
mov ax, 4201h ; idz do ... od pozycji bieżącej.
neg dx ; DX = -DX.
; CX:DX = -DX = -ilość przeczytanych bajtów
; BX = uchwyt
int 21h ; wykonujemy przeskok w pliku
jnc idz_ok2
call plik_blad
idz_ok2: ; po udanym przeskoku
mov dx, bufor ; zapiszemy do pliku resztę danych.
; DX = adres bufora.
; BX = uchwyt
mov cx, bp ; CX = ilość bajtów uprzednio odczytancyh
mov ah, 40h ; funckja zapisu do pliku
int 21h ; zapisujemy
jnc zamk ; gdy nie ma błędu, to zamkniemy plik
call plik_blad
zamk:
mov ah, 3eh
; BX = uchwyt
int 21h ; zamykamy nasz plik
jnc zamk_ok
call plik_blad
zamk_ok:
mov ax, 4c00h
int 21h ; wyjście...
106 Bogdan Drozdowski
2007-11-12 Język asembler dla każdego Bogdan Drozdowski
plik_blad: ; procedura wyświetla informację o tym, że
; wystąplił błąd i wypisuje numer tego błędu
push ax
push bx
mov dx, blad_plik
mov bx, ax
mov ah, 9
int 21h
mov ax, bx
call pl
pop bx
pop ax
ret
pl: ; procedura wypisuje liczbę (4 znaki szesnastkowe)
mov bx, ax
shr ax, 12
call pc2
mov al, bh
and al, 0fh
call pc2
mov al, bl
shr al, 4
and al, 0fh
call pc2
mov al, bl
and al, 0fh
call pc2
ret
pc2:
;we: AL - cyfra hex
;wy: pisze cyfrę, niszczone ax
cmp al, 9
mov ah, 0eh
ja hex
or al, "0"
jmp short pz
hex:
add al, "A"-10
pz:
int 10h
ret
bufor: times 400h db 0 ; bufor wielkosci 1 kilobajta
;plik: times 80 db 0
plik db "aaa.txt",0 ; nazwa pliku
info db "Program zamienia wielkie litery w pliku na male.",10,13,"$"
Bogdan Drozdowski 107
Bogdan Drozdowski Język asembler dla każdego 2007-11-12
input1 db "Podaj nazwe pliku do przetworzenia: $"
zla_nazwa db 10,13,"Zla nazwa pliku.$"
blad_plik db 10,13,"Blad operacji na pliku. Kod: $"
Ten program chyba nie był za trudny, prawda? Cała treść skupia się na odczytaniu paczki bajtów, ewentualnej
ich podmianie i zapisaniu ich w to samo miejsce, gdzie były wcześniej.
[ Pobierz całość w formacie PDF ]