0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 3
1

Замена символа с определённой позицией в файле

12.10.2013, 21:55. Показов 2784. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается заменить символ в файле с определённой позицией на цифру "8". Также почему-то не устанавливается атрибут скрытого файла.

TASM, DOS, EXE, 16-разрядная программа.

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
STACKSEG    SEGMENT PARA    STACK   'STACK' 
    db  256 dup (?) 
STACKSEG    ENDS 
 
DATA    SEGMENT 
    STRING      db  'Name Surname, Group',cr,lf ;Строка для записи в файл 
    STRINGLN    equ $-string        ;Ее длина 
    HANDLE      dw  ?               ;Ячейка для дескриптора 
    FNAME       db  'NAME.LAB',0    ;Имя файла в формате ASCIIZ 
    BUFF        db  80  dup (?)
    STDOUT      equ 1
    CR          EQU 0Dh     ;Возврат каретки 
    LF          EQU 0Ah     ;Перевод строки 
DATA    ENDS 
 
TEXT    SEGMENT 'CODE' 
ASSUME  CS:TEXT,DS:DATA,SS:STACKSEG
MAIN    PROC 
    MOV     AX,DATA 
    MOV     DS,AX 
;Создадим файл 
    MOV     AH,3Ch              ;Функция создания файла 
    MOV     CX,02h              ;атрибут скрытности
    MOV     DX,OFFSET FNAME     ;Адрес имени файла 
    INT     21h 
    MOV     HANDLE,AX           ;Сохраним дескриптор файла 
;Запишем строку в файл 
    MOV     AH,40h              ;Функция записи
    MOV     BX,HANDLE           ;Дескриптор 
    MOV     CX,STRINGLN         ;Длина строки 
    MOV     DX,OFFSET STRING    ;Адрес строки 
    INT     21h 
;Закроем файл 
    MOV     AH,3Eh          ;Функция закрытия 
    MOV     BX,HANDLE       ;Дескриптор 
    INT     21h 
;Откроем снова, прочитаем, выведем в консоль содержимое
    MOV     AX,3D00h                ;Функция открытия файла
    MOV     DX,offset FNAME
    INT     21h                 ;вызовем прерывание
;Магия
    MOV     BX,AX
    XOR     CX,CX
    XOR     DX,DX
    MOV     HANDLE,AX           ;пихнём хендлер
    MOV     AX,4200h
    INT     21h
;Читаем файл
    MOV     AH,3fh              ;Функция чтения
    MOV     BX,HANDLE           ;пихаем дескриптор
    MOV     CX,80               ;Читаем строчку
    MOV     DX,offset BUFF      ;Читаем в буфер
    INT     21h
    MOV     CX,AX
;Выводим на экран
    MOV     AH,40h              ;Функция записи на экран
    MOV     BX,STDOUT           ;Выводим в STDOUT
    MOV     DX,offset BUFF
    INT     21h
;Замена пятого эл-та на восьмёрку
;Ткнём указатель на пятый байт
    MOV     AH,42h
    MOV     AL,00       ;переместить к началу файла + CX:DX
    MOV     BX,HANDLE
    MOV     CX,0h
    MOV     DX,4        ;пятый байт
    INT     21h
;Пишем 8 на нужную позицию
    MOV     AH,40h              ;Функция записи
    MOV     BX,HANDLE           ;Дескриптор 
    MOV     CX,1    ;символ занимает один байт
    MOV     DX,38h  ;30h - ascii-код ноля, добавляем ещё 8
    INT     21h 
;Прочитаем с 3 по 10 байт, и выведем в консольку
;Ставим указатель
    MOV     AH,42h      ;функция чтения
    MOV     AL,00
    MOV     BX,HANDLE
    MOV     CX,0
    MOV     DX,2        ;указатель на 2 байт
    INT     21h
;Читаем в буфер
    MOV     AH,3Fh
    MOV     BX,HANDLE
    MOV     CX,8        ;читаем 8 байт
    MOV     DX,offset BUFF
    INT     21h
    MOV     CX,AX
;Выводим в stdout
    MOV     AH,40h
    MOV     BX,STDOUT
    MOV     DX,offset BUFF
    INT     21h
;Закрываем файло
    MOV     AH,3Eh          ;Функция закрытия 
    MOV     BX,HANDLE       ;Дескриптор 
    INT     21h 
;Ждём нажатия эникея
    MOV     AX,0C07h
    INT     21h
;Завершим программу 
EXIT:
    MOV     AX,4C00h    ;Функция завершения, код 
    INT     21h 
MAIN    ENDP 
TEXT    ENDS 
END MAIN
Да, код, конечно, убог. Но больше всего интересует, как правильно сделать запись восьмёрки вместо пятого элемента в файле.

В задании сказано "Записи в режиме прямой адресации в файл на место элемента 5 цифры 8"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2013, 21:55
Ответы с готовыми решениями:

