Asembler - długość pliku. 8086

0

Jak poradzić sobie ze zliczaniem długości pliku bajt po bajcie, gdy plik jest większy niż 65 KB? Rejestry są 16-bitowe i mogą pomieścić liczby z zakresu 0-65535. Większej wartości w tym rejestrze umieścić się nie da. Chodzi mi o to, jak działać na rejestrach i liczbach, które są większe niż 65535. Mógłby ktoś pomóc?

1

A co to za problem w drugim rejestrze (albo w pamięci) zliczać ile razy licznik się "przekręcił"? W ten sposób masz już 32 bity więc pliki po 4GB. Jak dodasz jeszcze jeden poziom to będzie 48 bitów. Gdzie jest problem?

0

A tak wyprzedzając kolejne pytania, o odczyt danych:
Czyli przerwanie int 21h z wartoscia 3FH w ah.

W przypadku, gdy chcesz odczytać więcej niż te 64kB możesz przemieścić wskaźnik pliku:
przerwanie int 21h z wartoscia 42 w ah oraz w cx,dx nowy wskaźnik.

0

A.
Do przechowywania liczb 32-bitowych można użyć dwóch rejestrów (typowo - starsze 16 bitów w DX, młodsze 16 - w AX) albo rejestru i pamięci (starsza część w pamięci, młodsza w rejestrze).
Przydatne będą instrukcje ADC (przy dodawaniu) i SBB (przy odejmowaniu).

Przykładowo, jeśli 32-bitowa liczba jest w rejestrach DX:AX, to można ją zwiększyć o 1 tak:

inc ax
adc dx, 0

adc (add carry) dodaje flagę przeniesienia. Czyli jeżeli inc ax się „przekręciło”, to nadmiarowy bit trafia do flagi C. instrukcją adc dodajemy ją do DX.

B.
Jeżeli programu ma działać na procesorze 386 lub nowszym, to pomimo tego, że program jest 16-bitowy, można używać 32-bitowych rejestrów (EAX, EBX itd.)

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