funkcja 42h przerwania 21

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

To wiem jaką ma składnie, ale dokładnie jak się to używa. Gdy robię coś takiego

Kopiuj
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

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

cx:dx offset ze znakiem, cx starsze słowo co tam masz?

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

czy ja pisałem po chińsku?

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

więc ta linijka mov dx, -1 jest mi nie potrzebna tak?

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

teraz gdy zrobię coś takiego

Kopiuj
 

    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

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

To wiem jaką ma składnie

nie sądzę

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

to jest od początku pliku

Kopiuj
 
  MOV BX, AX
  MOV AH, 42h
  MOV AL, 0
  MOV CX, 0
  MOV DX, 20
  INT 21h 

a od końca?

Kopiuj
  MOV BX, AX
  MOV AH, 42h
  MOV AL, 2
  MOV CX, 0
  MOV DX, -2
  INT 21h 
Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

i plik pewnie rośnie o 64 kB

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

nawet więcej :)

Kopiuj
  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

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

udało mi się to zrobić

Kopiuj
  
  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?

Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

Zobacz co masz w dx:ax

Q8
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.