Замена первого символа в определённой строке INI-файла
Надо менять первый символ в 3 строке. Было вообще супер, если бы в начале показывалась надпись:...

Добавление строк из TComboBox1/TListBox1 в TListBox2 с определённой позицией
Приветствую, надо организовать добавление выделенной строки из TComboBox1 в TListBox1 методом...

Замена символа в файле
Есть текстовый файл. Необходимо считать и заменить все пробелы на * и записать это в другой файл....

Замена символа в файле
Добрый вечер, хотел понять как правильно заменять символ в файле. Есть такой вариант, однако он...

5
578 / 375 / 69
Регистрация: 29.03.2013
Сообщений: 790
14.10.2013, 08:46 2
Цитата Сообщение от random123 Посмотреть сообщение
;Пишем 8 на нужную позицию
MOV AH,40h ;Функция записи
MOV BX,HANDLE ;Дескриптор
MOV CX,1 ;символ занимает один байт
MOV DX,38h ;30h - ascii-код ноля, добавляем ещё 8
INT 21h
DX должен указывать на буфер, из которого записываешь в файл. А ты в него символ запихал.

А если проверять CF после вызова int 21h, то ошибки легче отлавливать.
1
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 3
14.10.2013, 20:27  [ТС] 3
Изначально так и делал, но всё равно не работает.

В датасегменте:
Assembler
1
    BUFF2       db  '8'
соответственно код поправлен:
Assembler
1
2
3
4
5
6
;Пишем 8 на нужную позицию
    MOV     AH,40h              ;Функция записи
    MOV     BX,HANDLE           ;Дескриптор 
    MOV     CX,1    ;символ занимает один байт
    MOV     DX,offset BUFF2
    INT     21h
Восьмёрка как не писалась, так и не пишется. Флаги проверять, честно говоря, не умею, с дебаггером тоже лишь в общих чертах знаком (ну уж пошагово выполнить и значения регистров смотреть умею).
0
578 / 375 / 69
Регистрация: 29.03.2013
Сообщений: 790
15.10.2013, 08:17 4
строка 38
Assembler
1
    MOV     AX,3D00h                ;Функция открытия файла
открытие в режиме "только чтение", а ты с этим хендлом пытаешся запись провернуть.

PS: Подружись с отладчиком, Turbo Debugger 4.0 прост и удобен (помоему самая малогючная версия). Почти все функции INT 21h при ошибке устанавливают флаг переноса (CF=1), возвращая при этом в AX код ошибки, ориентируясь на который проще искать её причину.
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
15.10.2013, 22:00 5
Argogo, и что работает?
0
578 / 375 / 69
Регистрация: 29.03.2013
Сообщений: 790
16.10.2013, 07:39 6
Лучший ответ Сообщение было отмечено как решение

Решение

AFP, да. Вот целиком, правда со вставками, которые помогли быстро локализовать проблему:
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
STACKSEG    SEGMENT PARA    STACK   'STACK' 
        db  256 dup(?)
STACKSEG    ENDS
 
cr  EQU 0Dh ;Возврат каретки 
lf  EQU 0Ah ;Перевод строки 
 
;====================================================================================== 
DATA    SEGMENT 
    STRING      db  'Name Surname, Group',cr,lf ;Строка для записи в файл 
    STRINGLN    equ $-string            ;Ее длина 
    HANDLE      dw  ?               ;Ячейка для дескриптора 
    FNAME       db  'NAME.LAB',0            ;Имя файла в формате ASCIIZ 
    BUFF        db  80  dup (?)
    BUFF2       db  '8'
    MsgIoError  db  'DOS-Error.', cr, lf, 'Error Code: 0x','$'
    MsgIp       db  ' at IP=0x', '$'
    MsgCrLf     db  cr, lf, '$'
    STDOUT      equ 1
DATA    ENDS 
;======================================================================================
mJcc    MACRO
    LOCAL   skip
    jnc skip
    call    @@error
skip:
    ENDM
    ;-------
;======================================================================================
TEXT    SEGMENT 'CODE' 
ASSUME  CS:TEXT, DS:DATA, SS:STACKSEG
MAIN    PROC
    MOV     AX, DATA 
    MOV     DS, AX 
 
;Создадим файл 
    MOV AH, 3Ch              ;Функция создания файла 
    MOV CX, 02h              ;атрибут скрытности
    MOV DX, OFFSET FNAME     ;Адрес имени файла 
    INT 21h
    mJcc
    MOV HANDLE, AX           ;Сохраним дескриптор файла 
 
;Запишем строку в файл 
    MOV AH, 40h              ;Функция записи
    MOV BX, HANDLE           ;Дескриптор 
    MOV CX, STRINGLN         ;Длина строки 
    MOV DX, OFFSET STRING    ;Адрес строки 
    INT 21h
    mJcc
 
;Закроем файл 
    MOV AH,3Eh          ;Функция закрытия 
    MOV BX,HANDLE       ;Дескриптор 
    INT 21h 
    mJcc
 
