Определить количество символов в последней строке текстового файла - Assembler

Узнай цену своей работы

Формулировка задачи:

Определить количество символов в последней строке текстового файла Результат и саму строку показать на экране. Записать строку в новый файл. Вот что я написал в итоге. Чтобы узнать последнюю строку с конца файла я двигаюсь и проверяю на конец строки 0A. Только проблема у меня в этом самом месте. В отладчике она бесконечно в цикле двигается и не выходит. А значит не проходит сравнение, а почему я не понимаю. Вот сам код с комментариями TASM
Листинг программы
  1. .386
  2. dseg segment use16
  3. text1 db 14,11,'File Open: ',0Dh,0Ah,'$'
  4. text2 db 13,10,'Result..: $'
  5. text3 db 14,11,'Next file: $'
  6. text4 db 13,10,'Error cr: $'
  7. Buf db ? ;для изначального файла
  8. Buf1 db ? ; для работы внутри файла
  9. handle dw ?; буфер логического номера файла
  10. handle2 dw ?; буфер 2 логического номера файла
  11. pathname db 'myfile2.asm', 0 ; путь к файлу
  12. fName db 'myfile.asm',0 ;путь ко 2 файлу ,новому
  13. dseg ends
  14. cseg segment use16
  15. assume cs:cseg,ds:dseg
  16. m1:
  17. mov cx,dseg
  18. mov ds,cx
  19. ;-------------------
  20. ;Происходит открытие файла
  21. mov al,0
  22. lea dx,fname
  23. mov ah,3Dh
  24. int 21h
  25. jc error ; ошибка открытия файла (CF=1)
  26. mov ah,09h
  27. lea dx,text1
  28. int 21h ;вывод сообщения что файл открылся
  29. mov handle,ax
  30. ;--------------------
  31. ;Чтение байтов из файла
  32. lea dx,buf
  33. mov bx,handle
  34. mov cx,0FFh
  35. mov ah,3Fh
  36. int 21h
  37. ;--------------------
  38. ;Смещаю указатель на конец файла
  39. ;Первый раз на -1
  40. mov bx,handle
  41. mov al,2
  42. mov cx,0FFFFh
  43. mov dx,0FFFFh
  44. mov ah, 42h
  45. int 21h
  46. mov bx,handle
  47. mov cx,1
  48. lea dx,buf1
  49. mov ah, 3Fh
  50. int 21h
  51. xor bh,bh ;счетчик сколько байтов в строке
  52. inc bh
  53. cmp buf1,0Ah
  54. jne short m2 ;если сравнение не дало результата
  55. jmp short m3
  56. ;-----------------------------
  57. ;Теперь указатель смещаю на два и буду считывать по 1 байту.
  58. m2:
  59. mov bx,handle
  60. mov al,1
  61. mov cx,0FFFFh
  62. mov dx,0FFFEh
  63. mov ah, 42h
  64. int 21h
  65. mov bx,handle
  66. mov cx,1
  67. lea dx,buf1
  68. mov ah, 3Fh
  69. int 21h
  70. inc bh
  71. cmp buf1,0Ah
  72. jne short m2 ; повторяю пока сравнение не дало результата
  73. ;----------------------------------
  74. ;Сравнение прошло успешно, я нашел начало последней строки
  75. ;Считываю в буфер всю строку
  76. m3:
  77. mov bx,handle
  78. mov cx,0FFFFh
  79. lea dx,buf1
  80. mov ah, 3Fh
  81. int 21h
  82. ;-----------------------------------
  83. ;Вывожу на экран результат
  84. ;Сначала количество символов а потом строку
  85. mov ah,0Ah
  86. lea dx,text2
  87. int 21h
  88. mov ah,09h
  89. movzx dx,bh
  90. int 21h
  91. mov ah,0Ah
  92. lea dx,Buf1
  93. int 21h
  94. ;-------------------------------------------------
  95. ;Создаю новый файл
  96. mov ah,0Ah
  97. lea dx, text3 ; сообщение то что началась работа с новым файлом
  98. int 21h
  99. mov ah,3ch
  100. mov cx, 0 ; стандартные атрибуты файла
  101. lea dx, pathname
  102. mov ah, 3ch
  103. int 21h
  104. jc short error ; ошибка создания файла (CF=1)
  105. ;-------------------------------------------------------
  106. ;Запись в новый файл
  107. mov handle2,ax ;сохраняю хэндл второго файла
  108. mov bx,handle2
  109. mov cx,0
  110. lea dx,buf1
  111. mov ah,40h
  112. int 21h
  113. ;-------------------------------------------------------
  114. ;Закрываю файл
  115. mov bx,handle2
  116. mov ah, 3Eh
  117. int 21h
  118. jmp short m4
  119. error:
  120. mov ah,09h ; выводим на экран сообщение об ошибке
  121. lea dx,text4
  122. int 21h
  123. m4:
  124. mov ah, 4ch ; завершаем программу
  125. mov al, 00h
  126. int 21h
  127. cseg ends
  128. end m1
Помогите пожалуйста разобраться.

Решение задачи: «Определить количество символов в последней строке текстового файла»

