Само задание-Определить количество символов в последней строке текстового файла Результат и саму строку показать на экране. Записать строку в новый файл. Вот что я написал в итоге. Чтобы узнать последнюю строку с конца файла я двигаюсь и проверяю на конец строки 0A. Только проблема у меня в этом самом месте. В отладчике она бесконечно в цикле двигается и не выходит. А значит не проходит сравнение, а почему я не понимаю. Вот сам код с комментариями TASM
Код:
.386
dseg segment use16
text1 db 14,11,'File Open: ',0Dh,0Ah,'$'
text2 db 13,10,'Result..: $'
text3 db 14,11,'Next file: $'
text4 db 13,10,'Error cr: $'
Buf db ? ;для изначального файла
Buf1 db ? ; для работы внутри файла
handle dw ?; буфер логического номера файла
handle2 dw ?; буфер 2 логического номера файла
pathname db 'myfile2.asm', 0 ; путь к файлу
fName db 'myfile.asm',0 ;путь ко 2 файлу ,новому
dseg ends
cseg segment use16
assume cs:cseg,ds:dseg
m1:
mov cx,dseg
mov ds,cx
;-------------------
;Происходит открытие файла
mov al,0
lea dx,fname
mov ah,3Dh
int 21h
jc error ; ошибка открытия файла (CF=1)
mov ah,09h
lea dx,text1
int 21h ;вывод сообщения что файл открылся
mov handle,ax
;--------------------
;Чтение байтов из файла
lea dx,buf
mov bx,handle
mov cx,0FFh
mov ah,3Fh
int 21h
;--------------------
;Смещаю указатель на конец файла
;Первый раз на -1
mov bx,handle
mov al,2
mov cx,0FFFFh
mov dx,0FFFFh
mov ah, 42h
int 21h
mov bx,handle
mov cx,1
lea dx,buf1
mov ah, 3Fh
int 21h
xor bh,bh ;счетчик сколько байтов в строке
inc bh
cmp buf1,0Ah
jne short m2 ;если сравнение не дало результата
jmp short m3
;-----------------------------
;Теперь указатель смещаю на два и буду считывать по 1 байту.
m2:
mov bx,handle
mov al,1
mov cx,0FFFFh
mov dx,0FFFEh
mov ah, 42h
int 21h
mov bx,handle
mov cx,1
lea dx,buf1
mov ah, 3Fh
int 21h
inc bh
cmp buf1,0Ah
jne short m2 ; повторяю пока сравнение не дало результата
;----------------------------------
;Сравнение прошло успешно, я нашел начало последней строки
;Считываю в буфер всю строку
m3:
mov bx,handle
mov cx,0FFFFh
lea dx,buf1
mov ah, 3Fh
int 21h
;-----------------------------------
;Вывожу на экран результат
;Сначала количество символов а потом строку
mov ah,0Ah
lea dx,text2
int 21h
mov ah,09h
movzx dx,bh
int 21h
mov ah,0Ah
lea dx,Buf1
int 21h
;-------------------------------------------------
;Создаю новый файл
mov ah,0Ah
lea dx, text3 ; сообщение то что началась работа с новым файлом
int 21h
mov ah,3ch
mov cx, 0 ; стандартные атрибуты файла
lea dx, pathname
mov ah, 3ch
int 21h
jc short error ; ошибка создания файла (CF=1)
;-------------------------------------------------------
;Запись в новый файл
mov handle2,ax ;сохраняю хэндл второго файла
mov bx,handle2
mov cx,0
lea dx,buf1
mov ah,40h
int 21h
;-------------------------------------------------------
;Закрываю файл
mov bx,handle2
mov ah, 3Eh
int 21h
jmp short m4
error:
mov ah,09h ; выводим на экран сообщение об ошибке
lea dx,text4
int 21h
m4:
mov ah, 4ch ; завершаем программу
mov al, 00h
int 21h
cseg ends
end m1