Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2015, 17:36   #11
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..вроде всё на месте. Проверял его, какую ошибку выдаёт?!
У меня FASM, поэтому протестить не могу. Я бы читал с файла по-байтно и сразу проверял на "перевод каретки", по-ходу записывая считанные байты в память (тебе-же нужно вывести найденные строки на экран). Так-же, и с конца файла справа-налево. Если время будет - набросаю свой вариант...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 24.05.2015, 17:51   #12
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
..вроде всё на месте. Проверял его, какую ошибку выдаёт?!
У меня FASM, поэтому протестить не могу. Я бы читал с файла по-байтно и сразу проверял на "перевод каретки", по-ходу записывая считанные байты в память (тебе-же нужно вывести найденные строки на экран). Так-же, и с конца файла справа-налево. Если время будет - набросаю свой вариант...

Я через досбокс запускаю и файл заполняется тонной непонятных символов, грешу на досбокс, а виртуалки нет и скачать нет возможности.
Спасибо.
V-alterman вне форума Ответить с цитированием
Старый 25.05.2015, 08:49   #13
spolyr
Пользователь
 
Регистрация: 30.03.2015
Сообщений: 17
По умолчанию

исходник который представлен ---

много ошибок, во первых при выделении памяти дается от дос сегмент, а смещение 0 а в программе сегмент и смещение равны, еще при чтении файла ds=dx, потом указатель перемещается в конец файла потом считывается, забав его переместить в начало, я написал товарищу прогу, он оценит и напишет, если что выложит исходник сам

Последний раз редактировалось spolyr; 25.05.2015 в 08:51.
spolyr вне форума Ответить с цитированием
Старый 25.05.2015, 09:53   #14
V-alterman
Пользователь
 
Регистрация: 07.12.2013
Сообщений: 26
По умолчанию

Кстати, вот исходник от spolyr.
Код:
model tiny
;data
dataseg
              len equ 65535
           ; buf db len dup (0)
             siz dw 0
          handle dw 0
            text db 'test.txt',0
        text_tmp db 'test.bak',0
          memory dw 0
             st1 dw 0
             st2 dw 0
       dlina_st2 dw 0
       enter_st2 dw 0

codeseg
.386
org 100h

;start code programm
start:
 pusha
 push ds
 push es

;vedelayem memory segment
;zapros dos memory of paragrafof
 mov ah,4ah
 mov bx,0ffffh
 int 21h

;sgimaem dos memory
 sub bx,0fffh
 sub bx,2
 mov ah,4ah
 int 21h

;vedelayem memory 65k segment
 mov ah,48h
 mov bx,0fffh
 inc bx
 int 21h
 jc memory_er

;segment bloka of memory
 mov [memory],ax

;open file
 mov ax,3d00h
 mov dx,offset text
 int 21h
 jc open_er

 mov [handle],ax

;file read of buf
;adress memory block, segment [memory]
read:
 mov ah,3fh
 mov bx,[handle]
 mov cx,len
 mov dx,[memory]
 mov ds,dx
 xor dx,dx ;adress nashalo v segment s nuly
 int 21h
 jc read_er

 push cs
 pop ds

 mov [siz],ax

;osnova
;ishem pervuy stroku of segment memory
 mov es,[memory]
 xor di,di
 mov al,0dh
 mov cx,[siz]
 cld
 repnz scasb

 mov al,es:[di]
 dec di
 mov ds:[st1],di

;ishem vtorue stroku of segment memory
 mov es,[memory]
 mov di,[siz]

 mov ax,word ptr es:[di-2]
 cmp ax,0a0dh ;enter v konce
 jne dal

 sub di,3
 mov al,es:[di]
 mov [enter_st2],2

dal:
 mov al,0dh
 mov cx,[siz]
 sub cx,[st1]
 sub cx,[enter_st2]
 std
 repnz scasb

 push cs
 pop es

;nashalo stroki st2 v [st2]
;dlina st2 v [dlina_st2]
 add di,3
 mov ds:[st2],di
 mov ax,ds:[siz]
 sub ax,di
 sub ax,[enter_st2]
 mov ds:[dlina_st2],ax

;file close
close:
 mov ah,3eh
 mov bx,[handle]
 int 21h

;;; delaem bak file
 int 3
 mov ah,3ch
 mov cx,20h
 mov dx,offset text_tmp
 int 21h
 mov [handle],ax

 mov ax,[memory]
 mov ds,ax

 mov ah,40h
 mov bx,es:[handle]
 mov cx,es:[dlina_st2]
 mov dx,es:[st2]
 int 21h

 mov ah,40h
 mov bx,es:[handle]
 mov dx,es:[st1]
 mov cx,es:[st2]
 sub cx,es:[st1]
 int 21h

 mov ah,40h
 mov bx,es:[handle]
 mov dx,0
 mov cx,es:[st1]
 int 21h

 mov ah,40h
 mov bx,es:[handle]
 mov dx,es:[siz]
 sub dx,2
 mov cx,es:[enter_st2]
 int 21h

 push cs
 pop ds

 mov ah,3eh
 mov bx,[handle]
 int 21h

;;;;;;;;;;;;;;;;;;;

;exit for dos
exit:
;memory osvobogdaem
 mov ah,49h
 mov es,[memory]
 int 21h

 pop es
 pop ds
 popa

 mov ax,4c00h
 int 21h

;readinf file error
read_er:

 jmp close

;error open file
open_er:

 jmp exit
;error memory vedeleniy
memory_er:

 jmp exit

end start
V-alterman вне форума Ответить с цитированием
Старый 25.05.2015, 16:06   #15
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..хотел сделать чуть-по-другому, но споткнулся об размер файла. Как его вычислить?! Везде пишут, что функция 42h с позицией(0) и AL=2 возвратит размер файла, но у меня возвращает размер кластера, чтоли.. Специально добавил в код процедуру просмотра регистра AX, но всегда получаю 4096 байт.

Планировал читать не весь файл, а только первые и последнии 100 байт, но не могу найти конец файла, чтоб считать последнюю строку. Видимо это из-за NTFS.. Код ниже находит и выводит первую строку, а дальше думал отниму от размера файла 100 байт и обработаю их в обратном порядке.

Видимо, придётся всё-равно читать весь файл и обрабатывать его целиком. Тогда, вычислить размер не проблема, но хотелось-бы обойтись без выделения памяти и сделать всё в одном сегменте.

Код на FASM'e. Рабочий вариант:

Код:
use16
org 100h
jmp start

fName   db  'testFile.txt',0
mErr1   db  'Open ERROR!!! $'
mErr2   db  'Read ERROR!!! $'
mErr3   db  'Write ERROR!!! $'
mGood   db  'File open is successfully..$'
kbyte   db  13,10,'File size: $'
first   db  13,10,10,'First string..: ',13,10,'$'
last    db  13,10,10,'Last string...: ',13,10,'$'
buff1   db  128 dup(?)
buff2   db  128 dup(?)
handle  dw  ?
fSize   dw  ?

start:
;------------------- открываем файл ----------------------------------------------|   
   mov  dx,fName               
   mov  ax,3d02h
   int  21h                   
   jc   error1
   mov  [handle],ax
   mov  dx,mGood              ; сообщение об успешном открытии
   call message

;------------------- вычисляем его размер ----------------------------------------|
   mov  ax,4202
   mov  bx,[handle]
   xor  dx,dx
   xor  cx,cx
   int  21h
   mov  [fSize],ax            ; размер файла должен быть в AX...
   push ax

   mov  dx,kbyte              ; покажем размер файла
   call message
;------------------ HEX/DEX с регистра AX ----------------------------------------|
   pop  ax
   xor  cx,cx
   mov  bx,10
isDiv:
   xor  dx,dx
   div  bx
   push dx
   inc  cx
   or   ax,ax
   jnz  isDiv
isOut:
   pop  ax
   or   al,30h
   int  29h
   loop isOut

;------------------- поиск/запись/вывод первой строки ----------------------------|
   mov  dx,buff1
   call readBuff              ; зовём функцию(3Fh). читаем первые 100 байт

   mov  dx,first              ; выводим сообщение о первой строке
   call message

   cld
   mov  si,buff1              ; скопируем адрес буфера в SI
firstFind:
   lodsb                      ; читаем байт с буфера
   cmp  al,0dh
   je   lastFind
   int  29h                   ; выводим символ на экран
   jmp  firstFind             ; мотаем цикл...

lastFind:
   push si                    ; сохраним кол-во считанных символов (длинна строки)

;------------------- поиск/запись/вывод последней строки -------------------------|
   mov  ax,4201h
   mov  bx,[handle]
   xor  cx,cx
   mov  dx,[fSize-100]        ; 100 байт от конца файла
   int  21h

   mov  dx,buff2
   call readBuff              ; зовём функцию(3Fh). читаем последнии 100 байт

   mov  dx,last               ; сообщение юзеру со-второй строкой
   call message

   std                        ; обратное направление строки
   mov  si,buff2
nextFind:
   lodsb
   cmp  al,0dh
   je   endFind
   int  29h
   jmp  nextFind

endFind:
   push si

;..............................................
;..............................................

;------------------- на выход ----------------------------------------------------|
finish:
   xor  ax,ax
   int  16h
   mov  ax,4C00h
   int  21h

;------------------- различные функции -------------------------------------------|
readBuff:
   mov  ax,3f00h              ; читать из файла
   mov  cx,100                ; кол-во байт(100)
   mov  bx,[handle]
   int  21h
   jc   error2
ret
error1:  ;--------------------; ошибка(1)------------
   mov  dx,mErr1
   call message
   jmp  finish
error2:
   mov  dx,mErr2
   call message
   jmp  finish
message: ;--------------------; вывод сообщений------
   mov  ah,9
   int  21h
ret
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В текстовом файле найти все слова, совпадающие с заданным пользователем и поменять их местами с соседними справа словами ( c# ) CROWN Помощь студентам 4 24.12.2014 15:57
Поменять местами первую и последнюю , вторую и предпоследнюю и т.д цифры числа Kat9 Паскаль, Turbo Pascal, PascalABC.NET 2 22.05.2013 14:35
подпрограмма поменять местами первую и последнюю строки (C#) RIOs Помощь студентам 1 05.07.2012 22:36
Удалить из строки S1 первую, последнюю, все подстроки совпадающие с S2 ТРОЯН=) Паскаль, Turbo Pascal, PascalABC.NET 1 10.12.2008 23:28
Как поменять строки в текстовом файле местами _ares_ Помощь студентам 8 13.11.2007 02:14