Jak użyć tej funkcji 42h aby sprawdzić jaki jest ostatni znak pliku? (używam nasma)
Potrzebny później do przeglądnięcia całego pliku w pętli czytając go znak po znaku.
funkcja 42h przerwania 21
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
To wiem jaką ma składnie, ale dokładnie jak się to używa. Gdy robię coś takiego
mov ah, 3dh
mov dx, nazwa ;czytanie pliku
mov al, 2
int 21h
jc blad
mov bx, ax ;uchwyt
mov ah, 42h ;ustawienie wskaźnika
mov al, 2
mov dx, -1
int 21h
jc blad
mov ah, 3fh
mov cx, 1
mov dx, 1
int 21h
jc blad
mov ah, 40h
mov cx, 1
mov dx, bufor
int 21h
jc blad
mov ah, 3eh
int 21h
po takiej operacji powstaje mi ogromny plik zawierający same śmieci
- Rejestracja: dni
- Ostatnio: dni
cx:dx offset ze znakiem, cx starsze słowo co tam masz?
- Rejestracja: dni
- Ostatnio: dni
W al mam ustawienie wskaźnika na koniec pliku. A dx, -1 (według specyfikacji może być ujemny) przesuwam się wstecz o jeden znak i go czytam w następnej instrukcji, i o to mi tu chodzi czy to jest poprawne.
- Rejestracja: dni
- Ostatnio: dni
czy ja pisałem po chińsku?
- Rejestracja: dni
- Ostatnio: dni
więc ta linijka mov dx, -1 jest mi nie potrzebna tak?
- Rejestracja: dni
- Ostatnio: dni
teraz gdy zrobię coś takiego
mov ah, 3dh
mov dx, nazwa
mov al, 2
int 21h
mov bx, ax
mov ah, 42h
mov al, 2
;mov dx, -1
int 21h
push cx
mov ah, 42h
mov al, 0
int 21h
pop cx
petla:
push cx
mov ah, 3fh
mov cx, 1
mov dx, bufor
int 21h
xor byte [bufor], 0ffh
mov ah, 40h
mov cx, 1
mov dx, bufor
int 21h
pop cx
loop petla
mov ah, 3eh
int 21h
nic nie pomaga
- Rejestracja: dni
- Ostatnio: dni
To wiem jaką ma składnie
nie sądzę
- Rejestracja: dni
- Ostatnio: dni
to jest od początku pliku
MOV BX, AX
MOV AH, 42h
MOV AL, 0
MOV CX, 0
MOV DX, 20
INT 21h
a od końca?
MOV BX, AX
MOV AH, 42h
MOV AL, 2
MOV CX, 0
MOV DX, -2
INT 21h
- Rejestracja: dni
- Ostatnio: dni
i plik pewnie rośnie o 64 kB
- Rejestracja: dni
- Ostatnio: dni
nawet więcej :)
MOV BX, AX
MOV AH, 42h
MOV AL, 2
MOV CX, 0
MOV DX, 0
INT 21h
w AX mam wielkość pliku ale jak ją przerzucę do cx i wykonam pętle (po drodze przestawiam znacznik na początek pliku), to otrzymuje już miejszy plik ale dalej za duży
- Rejestracja: dni
- Ostatnio: dni
udało mi się to zrobić
MOV BX, AX
MOV AH, 42h
MOV AL, 2
MOV CX, -1
MOV DX, -1
INT 21h
ale nic z tego nie będzie ponieważ gdy znajdę ostatni znak w pliku to nie znaczy że ten znak nie będzie gdzieś wcześniej i może nie przeglądnąć całego pliku jest inny sposób aby przejrzeć cały plik?
- Rejestracja: dni
- Ostatnio: dni
Zobacz co masz w dx:ax
- Rejestracja: dni
- Ostatnio: dni
Napisałem o tym wyżej ale zrobię to w inny sposób, funkcja 3fh zwraca w rejestrze AX 0 gdy doszło się do końca pliku i to już wystarczy