;Откроем снова, прочитаем, выведем в консоль содержимое
    MOV     AX,3D02h                ;Функция открытия файла
    MOV     DX,offset FNAME
    INT     21h                 ;вызовем прерывание
    mJcc
    MOV     HANDLE,AX           ;пихнём хендлер
 
; Файл только открыт, операций чтения-записи не производилось, поэтому указатель указывает на начало файла
;   MOV     BX, AX
;   XOR     CX, CX
;   XOR     DX, DX
;   MOV     AX, 4200h
;   INT     21h
 
;Читаем файл
    MOV AH, 3fh              ;Функция чтения
    MOV BX, HANDLE           ;пихаем дескриптор
    MOV CX, 80               ;Читаем строчку
    MOV DX, offset BUFF      ;Читаем в буфер
    INT 21h
    mJcc
 
    MOV CX, AX
;Выводим на экран
    MOV     AH, 40h              ;Функция записи на экран
    MOV     BX, STDOUT           ;Выводим в STDOUT
    MOV     DX, offset BUFF
    INT     21h
    mJcc
 
;Замена пятого эл-та на восьмёрку
;Ткнём указатель на пятый байт
    MOV AH, 42h
    MOV AL, 00       ;переместить к началу файла + CX:DX
    MOV BX, HANDLE
    MOV CX, 0
    MOV DX, 4        ;пятый байт
    INT 21h
    mJcc
 
;Пишем 8 на нужную позицию
    MOV     AH, 40h              ;Функция записи
    MOV     BX, HANDLE           ;Дескриптор 
    MOV     CX, 1    ;символ занимает один байт
    MOV     DX, offset BUFF2
    INT     21h
    mJcc
 
;Прочитаем с 3 по 10 байт, и выведем в консольку
;Ставим указатель
    MOV     AH,42h      ;функция чтения
    MOV     AL,00
    MOV     BX,HANDLE
    MOV     CX,0
    MOV     DX,2        ;указатель на 2 байт
    INT     21h
    mJcc
 
;Читаем в буфер
    MOV     AH, 3Fh
    MOV     BX, HANDLE
    MOV     CX, 8        ;читаем 8 байт
    MOV     DX, offset BUFF
    INT     21h
    mJcc
 
    MOV CX, AX
;Выводим в stdout
    MOV AH, 40h
    MOV BX, STDOUT
    MOV DX, offset BUFF
    INT 21h
    mJcc
 
;Закрываем файло
    MOV AH, 3Eh          ;Функция закрытия 
    MOV BX, HANDLE       ;Дескриптор 
    INT 21h
    mJcc
 
;Ждём нажатия эникея
    MOV     AX, 0C07h
    INT     21h
 
;Завершим программу 
EXIT:
    MOV AX, 4C00h    ;Функция завершения, код 
    INT 21h
 
@@error:
    ;
    ; SS:SP указывает на строку после команды 'call', которая следовала за
    ; вызовом INT 21h, завершившимся ошибкой
    ;
    mov dx, offset MsgIoError
    call    StrOut
    call    DumpWord
 
    mov dx, offset MsgIp
    call    StrOut
    pop ax
    sub ax, 7   ; 3 байта на call, 2 байта на jnc @F и  2 байта на int 21h
    call    DumpWord
 
    mov dx, offset MsgCrLf
    call    StrOut
    
    mov ax, 4cffh
    int 21h
 
StrOut:
    push    ax
    mov ah, 9
    int 21h
    pop ax
    ret
 
DumpWord:
    xchg    al, ah
    call    DumpByte
    xchg    al, ah
    call    DumpByte
    ret
 
DumpByte:
    push    ax
    push    cx
    mov cl, 4
    mov ah, al
    shr al, cl
    call    DumpNibl
    mov al, ah
    call    DumpNibl
    pop cx
    pop ax
    ret
 
DumpNibl:
    push    ax
    push    dx
    and al, 0fh
    cmp al, 9
    jbe @@skip_add
    add al, 7
@@skip_add:
    add al, 30h
    mov dl, al
    mov ah, 2
    int 21h
    pop dx
    pop ax
    ret
 
MAIN    ENDP
TEXT    ENDS
    END MAIN
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2013, 07:39
Помогаю со студенческими работами здесь

Замена последнего символа в файле
Добрый день. Помогите мне, пожалуйста. Программа должна заменять последний символ файла на...

Замена символа на перенос строки в txt файле
Я не программист. Нашел в интернете для себя скрипт написанный на VBS. Суть его замена символа на...

Замена нескольких строк в файле начиная с найденой строки до определённого символа
Добрый день, Есть фаил в котором многа строк, например блабла1 блабла2 блабла3 * есть...

Замена символа "!" в txt-файле
Друзья, есть файл txt, полученный после выгрузки из Teradata с помощью SQL Assistant (не знаю,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru