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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2015, 22:50   #1
snowmix
Новичок
Джуниор
 
Регистрация: 26.05.2015
Сообщений: 1
По умолчанию программа

помогите написать программу на assembler, под dos Нужно из файла прочитать текст и в этом тексте заменить все пробелы на _ , и записать исправленный текст обратно, либо в другой файл, помогите очень нужно
snowmix вне форума Ответить с цитированием
Старый 27.05.2015, 17:20   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Если файл не слишком большой (до 16kb), то можно читать его по-байтно и подменять символ пробела на подчёркивание, прямо в теле программы. Если при чтении установить кол-во считываемых байт по-максимуму(FFFFh), то в регистре AX получим кол-во реально считанных байт, т.е его размер.

Код FASM:
Код:
use16
org 100h
jmp start

fName   db  'testFile.txt',0
nFile   db  'newFile.txt',0
kByte   db  13,10,'Open file..... OK!  File size: $'
mLine   db  13,10,'===========================================',13,10,10,'$'
buff1   dw  16384 dup(0)      ; буфер в 16kB для приёма файла
handle  dw  ?
fSize   dw  ?

start:
;------------------- открываем исходный файл -------------------------------------|   
   mov  dx,fName               
   mov  ax,3d02h
   int  21h                   
   mov  [handle],ax
;------------------- вычисляем его размер ----------------------------------------|
   mov  ax,3f00h
   mov  cx,0ffffh             ; читать из файла байт (65535)
   mov  bx,[handle]
   mov  dx,buff1
   int  21h
   mov  [fSize],ax            ; в АХ, кол-во действительно считанных байт
   push ax
;------------------- покажем его размер (HEX/DEC с регистра AX) ------------------|
   mov  dx,kByte
   call message               ; мессага с размером

   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  ax,3e00h
   mov  bx,[handle]
   int  21h
   mov  dx,mLine              ; нарисуем линию..
   call message
;------------------ читаем буфер и сразу выводим символы на экран ----------------|
   mov  si,buff1              ; SI указывает на буфер
   mov  cx,[fSize]            ; счётчик символов (длинна файла)
isLoop:
   lodsb                      ; читаем символ с буфера
   cmp  al,' '                ; это пробел?
   jne  noChange              ; если нет - пропускаем символ
   dec  si                    ; если да - возвращаемся на один символ назад
   inc  cx                    ; чтоб не потерять размер - увеличиваем счётчик
   mov  byte[si],'_'          ; пишем в текущую ячейку "подчёркивание"
   loop isLoop                ; мотаем цикл...
noChange:
   int  29h                   ; выводим символы на экран
   loop isLoop

   mov  [fSize],si            ; сохраняем кол-во считанных байт
   xor  si,si                 ; переместим указатель, на начало буфера
;------------------ все символы заменили. создаём новый файл ---------------------|
   mov  ax,3c00h
   mov  dx,nFile
   mov  cx,20h
   int  21h
   mov  [handle],ax
;------------------ пишем в него из буфера ---------------------------------------|
   mov  ax,4000h
   mov  cx,[fSize]
   sub  cx,367                ; отнимем размер исполняемого файла
   mov  bx,[handle]
   mov  dx,buff1
   int  21h
;------------------ закрываем файл -----------------------------------------------|
   mov  ax,3e00h
   mov  bx,[handle]
   int  21h
;------------------- на выход ----------------------------------------------------|
finish:
   xor  ax,ax
   int  16h
   mov  ax,4C00h
   int  21h
;------------------- функциия вывода сообщений -----------------------------------|
message:
   mov  ah,9
   int  21h
ret
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 27.05.2015, 22:12   #3
spolyr
Пользователь
 
Регистрация: 30.03.2015
Сообщений: 17
По умолчанию

а какая разница какой объем файла, так понял надо считать весь файл и заменить один попадающиеся символ на другой, тогда все равно какой объем, конечно ограничимся максимальным в dos , 16bit FAT
spolyr вне форума Ответить с цитированием
Старый 28.05.2015, 05:36   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от spolyr Посмотреть сообщение
а какая разница какой объем файла
..в принципе никакой. Просто, я привёл пример с буфером в своём сегменте (16кб). Топик-стартеру выжен механизм, один вариант из которых приведён выше..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна программа QControl программа для внутрилабораторного контроля качества Версия 5.5. миньен Софт 7 02.03.2014 00:28
Программа на Pascal в Lazarus и программа для одномерного массива целых чисел Yegorka Lazarus, Free Pascal, CodeTyphon 13 20.12.2012 18:02
Программа с применением записей и программа с применение множеств smert99 Помощь студентам 0 16.06.2011 23:14
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09