This repository was archived by the owner on Oct 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathio.asm
More file actions
391 lines (294 loc) · 7.31 KB
/
Copy pathio.asm
File metadata and controls
391 lines (294 loc) · 7.31 KB
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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
; Модуль загрузки и сохранения из/в файл
model small
.stack 100h
.data
buffer_size equ 1600
buffer dw buffer_size, ?, buffer_size dup(?) ; Буффер
result_exists db 0
handle1 dw 0 ; Дескриптор файла 1
handle2 dw 0 ; Дескриптор файла 2
file_length equ 50 ; Длинна вводимого пути файлов
input_file db file_length, ?, file_length dup(0)
output_file db file_length, ?, file_length dup(0)
result_file db 12 dup(0) ; Temp файл для хранения результата
file_input_str db 'Input filename: ',10,13,'$'
file_error_str db 'Error while processing file. ;-(',10,13,'$'
error1_str db 10,13,'Error while processing file',10,13,'$'
error2_str db 10,13,'Path not found',10,13,'$'
error3_str db 10,13,'Too much opened files',10,13,'$'
error4_str db 10,13,'Permission denied',10,13,'$'
.code
.486
extrn work:near
extrn print_no_result:near
extrn rand:near
extrn seed:word
public flush
public buffer
public io_file_read
public io_file_save
public io_result_true
public io_result_false
public print_result
; =============== Загрузка строк из файла ===============
io_file_read proc near
call flush
; Создаем temp файл
; он будет создан в текущей директории (./)
mov result_file[0], "."
mov result_file[1], "/"
mov ah, 5Ah
lea dx, result_file
mov cx, 02h ; Скрытый файл (⌐■_■)
int 21h
mov bx, ax
mov ah, 3Eh
int 21h
lea dx, file_input_str
mov ah, 9
int 21h
lea dx, input_file
mov ah, 0ah
int 21h
mov si, 1
; Удаляем enter, иначе файл не будет обработан
io_file_read_remove_enter:
inc si
cmp input_file[esi], 0Dh
jne io_file_read_remove_enter
mov input_file[esi], 0h
xor si, si
mov ax, 3d00h ; Открываем для чтения
lea dx, input_file ; DS:DX указатель на имя файла
add dx, 2
int 21h ; В ax деcкриптор файла
jc io_file_error ; Если поднят флаг С, то ошибка открытия
mov handle1, ax ; Сохраняем указатель файла
mov bx, handle1
xor cx, cx
xor dx, dx
mov ax, 4200h
int 21h ; Идем к началу файла
lea dx, buffer
lea si, buffer ; Нужно для lodsb
io_file_read_loop:
mov ah, 3fh ; Будем читать из файла
mov cx, 1 ; 1 байт
int 21h
cmp ax, cx ; Если достигнут EoF или ошибка чтения
jnz io_file_read_close ; То закрываем файл
lodsb
cmp al, 0Dh
je io_file_read_work ; Конец строки
mov ax, 4200h
inc dx
jmp io_file_read_loop
io_file_read_work:
; Сохраняем дескриптор к стеке
push handle1
call work
; Восстанавливаем нужное место
pop bx
lea dx, buffer
lea si, buffer
; Пропускаем 0Ah (CL/RF)
dec dx
dec si
jmp io_file_read_loop
io_file_read_close: ; Закрываем файл, после чтения
mov result_exists, 1
mov ah, 3eh
mov bx, handle1
int 21h
; Самостоятельно записываем 0Dh,
; иначе обработка не найдет конец строки
mov ax, 000Dh
mov [esi], eax
call work
ret
io_file_read endp
; =============== Сохранение файла ===============
io_file_save proc near
cmp result_exists, 0 ; Проверяем, есть ли результат
je print_result_error
lea dx, file_input_str
mov ah, 9
int 21h
lea dx, output_file
mov ah, 0ah
int 21h
mov bx, 1
io_file_save_remove_enter:
inc bx
cmp output_file[ebx], 0Dh
jne io_file_save_remove_enter
mov output_file[ebx], 0h
mov ah, 3Ch ; Функция DOS 3Ch (создание файла)
lea dx, output_file
add dx, 2
xor cx, cx ; Нет атрибутов - обычный файл
int 21h
jc io_file_error
mov handle1, ax
mov ax, 3d00h
lea dx, result_file
int 21h
mov handle2, ax
io_file_save_process:
; Считали
mov ah, 3Fh
mov cx, 1
mov bx, handle2
lea dx, buffer
int 21h
cmp ax, cx ; Если достигнут EoF или ошибка чтения
jc io_file_save_close ; То закрываем файл
; Записали
mov ah, 40h
mov cx, 1
mov bx, handle1
int 21h
jmp io_file_save_process
io_file_save_close:
; Закрыли все файлы
mov ah, 3eh
mov bx, handle1
int 21h
mov ah, 3eh
mov bx, handle2
int 21h
ret
io_file_save endp
; =============== Ошибка обработки файла ===============
io_file_error:
call process_error
ret
process_error proc
cmp ax, 3
je error2
cmp ax, 4
je error3
cmp ax, 5
je error4
error1:
mov ah, 9h
lea dx, error1_str
int 21h
ret
error2:
mov ah, 9h
lea dx, error2_str
int 21h
ret
error3:
mov ah, 9h
lea dx, error3_str
int 21h
ret
error4:
mov ah, 9h
lea dx, error4_str
int 21h
ret
process_error endp
; =============== Сохранение и выгрузка результата ===============
io_result_true proc near
call io_result_open
lea dx, buffer
mov buffer[0], 31h
call io_result_write
ret
io_result_true endp
io_result_false proc near
call io_result_open
lea dx, buffer
mov buffer[0], 30h
call io_result_write
ret
io_result_false endp
io_result_open:
mov ax, 3D01h ; Открываем для записи
lea dx, result_file
int 21h
mov bx, ax
mov ax, 4202h
xor dx, dx
xor cx, cx
int 21h
ret
io_result_write:
mov ah, 40h ; Функция DOS 40h (запись в файл)
mov cx, 1
int 21h
mov ah, 3Eh ; Закрытие файла
int 21h
ret
; =============== Вывод результата на экран ===============
print_result proc near
cmp result_exists, 0 ; Проверяем, есть ли результат
je print_result_error
mov ax, 3d00h ; Открываем для чтения
lea dx, result_file ; DS:DX указатель на имя файла
int 21h
mov handle1, ax
print_result_loop:
mov ah, 3Fh ; Чтение из файла
mov cx, 1
mov bx, handle1
mov dx, buffer[0]
int 21h
cmp ax, cx ; Если достигнут EoF или ошибка чтения
jc print_result_close ; То закрываем файл
mov ah, 9
; Помещаем в конец считанной строки символ конца строки ($),
; иначе при выводе не будет найден конец и будет выведена
; куча мусора из памяти
mov esi, "$"
mov [edx+1], esi
int 21h ; Вывод
jmp print_result_loop
print_result_error:
call print_no_result
ret
print_result_close:
mov ah, 3eh
mov bx, handle1
int 21h
ret
print_result endp
; =============== Очистка результата ===============
flush proc near
mov result_exists, 0
; Удаляем temp файл
mov ah, 41h
lea dx, result_file
int 21h
xor si, si
mov cx, 12
flush_result:
mov result_file[si], 0h
inc si
loop flush_result
mov cx, buffer_size
xor si, si
flush_buffer:
mov buffer[si], 03h
inc si
loop flush_buffer
mov cx, file_length
mov si, 2
flush_input_file:
mov input_file[si], 0h
inc si
loop flush_input_file
mov cx, file_length
mov si, 2
flush_output_file:
mov output_file[si], 0h
inc si
loop flush_output_file
ret
flush endp
exit:
ret
end