Почему программа не имеет доступ к файлам? - Assembler
Формулировка задачи:
файл kyrsova.asm
то что есть в файле katalog.txt сейчас
Computer
Intel
5
5000
Computer
AMD
7
4500
65656
565
55
6
Notebook
HP
7
5300
Monitor
Philips
3
1300
Monitor
Samsung
5
1700
Mouse
Genius
13
100
Mouse
A4Tech
20
250
Keyboard
Genius
15
140
FlashDrive
Kingston 16GB
9
400
Листинг программы
- .model small
- .stack 100h
- .data
- .code
- start:
- mov ax,@data
- mov ds,ax
- get_action: ; Вибір команди меню
- mov di,0
- mov bool_empty,0
- mov del_done,0
- mov action,0
- call print_menu ; Вивід меню
- mov ah,00
- int 16h
- cmp ah,1 ; ESC - завершує роботу програми
- je quit
- cmp al,31h ; 1 - Перегляд вмісту файлу
- je action1
- cmp al,32h ; 2 - Додавання даних до файлу
- je action2
- cmp al,33h ; 3 - Редагування даних в файлі
- je action3
- cmp al,34h ; 4 - Видалення даних з файлу
- je action4
- jmp get_action
- QUIT:
- mov ah,4ch
- int 21h
- ACTION1:
- call view_data
- mov ah,3Eh
- mov bx, handle
- int 21h
- mov action,1
- jmp get_action
- ACTION2:
- call add_data
- mov ah,3Eh
- mov bx, handle
- int 21h
- mov action,2
- jmp get_action
- ACTION3:
- call edit_data
- mov ah,3Eh
- mov bx, handle1
- int 21h
- mov ah,3Eh
- mov bx, handle2
- int 21h
- MOV AH,41H ; видаляєм файл "katalog.txt"
- LEA DX,filename
- INT 21H
- LEA DX,filename1
- MOV AX,@data
- MOV ES,AX ; і перейменовуємо "katalog1.txt" в "katalog.txt"
- Lea DI,filename
- MOV AH,56H
- INT 21H
- jmp get_action
- ACTION4:
- mov action,4
- jmp action3
- include main.txt
- end start
содержание файла main.txt ( на сайт добавлю как вставку asm что б было более читабельно
Листинг программы
- .model small
- .stack 100h
- .data
- ; Структура комп. магазину
- nazv_prod db 30 dup(?) ; Назва товару
- firma_prod db 30 dup (?) ; Фірма виробника
- kilk_st db 10 dup(?) ; Кількість товару
- tsina_za_sh db 10 dup(?) ; Ціна за штуку
- ; Повідомлення для утворення меню
- line1 db 201,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,187,'$'
- line2 db 200,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,188,'$'
- case db 186,' Bu',161,'epi',226,236,255,164,'i',238,': ',186,'$'
- cs1 db 186,' 1 - ',143,'epe',163,171,239,173,'y',226,'u ',226,'o',162,'apu',255,172,'a',163,'a',167,'u',173,'y. ',186,'$'
- cs2 db 186,' 2 - ',132,174,164,'a',226,'u',255,226,'o',162,'ap',255,164,174,255,'c',175,'ucky. ',186,'$'
- cs3 db 186,' 3 - Pe',164,'a',163,'y',162,'a',226,'u',255,162,'i',164,'o',172,'oc',226,'i',255,175,'po',255,226,'o',162,'ap. ',186,'$'
- cs4 db 186,' 4 - Bu',164,'a',171,'u',226,'u',255,226,'o',162,'ap',255,167,'i',255,'c',175,'ucky. ',186,'$'
- csquit db 186,' ESC - Buxi',164,'. ',186,'$'
- cscont db 132,171,239,255,175,'po',164,'o',162,166,'e',173,173,239,255,173,'a',226,'uc',173,'i',226,236,255,161,'y',164,236,'-',239,'ky',255,'k',171,'a',162,'i',232,'y.','$'
- ; Повідомлення і змінні для роботи з файлом
- FileName db "Katalog.txt",0
- FileName1 db "Katalog1.txt",0
- handle dw ?
- handle1 dw ?
- handle2 dw ?
- error1 db 'File not found',10,13,'$'
- error2 db 'Illegal consisting of file',10,13,'$'
- error3 db 'File is empty',10,13,'$'
- error4 db 'Cannot create file',10,13,'$'
- tmp db ?
- buffer db 30 dup(?)
- lline dw (?)
- ; Повідомлення для виведення даних про товар
- msg1 db 141,160,167,162,160,255,226,174,162,160,224,227,': ','$'
- msg2 db 148,105,224,172,160,255,162,168,224,174,161,173,168,170,160,': ','$'
- msg3 db 138,105,171,236,170,105,225,226,236,255,226,174,162,160,224,227,': ','$'
- msg4 db 150,105,173,160,255,226,174,162,160,224,227,': ','$'
- msg5 db '______________________________________________________________________','$'
- ; Повідомлення для додавання даних в файл
- str1 db 130,162,165,164,105,226,236,255,173,160,167,162,227,255,226,174,162,160,224,227,': ','$'
- str2 db 130,162,165,164,105,226,236,255,228,105,224,172,227,255,162,168,224,174,161,173,168,170,160,': ','$'
- str3 db 130,162,165,164,105,226,236,255,170,105,171,236,170,105,225,226,236,255,226,174,162,160,224,227,': ','$'
- str4 db 130,162,165,164,105,226,236,255,230,105,173,227,255,226,174,162,160,224,227,': ','$'
- num_of_key db 4 dup (?)
- bool_empty db ?
- action db ?
- ; Повідомлення для видалення та редагування даних в файлі
- ind db 130,162,165,164,105,226,236,255,105,173,164,165,170,225,': ','$'
- uncorind db 141,165,175,224,160,162,168,171,236,173,168,169,255,105,173,164,165,170,225,10,13,'$'
- index db ?
- index_now db ?
- str_add_done db 132,160,173,105,255,161,227,171,168,255,164,174,164,160,173,105,255,164,174,255,228,160,169,171,227,46,10,13,'$'
- str_edit_done db 132,160,173,105,255,227,255,228,160,169,171,105,255,161,227,171,168,255,162,105,164,224,165,164,160,163,174,162,160,173,105,46,10,13,'$'
- str_del_done db 132,160,173,105,255,161,227,171,168,255,162,168,164,160,171,165,173,105,255,167,255,228,160,169,171,227,46,10,13,'$'
- del_done dw ?
- .code
- print_line proc
- mov ah,09h
- mov dx,lline ; виводить рядок
- int 21h ; який знаходить за адресою lline
- mov ah,02h ; і переносить каретку на наступний рядок
- mov dl,10
- int 21h
- mov ah,02h
- mov dl,13
- int 21h
- ret
- print_line endp
- print_menu proc ; Виведення меню
- lea dx,line1
- mov lline,dx
- call print_line
- lea dx,case
- mov lline,dx ; Змінна lline використ. в ролі параметра
- call print_line ; процедури print_line
- lea dx,cs1
- mov lline,dx
- call print_line
- lea dx,cs2
- mov lline,dx
- call print_line
- lea dx,cs3
- mov lline,dx
- call print_line
- lea dx,cs4
- mov lline,dx
- call print_line
- lea dx,csquit
- mov lline,dx
- call print_line
- lea dx,line2
- mov lline,dx
- call print_line
- mov ah,02h
- mov dl,10
- int 21h
- mov ah,02h
- mov dl,13
- int 21h
- ret
- print_menu endp
Решение задачи: «Почему программа не имеет доступ к файлам?»
textual
Листинг программы
- view_data proc
- ; відкриваємо файл для читання
- mov ax,716ch <---------------------------- а функция открытия на чтение 3Dh
- mov bx,0 ; Тільки читання
- mov cx,0 ; Звичайний файл
- mov dx,1 ; Відкрити існуючий файл
- lea si,Filename
- int 21h
- jc failed_open
- mov handle,ax ; Дескриптор файлу
- mov bool_empty,1
Объяснение кода листинга программы
- Устанавливается функция открытия файла для чтения:
- Имя переменной:
ax
- Значение переменной:
716ch
- Имя переменной:
- Устанавливается режим доступа к файлу (только чтение):
- Имя переменной:
bx
- Значение переменной:
0
- Имя переменной:
- Устанавливается тип файла (звичайный файл):
- Имя переменной:
cx
- Значение переменной:
0
- Имя переменной:
- Устанавливается флаг открытия существующего файла:
- Имя переменной:
dx
- Значение переменной:
1
- Имя переменной:
- Устанавливается адрес имени файла в регистре SI:
- Имя переменной:
si
- Значение переменной:
Filename
- Имя переменной:
- Вызывается прерывание 21h (сервис 3Dh) для открытия файла:
- Успешное открытие файла - JC (Jump if Carry) не происходит
- Имя переменной:
handle
- Дескриптор файла - Имя переменной:
bool_empty
- Флаг пустого файла (устанавливается в 1, что может означать успешное открытие файла с данными)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д