textual
Листинг программы
  1. ;== FASM code =======================
  2. org 100h
  3. jmp start
  4.  
  5. open      db  13,10,'  File Open:  $'    ; мессаги..
  6. last      db  13,10,'Last String:  $'    ;
  7. size      db  13,10,'String Size:  $'    ;
  8. create    db  13,10,'Create File:  $'    ;
  9. ok        db  'OK! $'                    ;
  10. err       db  'ERROR!',7,'$'             ;
  11.  
  12. myData    db  'myData.txt',0       ; файл с данными
  13. myFile    db  'myFile.txt',0       ; новый файл
  14. buff      db  2048  dup(0)         ; буфер для данных
  15. string    db  80    dup('$')       ; буфер для строки
  16. fSize     dw  0                    ; размер файла
  17.  
  18. start:
  19. ; Файл с данными ==========================================
  20.       mov   dx,open           ;
  21.       call  message           ;
  22.       mov   ax,3d00h          ; Открыть!
  23.       mov   dx,myData         ;
  24.       int   21h               ;
  25.       jc    error             ; ошибка?
  26.       xchg  ax,bx             ; отправляем хэндл в ВХ
  27.       mov   dx,ok             ; мессага OK
  28.       call  message           ;
  29.       mov   ah,3fh            ; Читать содержимое файла,
  30.       mov   dx,buff           ;   ..в файловый буфер
  31.       mov   cx,0ffffh         ;
  32.       int   21h               ;
  33.       mov   [fSize],ax        ; сохраняем размер файла
  34.       mov   ah,3eh            ; Закрываем его!
  35.       int   21h               ;
  36.  
  37. ; Поиск последней строки в буфере =========================
  38.       mov   dx,last           ;
  39.       call  message           ;
  40.       std                     ; DF=1 (читать справа-налево)
  41.       mov   di,buff           ; где искать
  42.       mov   cx,[fSize]        ; длина поиска
  43.       add   di,cx             ; перемещаемся в конец буфера
  44.       push  cx                ; запомним позицию для счётчика
  45.       mov   al,0Ah            ; что искать
  46.       repne scasb             ; ПУСК!
  47.       cld                     ; нашли 0Аh (или СХ=0). сброс DF
  48.       pop   bx                ; расчитываем длину
  49.       sub   bx,cx             ;      ..последней строки
  50.       xchg  cx,bx             ;
  51.       sub   cx,2              ; (коррекция длины)
  52.       mov   [fSize],cx        ; запомним для вывода на экран
  53.       xchg  si,di             ; SI - источник для копирования
  54.       add   si,2              ;
  55.       mov   di,string         ; DI - приёмник строки
  56.       rep   movsb             ; копируем СХ-байт из SI в DI
  57.  
  58. ; Вывод последней строки и её размера на экран ============
  59.       mov   dx,string         ; выводим на экран строку
  60.       call  message           ;
  61.       mov   dx,size           ;
  62.       call  message           ;
  63.       mov   ax,[fSize]        ; выводим на экран длину строки
  64.       mov   bx,10             ;       ..в 10-тичном виде
  65.       call  hex2asc           ;
  66.  
  67. ; Создаём файл и отправляем в него строку =================
  68.       mov   dx,create         ;
  69.       call  message           ;
  70.       mov   ah,3ch            ; Создать!
  71.       mov   cx,20h            ;   ..c атрибутом R/W
  72.       mov   dx,myFile         ;
  73.       int   21h               ;
  74.       xchg  bx,ax             ; дескриптор для записи
  75.       mov   ah,40h            ; Запись в файл!
  76.       mov   cx,[fSize]        ; ..байт для записи
  77.       mov   dx,string         ; что записывать
  78.       int   21h               ;
  79.       mov   ah,3eh            ; Закрыть файл!
  80.       int   21h               ;
  81.       mov   dx,ok             ; мессага ОК!
  82.       call  message           ;
  83.       jmp   exit              ;
  84.  
  85. ; Обработчик ошибки и выход ===============================
  86. error:                        ; (обработчик ошибки)
  87.       mov   dx,err            ;
  88.       call  message           ;
  89. exit:                         ;
  90.       xor   ax,ax             ;
  91.       int   16h               ;
  92.       int   20h               ;
  93.  
  94. ;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
  95. ;------------------------------------------------------------------------
  96. message:                      ;
  97.       mov   ah,9              ; вывод строки на экран
  98.       int   21h               ;
  99. ret                           ;
  100. ;------------------------------------------------------------------------
  101. hex2asc:                 ; Функция переводит числа в символы
  102.    pusha                 ; Вход:  АХ = число, BX = система счисления
  103.    xor   cx,cx           ; Выход: на экране
  104. isDiv:                   ;
  105.    xor   dx,dx           ;
  106.    div   bx              ;
  107.    push  dx              ;
  108.    inc   cx              ;
  109.    or    ax,ax           ;
  110.    jnz   isDiv           ;
  111. isOut:                   ;
  112.    pop   ax              ;
  113.    cmp   al,9            ;
  114.    jle   noHex           ;
  115.    add   al,7            ;
  116. noHex:                   ;
  117.    add   al,30h          ;
  118.    int   29h             ;
  119.    loop  isOut           ;
  120.    popa                  ;
  121. ret                      ;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы