Почему программа не имеет доступ к файлам? - 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, что может означать успешное открытие файла с данными)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д