Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 5

Копирование файла

26.09.2010, 00:08. Показов 3671. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Задача следующая: скопировать в выходной файл только четные строки входного файла.
Написал следующий код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    TITLE   Potok
    PAGE    52,72      
    INCLUDE ..\masm\macroio.inc
    INCLUDE ..\masm\dos.inc 
 
DATA   SEGMENT
cr  equ 13
lf  equ 10
nin db     'Введите имя входного файла:',cr,lf,'$'
nout    db     'Введите имя выходного файла:',cr,lf,'$'
ferr    db  'Файл не найден.',cr,lf,'$' 
erout   db  'Выходной файл не создан или не открыт',cr,lf,'$'    
eread   db  'Ошибка чтения',cr,lf,'$'   
ewrite  db  'Ошибка записи',cr,lf,'$'
namebuf db 66,?             ; префикс длины для @GetStr
fname   db 66 dup(0)            ; строка имени файла
f1hand  dw ?                ; номер дескриптора первого файла
f2hand  dw ?                ; номер дескриптора второго файла
input   db 512 dup(?)           ; буфер для обработки текста
output  db 512 dup (?)          ; буфер для обработки текста
nb  dw ?                ; длина текста в буфере
DATA   ENDS
 
PROG   SEGMENT 'CODE'
       ASSUME  DS:DATA,ES:DATA,CS:PROG,SS:SPROG
START:
       MOV     AX,DATA
       MOV     DS,AX
       MOV     ES,AX
; ввод имени и открытие входного файла
readnm: @DispStr nin            ; подсказка для ввода имени вх. файла
    @GetStr namebuf,0       ; ввод имени файла
    @OpenFil fname,0        ; открытие вх. файла
    jnc m1              ; переход, если нет ошибки
 
badf:   @DispStr ferr           ; сообщение об ошибке открытия
    jmp vih             ; выход из программы
 
m1: mov f1hand,AX       ; сохранение номера дескриптора вх. файла
    jnc m10         
    jmp badf
 
m10:    @DispStr nout           ; подсказка на ввод имени вых. файла
    @GetStr namebuf,0       ; ввод спецификации файла
    @MakFil fname,,,new     ; создать выходной файл
    jnc m20         ; нет ошибки создания
    jmp badout          ; переход по ошибке
 
m20:    mov f2hand,AX       ; сохранение номера дескриптора выходного файла
 
m2: mov nb,512          ; задаем длину сектора для чтения
    @Read   input,nb,f1hand     ; читаем 512 байтов
    jnc m3          ; переход, если нет ошибки чтения
 
bread:  @DispStr    eread       ; сообщение об ошибке чтения
    jmp exit            ; и выход из цикла обработки
; обработка и копирование
m3: mov nb,AX           ; фактическое число прочитанных
    cmp AX,0            ; байт, если равно 0,
    je  exit            ; то конец входного файла
    mov CX,AX           ; параметр цикла обработки
    mov si,0            ; обнуление
    mov di,0            ; регистров
m5: mov al,byte ptr input[si]   ; символ из входного буфера в al
    cmp al,cr           ; сравниваем с символом конца строки
    jne L1              ; переход на L1, если не равно
    inc si              ; увеличение si, если равно
L2: mov al,byte ptr input[si]   ; символ четной строки в al
    mov byte ptr output[di],al  ; al в выходной буфер
    inc si              ; увеличение si
    inc di              ; увеличение di
    cmp al,cr           ; сравниваем с символом конца строки 
    jne L2              ; повторение L2, если не равно
    dec si              ; уменьшение si (чтобы не было повторного увеличения)
L1:     inc si              ; увеличение si
    loop m5             ; проверка окончания
; запись обработанного буфера в выходной файл
    @Write  output,di,f2hand    ; запись сектора на диск
    jnc m4              ; переход, если нет ошибки
    @DispStr ewrite         ; вывод сообщения об ошибке
    jmp exit            ; переход на окончание
 
m4: jmp m2              ; возврат на чтение нового сектора
 
exit:   @ClosFil    f1hand      ; закрытие
    @ClosFil    f2hand      ; файлов
    jmp vih         ; на выход из программы
 
badout: @DispStr erout          ; сообщение об ошибке
    jmp vih         ; открытия вых. файла
; выход в DOS
vih:
       @Exit
PROG   ENDS
 
SPROG  SEGMENT STACK   'STACK'
       DB      512 DUP(?)
SPROG  ENDS
 
       END     START
На выходе получаю мусор между строками, причем некоторые строки повторяются по несколько раз. Вроде где-то в цикле обработки буфера код кривой, только вот сам никак не могу понять, что не так.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2010, 00:08
Ответы с готовыми решениями:

TASM. Копирование указанного файла (имена исходного и результирующего файла задаются в командной строке)
Нашел программу, но не смог добиться работы от нее. Описание: Пример программы (в формате DOS COM) копирования файла; имена исходного и...

Копирование файла по кускам
Программно создается файл 'file.txt', в который записывается '11223344556677889900'. Нужно создать 10 файлов с именами FRG0..FRG9, в...

[NASM] Копирование файла в перевёрнутом виде
Имеется работающая программа, копирующая символы из текстового файла in.txt в файл dest.txt Необходимо модифицировать программу так,...

2
22 / 22 / 0
Регистрация: 12.07.2010
Сообщений: 42
26.09.2010, 05:42
Нет установленного масм-а с твоими макросами (macroio.inc и dos.inc), поэтому написал на чем есть, т.е. на фасм-е (переделать походу будет не сложно).
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
FILE_LEN equ    14
N       equ     16
format mz
entry codeseg:main      ;точка входа в программу
segment codeseg         ;сегмент кода
main:
        mov     ax, dataseg
        mov     ds, ax
 
        mov     dx, nin
        mov     bx, sin
        mov     byte [bx], FILE_LEN
        call    input_str
        mov     dx, nout
        mov     bx, sout
        mov     byte [bx], FILE_LEN
        call    input_str
 
        call    open_file
        call    create_file
        xor     di, di
        mov     [wnum], 1       ; первая строка
        mov     [flast], 0
        cld
.next_buf:
        mov     si, buf         ; индекс начала строки (вначале 0)
        call    read_buf
        cmp     ax, cx
        je     .not_last
        mov     cx, ax
        jcxz    .close_and_exit
        inc     [flast]
.not_last:
 
.scanline:
        jcxz    .next_buf
        test    [wnum], 1
        jnz     .nechet         ; иначе четное копируем строку
        mov     di, si
        mov     bx, cx
.chet:
        lodsb
        dec     cx
        cmp     al, 10
        je      .write_substr
        jcxz    .write
        jmp     .chet
.write_substr:
        xchg    di, si
        sub     bx, cx
        xchg    bx, cx
        call    write_buf
        mov     si, di
        mov     cx, bx
.endline:
        inc     [wnum]
        jmp     .scanline
 
.nechet:                ; нечет - пропускаем до конца строки
        lodsb           ; предпологаем что строки только с завершающим 0Ah
        dec     cx
        cmp     al, 10
        je      .endline
        jcxz    .next_buf
        jmp     .nechet
 
.write: mov     si, di
        mov     cx, bx
        call    write_buf
        cmp     [flast], 1
        je      .close_and_exit
        jmp     .next_buf
 
.close_and_exit:
        mov     bx, [f2]
        call    fclose
        mov     bx, [f1]
        call    fclose
        mov     dx, strok
 
@print: mov     ah,9
        int     21h
exit:   xor     ax, ax
        int     16h
        mov     ax,4c00h        ;стандартный выход
        int     21h
 
 
input_str:
        mov     ah, 9
        int     21h
        mov     ah, 10
        mov     dx, bx
        int     21h
        movzx   si, byte [bx+1]
        mov     byte [bx+si+2], 0
        ret
 
open_file:
        mov     dx, sfin
        mov     ax, 3dC0h       ; открытие входного файла
        int     21h
        jc      .err1
        mov     [f1], ax
        ret
.err1:  mov     dx,err1
        jmp     @print
 
create_file:
        mov     dx, sfout
        mov     ah, 3ch       ; открытие выходного файла
        xor     cx, cx
        int     21h
        jc      .err2
        mov     [f2], ax
        ret
.err2:  mov     bx, [f1]
        call    fclose
        mov     dx,err2
        jmp     @print
 
fclose: mov     ah, 3eh ; bx - файловый номер
        int     21h
        ret
 
read_buf:
        push    bx dx
        mov     ah, 3fh         ; чтение буфера из входного файла
        mov     bx, [f1]
        mov     cx, N
        mov     dx, si
        int     21h
        jc      .err3
        pop     dx bx
        ret
.err3:  mov     dx,err3
        jmp     @print
 
write_buf:
        push    bx dx
        mov     ah, 40h
        mov     bx, [f2]
        mov     dx, si
        int     21h
        jc      .err4
        cmp     cx, ax
        ja      .err4
        pop     dx bx
        ret
.err4:  mov     dx,err4
        jmp     @print
 
segment dataseg                 ; сегмент данных
nin     db      'Введите имя входного файла: ',13,10,'$'
nout    db      'Введите имя выходного файла: ',13,10,'$'
err1    db      'Входной файл не найден.$'
err2    db      'Выходной файл не открыт.$'
err3    db      'Ошибка чтения.$'
err4    db      'Ошибка записи.$'
strok   db      13,10,'Ok.$'
flast   db      ?
wnum    dw      ?
len1    dw      ?
len2    dw      ?
f1      dw      ?
sin     db      ?, ?
sfin    rb      FILE_LEN
f2      dw      ?
sout     db      ?, ?
sfout   rb      FILE_LEN
buf     rb      N
 
stack 100h
1
0 / 0 / 0
Регистрация: 12.09.2010
Сообщений: 5
02.10.2010, 07:05  [ТС]
В фасмовском коде разобраться не смог, т.к. не знаком с ним самим и работой с файлами без макрокоманд. Проблему решил, переписав программу с одним циклом и переменной-переключателем, по которой определяется четность строки. Но в любом случае, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2010, 07:05
Помогаю со студенческими работами здесь

Копирование файла из одного каталога в другой
Необходимо взять файл из каталога на флешке и скопировать его в другой каталог на этой же флешке. Как я понимаю функции копирования нет...

Копирование текстового файла - программа не видит файл-источник
есть код, но почему-то не хочет открывать файл какова может быть причина? .486 model small Data SEGMENT use16 ASSUME...

Копирование файла в другой каталог
Доброе времени суток! Обращаюсь к Вами с помощью решить мою проблему с ASM (пока плохо знаком с этим). Условие задачи таков: нужно...

Копирование файла начиная с 20-го байта во второй
Как изменить программу, чтобы она записывала текст из 1го файла во 2ой с 20 байта, при этом не стирая первые 20 байт в 1ом файле? .model...

Копирование определенного текста из файла, копирование и вставка в статичную переменную
Доброго вечера. Делаю программу которая бы выводила погоду на сегодня через данные сайта. Завис на передаче данных с сайта. Как можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru